Ejemplo n.º 1
0
 public static IEnumerable<Piece> GetNeighbors(this Piece tile, CreeperBoard board)
 {
     List<CardinalDirection> neighborlyDirections = new List<CardinalDirection> { CardinalDirection.North, CardinalDirection.South, CardinalDirection.East, CardinalDirection.West };
     return neighborlyDirections
         .Where(x => board.Tiles.Any(y => y.Position == tile.Position.AtDirection(x)))
         .Select(x => board.Tiles.At(tile.Position.AtDirection(x)));
 }
Ejemplo n.º 2
0
        public AICreeperBoard(CreeperBoard board)
        {
            _tileRows = CreeperBoard.TileRows;
            _pegRows = CreeperBoard.PegRows;

            BlackTileCount = 0;
            WhiteTileCount = 0;
            BlackPegs = new HashSet<AIBoardNode>();
            WhitePegs = new HashSet<AIBoardNode>();

            TileHistory = new Stack<CreeperColor>();
            MoveHistory = new Stack<Move>();
            GameStateHistory = new Stack<CreeperGameState>();

            TileBoard = new AIBoardNode[_tileRows, _tileRows];
            PegBoard = new AIBoardNode[_pegRows, _pegRows];
            RowHeadBlack = new AIBoardNode[_tileRows];
            RowHeadWhite = new AIBoardNode[_tileRows];
            ColumnHeadBlack = new AIBoardNode[_tileRows];
            ColumnHeadWhite = new AIBoardNode[_tileRows];

            foreach (Piece tile in board.Tiles)
            {
                TileBoard[tile.Position.Row, tile.Position.Column] = new AIBoardNode(tile.Position.Row, tile.Position.Column, tile.Color);
            }

            foreach (Piece peg in board.Pegs)
            {
                PegBoard[peg.Position.Row, peg.Position.Column] = new AIBoardNode(peg.Position.Row, peg.Position.Column, peg.Color);
                if (peg.Color == CreeperColor.Ice)
                {
                    BlackPegs.Add(PegBoard[peg.Position.Row, peg.Position.Column]);
                }
                else if (peg.Color == CreeperColor.Fire)
                {
                    WhitePegs.Add(PegBoard[peg.Position.Row, peg.Position.Column]);
                }
            }

            for (int row = 0; row < _tileRows; row++)
            {
                for (int column = 0; column < _tileRows; column++)
                {
                    if (TileBoard[row, column].Color == CreeperColor.Ice || TileBoard[row, column].Color == CreeperColor.Fire)
                    {
                        UpdateListHeads(row, column, TileBoard[row, column].Color);
                        AddTileToTeam(TileBoard[row, column]);
                    }
                }
            }

            //Hash = new AIHash(this);
        }
Ejemplo n.º 3
0
        public static IEnumerable<Move> PossibleMoves(this Piece peg, CreeperBoard board)
        {
            List<Piece> pegs = new List<Piece>(board.Pegs);

            if (peg.Color == CreeperColor.Empty || peg.Color == CreeperColor.Invalid)
            {
                yield break;
            }

            List<CardinalDirection> neighborlyDirections = new List<CardinalDirection>
                                                                {
                                                                    CardinalDirection.North,
                                                                    CardinalDirection.Northeast,
                                                                    CardinalDirection.Northwest,
                                                                    CardinalDirection.South,
                                                                    CardinalDirection.Southeast,
                                                                    CardinalDirection.Southwest,
                                                                    CardinalDirection.East,
                                                                    CardinalDirection.West
                                                                };

            foreach (CardinalDirection direction in neighborlyDirections)
            {
                Position destinationPosition = peg.Position.AtDirection(direction);
                if (CreeperBoard.IsValidPosition(destinationPosition, PieceType.Peg)
                    && pegs.At(destinationPosition).Color == CreeperColor.Empty)
                {
                    yield return new Move(peg.Position, destinationPosition, peg.Color);
                }

                if (
                        (direction == CardinalDirection.North
                        || direction == CardinalDirection.South
                        || direction == CardinalDirection.East
                        || direction == CardinalDirection.West
                        )
                        && (CreeperBoard.IsValidPosition(destinationPosition, PieceType.Peg))
                        && (pegs.At(destinationPosition).Color == ((peg.Color == CreeperColor.Fire) ? CreeperColor.Ice : CreeperColor.Fire))
                    )
                {
                    destinationPosition = destinationPosition.AtDirection(direction);
                    if (CreeperBoard.IsValidPosition(destinationPosition, PieceType.Peg)
                        && pegs.At(destinationPosition).Color == CreeperColor.Empty)
                    {
                        yield return new Move(peg.Position, destinationPosition, peg.Color);
                    }
                }
            }

            yield break;
        }
Ejemplo n.º 4
0
        public static void AIGame(CreeperBoard board)
        {
            CreeperAI.CreeperAI creeperAI = new CreeperAI.CreeperAI(2, 10, .01, 11, 1000);
            bool pauseAfterPrint = false;

            bool gameOver = false;
            CreeperColor turn = CreeperColor.Ice;

            while (!board.IsFinished(turn)
                && board.Pegs.Any(x => x.Color == CreeperColor.Fire)
                && board.Pegs.Any(x => x.Color == CreeperColor.Ice))
            {
                turn = (turn == CreeperColor.Fire) ? CreeperColor.Ice : CreeperColor.Fire;

                board.Move(creeperAI.GetMove(board, turn));
                board.PrintToConsole(pauseAfterPrint);
            }

            Console.WriteLine(String.Format("{0} won.", turn.ToString()));
        }
Ejemplo n.º 5
0
        public static void WhiteWin(CreeperBoard board)
        {
            Position startPosition;
            Position endPosition;
            Move move;
            bool pausePrint = false;

            for (int i = 0; i < 4; i++)
            {
                startPosition = new Position(i, i + 1);
                endPosition = new Position(i + 1, i + 2);
                move = new Move(startPosition, endPosition, CreeperColor.Fire);
                board.Move(move);
                board.PrintToConsole(pausePrint);
            }
            for (int i = 0; i < 3; i++)
            {
                startPosition = new Position(i, i + 2);
                endPosition = new Position(i + 1, i + 3);
                move = new Move(startPosition, endPosition, CreeperColor.Fire);
                board.Move(move);
                board.PrintToConsole(pausePrint);
            }

            startPosition = new Position(4, 6);
            endPosition = new Position(5, 5);
            move = new Move(startPosition, endPosition, CreeperColor.Fire);
            board.Move(move);
            board.PrintToConsole(pausePrint);

            startPosition = new Position(4, 5);
            endPosition = new Position(5, 4);
            move = new Move(startPosition, endPosition, CreeperColor.Fire);
            board.Move(move);
            board.PrintToConsole(pausePrint);

            if(board.GetGameState(CreeperColor.Fire) == CreeperGameState.Complete)
            {
                Console.WriteLine("White wins!");
            }
        }
Ejemplo n.º 6
0
        public static void JumpTest(CreeperBoard board)
        {
            // test's a non jumping of flipping move
               /* if (board.IsValidMove(new Move(new Position(1, 2), new Position(2, 3), CreeperColor.White)))
            {
                Console.WriteLine("SideMove Test passed!");
            }
            else
            {
                Console.WriteLine("SideMove Test failed");
            }*/

            board.Move(new Move(new Position(4,0),new Position(3,0),CreeperColor.Ice));
            //board.Move(new Move(new Position(2, 0), new Position(4, 0), CreeperColor.White));
            if (board.IsValidMove(new Move(new Position(2,0), new Position(4,0), CreeperColor.Fire)))
            {
                Console.WriteLine("Jump Test works!");
            }
            else
            {
                Console.WriteLine("Jump Test Failed");
            }
        }
Ejemplo n.º 7
0
 static void PrintAICreeperBoard(CreeperBoard board)
 {
     board.ReadFromFile("TestBoard.txt");
     AICreeperBoard AIBoard = new AICreeperBoard(board);
     AIBoard.PrintToConsole();
 }
Ejemplo n.º 8
0
 static void Main(string[] args)
 {
     CreeperBoard board = new CreeperBoard();
     //PrintAICreeperBoard(board);
     //board.ReadFromFile("TestBoard.txt");
     //board.PrintToConsole();
     //WhiteWin(board);
     AIGame(board);
     //Testfunction(board);
     //using (XNAControlGame.Game1 game = new XNAControlGame.Game1())
     //{
     //    game.Run();
     //}
 }
Ejemplo n.º 9
0
 public CreeperBoard(CreeperBoard board)
 {
     Pegs = board.Pegs.Select(x => new Piece(x.Color, x.Position)).ToList();
     Tiles = board.Tiles.Select(x => new Piece(x.Color, x.Position)).ToList();
 }
Ejemplo n.º 10
0
        public bool Defeats(Gene opponent)
        {
            try
            {
                int moveCount = 0;
                CreeperColor turn = CreeperColor.Ice;
                CreeperBoard board = new CreeperBoard();
                CreeperAI.AI thisAI = new CreeperAI.AI(_weights);
                CreeperAI.AI opponentAI = new CreeperAI.AI(opponent._weights);

                while (!board.IsFinished(turn))
                {
                    moveCount++;
                    if (moveCount > 70)
                    {
                        Console.WriteLine("Move Loop");
                        return false;
                    }
                    turn = turn.Opposite();

                    if (turn == CreeperColor.Fire)
                    {
                        board.Move(thisAI.GetMove(board, turn));
                    }
                    else
                    {
                        board.Move(opponentAI.GetMove(board, turn));
                    }
                }

                return turn == CreeperColor.Fire && board.GetGameState(turn) == CreeperGameState.Complete;
            }
            catch (Exception)
            {
                Console.WriteLine("Exception");
                return false;
            }
        }
Ejemplo n.º 11
0
 public CreeperBoard GetBoard()
 {
     return _board = _board ?? new CreeperBoard();
 }