示例#1
0
        public Move GetNextMove(GameBoardState gameBoardState)
        {
            //===========================
            // Your snake logic goes here
            //===========================

            var mySnake = gameBoardState.GetSnake(_mySnakeId);

            Console.Title = $"Alive: {mySnake.IsAlive} Direction: {mySnake.Direction}";

            if (mySnake.IsAlive)
            {
                var occupiedCells = gameBoardState.GetOccupiedCells();

                // Check possible moves in random order.

                var nearestFood = gameBoardState.GetFood()
                    .OrderBy(x => x.DistanceTo(mySnake.Head, gameBoardState.BoardSize()))
                    .Select(x => (PointDTO?)x)
                    .FirstOrDefault();

                if (nearestFood != null)
                {
                    Console.WriteLine("Food at {0}, {1}", nearestFood?.X, nearestFood?.Y);

                    var bestMove = moves
                        .Select(x => new { Move = x, NewHead = gameBoardState.GetSnakeNewHeadPosition(_mySnakeId, x) })
                        .Where(x => !occupiedCells.Contains(x.NewHead))
                        .Where(x => GetHeadsNearPoint(gameBoardState, x.NewHead).Count() == 1)
                        .OrderBy(x => x.NewHead.DistanceTo(nearestFood.Value, gameBoardState.BoardSize()))
                        .FirstOrDefault();

                    if (bestMove != null)
                    {
                        return bestMove.Move;
                    }
                    else
                    {
                        Console.WriteLine("DUPA nie ma gdzie iϾ");
                    }
                }

                var moves = new List<Move>
                {
                    Move.Left,
                    Move.Right,
                    Move.Straight
                };

                while (moves.Any())
                {
                    // Select random move.
                    var move = moves[_random.Next(moves.Count)];
                    moves.Remove(move);

                    var newHead = gameBoardState.GetSnakeNewHeadPosition(_mySnakeId, move);

                    var nearHeads = GetHeadsNearPoint(gameBoardState, newHead);

                    if (nearHeads.Count() == 1)
                    {
                        if (!occupiedCells.Contains(newHead))
                        {
                            return move;
                        }
                    }
                }
                moves = new List<Move>
                {
                    Move.Left,
                    Move.Right,
                    Move.Straight
                };

                while (moves.Any())
                {
                    // Select random move.
                    var move = moves[_random.Next(moves.Count)];
                    moves.Remove(move);

                    var newHead = gameBoardState.GetSnakeNewHeadPosition(_mySnakeId, move);

                    if (!occupiedCells.Contains(newHead))
                    {
                        return move;
                    }
                }
            }
            return Move.None;
        }
示例#2
0
        private IEnumerable<SnakeDTO> GetHeadsNearPoint(GameBoardState state, PointDTO point)
        {
            var surrounding = Move.Offsets.Select(x => Move.OffsetModulo(point, x.Offset, state.BoardSize())).ToArray();

            return state.GetSnakes()
                .Where(x => x.IsAlive)
                .Where(x => surrounding.Contains(x.Head));
        }