public static bool IsMovePossible(GameBoard gameBoard, SnakeAction actionS, SnakeAction lastMoveS, bool real, out Element newHead) { var action = (int)actionS & 0x0F; var lastMove = (int)lastMoveS & 0x0F; newHead = new Element(-1, -1); //180 degrees switch (gameBoard.HeadType) { case BoardElement.HeadUp: if (action == (int)SnakeAction.Down) { return(false); } break; case BoardElement.HeadLeft: if (action == (int)SnakeAction.Right) { return(false); } break; case BoardElement.HeadRight: if (action == (int)SnakeAction.Left) { return(false); } break; case BoardElement.HeadDown: if (action == (int)SnakeAction.Up) { return(false); } break; case BoardElement.HeadEvil: switch (lastMove & 0x0F) { case (int)SnakeAction.Up: if (action == (int)SnakeAction.Down) { return(false); } break; case (int)SnakeAction.Left: if (action == (int)SnakeAction.Right) { return(false); } break; case (int)SnakeAction.Right: if (action == (int)SnakeAction.Left) { return(false); } break; case (int)SnakeAction.Down: if (action == (int)SnakeAction.Up) { return(false); } break; } break; case BoardElement.HeadDead: return(false); } //over field newHead = gameBoard.Head.MakeMovement(actionS, gameBoard.Size); if (newHead.X == -1) { return(false); } //stones newHead.type = gameBoard.Board[newHead.X, newHead.Y]; if (newHead.type == BoardElement.StartFloor || newHead.type == BoardElement.Wall) { return(false); } if (gameBoard.EvilTicks == 0 && gameBoard.MyLength < 5 && newHead.type == BoardElement.Stone) { return(false); } //enemies if (Lists.IsEnemyHead(newHead.type) || (Lists.IsEnemyBody(newHead.type) && Helpers.IsNear(gameBoard, newHead.X, newHead.Y, Lists.enemyHeads))) { var enemyAgro = newHead.type == BoardElement.EnemyHeadEvil || Helpers.IsNear(gameBoard, newHead.X, newHead.Y, BoardElement.EnemyHeadEvil); //--правила для головы-- //Если текущая змейка не в ярости, а вражеская в ярости - то текущая змейка умирает. if (gameBoard.EvilTicks == 0 && enemyAgro) { return(false); } //Если обе змейки в ярости или обе не в ярости - то от каждой отрезаем длину другой змейки. //То есть, если столкнулись две змейки длиной в 5 и в 7 единиц, то змейка длиной в пять погибает, так как 5-7<2, а змейка длиной в 7 принимает длину 2 единицы. else if ((gameBoard.EvilTicks != 0) == enemyAgro) { var(headLength, tailLength, _) = EnemyDetector.GetEnemyShake(gameBoard, newHead.X, newHead.Y); if (gameBoard.MyLength - (headLength + tailLength + 1) < 2) { return(false); } } } else if (Lists.IsEnemyBody(newHead.type) || Lists.IsEnemyTail(newHead.type)) { if (gameBoard.EvilTicks == 0) { return(false); } } return(true); }
internal static long GetElementRate(GameBoard gameBoard, ref Element newHead) { //---tails--- if (Lists.IsEnemyHead(newHead.type) || (Lists.IsEnemyBody(newHead.type) && Helpers.IsNear(gameBoard, newHead.X, newHead.Y, Lists.enemyHeads))) { //---head--- var enemyAgro = newHead.type == BoardElement.EnemyHeadEvil || Helpers.IsNear(gameBoard, newHead.X, newHead.Y, BoardElement.EnemyHeadEvil); //--правила для головы-- //Если текущая змейка в ярости, а вражеская нет - то убиваем вражескую змейку. if (gameBoard.EvilTicks > 0 && !enemyAgro) { return(1000); } //Если обе змейки в ярости или обе не в ярости - то от каждой отрезаем длину другой змейки. //То есть, если столкнулись две змейки длиной в 5 и в 7 единиц, то змейка длиной в пять погибает, так как 5-7<2, а змейка длиной в 7 принимает длину 2 единицы. else if ((gameBoard.EvilTicks != 0) == enemyAgro) { var enemy = EnemyDetector.GetEnemyShake(gameBoard, newHead.X, newHead.Y); return((enemy.headLength + enemy.tailLength + 1) * 10); } } switch (newHead.type) { //---enemy--- case BoardElement.EnemyTailEndDown: case BoardElement.EnemyTailEndLeft: case BoardElement.EnemyTailEndUp: case BoardElement.EnemyTailEndRight: case BoardElement.EnemyTailInactive: case BoardElement.EnemyBodyHorizontal: case BoardElement.EnemyBodyVertical: case BoardElement.EnemyBodyLeftDown: case BoardElement.EnemyBodyLeftUp: case BoardElement.EnemyBodyRightDown: case BoardElement.EnemyBodyRightUp: //Если таковые имеются, то тогда проверяем, а текущая змейка находится под таблеткой ярости или нет: //4.1.Если да - тогда от вражеской змейки отгрызаем всё от хвоста до места куся. var enemy = EnemyDetector.GetEnemyShake(gameBoard, newHead.X, newHead.Y); return((enemy.tailLength + 1) * 10); //---me--- case BoardElement.TailEndDown: case BoardElement.TailEndLeft: case BoardElement.TailEndUp: case BoardElement.TailEndRight: case BoardElement.TailInactive: case BoardElement.BodyHorizontal: case BoardElement.BodyVertical: case BoardElement.BodyLeftDown: case BoardElement.BodyLeftUp: case BoardElement.BodyRightDown: case BoardElement.BodyRightUp: return(-100); //---other--- case BoardElement.None: return(1); case BoardElement.Stone: return(gameBoard.EvilTicks > 0 ? 4 : (gameBoard.MyLength > 2 ? -100 : -1000)); case BoardElement.Apple: return(2); case BoardElement.Gold: return(11); case BoardElement.FuryPill: return(3); // default: return(long.MinValue); } }