Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }