Exemple #1
0
        public void Spike_debugging_a_move_problem()
        {
            var board = new ChessBoardBuilder()
                        //                .X(8, "rnbqkbnr")
                        //                .Y(ChessFile.A, "RP    pr")
                        //                .At(ChessFile.D, 2, 'P')
                        //                .FromChessGame(new ChessGame())
                        .Board("r.bq.rk." +
                               "...nbppp" +
                               "p.pp.n.." +
                               ".p..p..." +
                               "..PPP..." +
                               ".B...N.P" +
                               "PP...PP." +
                               "RNBQR.K.")
            ;

            var game = ChessFactory.CustomChessGame(board.ToGameSetup(), Colours.White);
//            var game = new ChessGame(NullLogger<ChessGame>.Instance, _chessBoardEngineProvider, board.ToGameSetup(), Colours.White);

            // TODO: Fix this bug, pawn can't take pawn, something to do with
            // enpassant i guess based on pawn positions

            var msg = game.Move("c4b5");

            msg.ShouldBeEmpty();
        }
        public void StartPositionChessBoardTest()
        {
            var actualBoardCells   = ChessBoardBuilder.GetStartPositionBoardCells();
            var expectedChessboard = TestData.GetStartPositionChessBoard();

            Assertions.AreBoardsMatch(actualBoardCells, expectedChessboard.BoardCells);
        }
        public void Regression_king_side_castle_bug()
        {
            var board = new ChessBoardBuilder()
                        .Board(".rbqkbnr" +
                               "pppppppp" +
                               "n......." +
                               "........" +
                               "........" +
                               ".....NPB" +
                               "PPPPPP.P" +
                               "RNBQK..R"
                               );

            var buildGame  = ChessFactory.CustomChessGame(board.ToGameSetup(), Colours.White);
            var boardState = buildGame.BoardState;

            var msg = buildGame.Move(_whiteKingSideCastle.ToChessCoords());

            Assert.IsEmpty(msg, msg);

            Assert.False(boardState.IsEmpty("G1".ToBoardLocation()), $"No item at G1");
            var king = boardState.GetItem("G1".ToBoardLocation());

            Assert.That(king.Item.EntityType, Is.EqualTo((int)ChessPieceName.King), "king not moved correctly");

            Assert.NotNull(boardState.GetItem("F1".ToBoardLocation()), $"No item at F1");
            var rook = boardState.GetItem("F1".ToBoardLocation());

            Assert.That(rook.Item.EntityType, Is.EqualTo((int)ChessPieceName.Rook), "castle not moved correctly");
        }
Exemple #4
0
        public void Spike_easy_board_builder_to_from_ChessGame2()
        {
            var setup = new ChessBoardBuilder()
                        //                .X(8, "rnbqkbnr")
                        //                .Y(ChessFile.A, "RP    pr")
                        //                .At(ChessFile.D, 2, 'P')
                        //                .FromChessGame(new ChessGame())
                        .Board("rnbqkbnr" +
                               "pppppppp" +
                               "        " +
                               "        " +
                               "        " +
                               "        " +
                               "PPPPPPPP" +
                               "RNBQKBNR")
                        .ToGameSetup()
            ;


            var game = ChessFactory.CustomChessGame(setup, Colours.White);

            var board = new ChessBoardBuilder().FromChessGame(game).ToTextBoard();

            Console.WriteLine(board);
        }
        public void Should_find_promotions(string sanText, string expectedMoveText, Colours toPlay, ChessPieceName promotionPiece)
        {
            var builder = new ChessBoardBuilder()
                          .Board("    k   " +
                                 "       P" +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "    K   "
                                 );

            var game = ChessFactory.CustomChessGame(builder.ToGameSetup(), toPlay);
            var move = new SanMoveFinder(game.BoardState)
                       .Find(sanText.ToSan(), toPlay);

            Assert.NotNull(move, "No move found!");

            Assert.That(move.ToChessCoords(), Is.EqualTo(expectedMoveText));

            var moveExtraData = move.ExtraData;

            Assert.NotNull(moveExtraData);
            var data = ChessFactory.MoveExtraData(toPlay, promotionPiece);

            Assert.That(move.ToChessCoords(), Is.EqualTo(expectedMoveText));
            Assert.That(data, Is.EqualTo(moveExtraData), $"Unexpected promotion: {moveExtraData}");
        }
Exemple #6
0
        BoardCell[,] GetDeepCopyOfBoardCells(BoardCell[,] boardCells)
        {
            var serializedChessboard  = JsonConvert.SerializeObject(boardCells);
            var deserializedBoarCells = JsonConvert.DeserializeObject <BoardCell[, ]>(serializedChessboard);

            ChessBoardBuilder.NormilizedBoardCells(deserializedBoarCells);

            return(deserializedBoarCells);
        }
Exemple #7
0
        public ChessGame GetNewChessGame()
        {
            var builder = new ChessBoardBuilder();

            return(new ChessGame
            {
                Board = builder.Build().GetBoard(),
                ActivePlayer = Player.White,
                GameState = ""
            });
        }
        public void GetNormilizedBoardCellsTest()
        {
            ChessBoard initialChessBoard    = TestData.GetStartPositionChessBoard();
            string     serializedChessboard = initialChessBoard.GetSerializedChessBoard();

            ChessBoard deserialisedChessBoard = JsonConvert.DeserializeObject <ChessBoard>(serializedChessboard);

            ChessBoardBuilder.NormilizedBoardCells(deserialisedChessBoard.BoardCells);

            Assertions.AreBoardsMatch(initialChessBoard.BoardCells, deserialisedChessBoard.BoardCells);
        }
 public ChessWebApiResult(
     ChessGame game,
     Colours toMove,
     string message,
     params LocatedItem <ChessPieceEntity>[] items
     )
 {
     Game           = game;
     Board          = ChessGameConvert.Serialise(game);
     BoardText      = new ChessBoardBuilder().FromChessGame(game).ToTextBoard();
     Moves          = items.SelectMany(i => i.Paths.FlattenMoves());
     AvailableMoves = ToMoveList(items);
     WhoseTurn      = toMove.ToString();
     Message        = message;
 }
        public void Should_find_simple_check_condition()
        {
            var builder = new ChessBoardBuilder()
                          .Board("R   k   " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "    K  R"
                                 );
            var game = ChessFactory.CustomChessGame(builder.ToGameSetup(), Colours.Black);

            Assert.That(game.CheckState, Is.EqualTo(GameCheckState.BlackInCheck));
        }
Exemple #11
0
        public void SetUp()
        {
            var board = new ChessBoardBuilder()
                        .Board("   qk  r" +
                               "        " +
                               "Pe Pb PP" +
                               "        " +
                               "        " +
                               "        " +
                               "        " +
                               "    K  R"
                               );

            _boardState = ChessFactory.CustomChessGame(board.ToGameSetup()).BoardState;
            _validator  = new EnPassantTakeValidator(new ChessValidationSteps());
        }
        public void ValidateMove_fails_if_path_under_attack()
        {
            var board = new ChessBoardBuilder()
                        .Board("    k   " +
                               "        " +
                               "        " +
                               "        " +
                               "     r  " +
                               "        " +
                               "        " +
                               "    K  R"
                               );

            var boardState = ChessFactory.CustomChessGame(board.ToGameSetup(), Colours.White).BoardState;

            Assert.False(_validator.ValidateMove(_whiteKingSideCastle, boardState), "Invalid king side castle move allowed");
        }
        public void ValidateMove_fails_unless_king_is_in_starting_position()
        {
            var board = new ChessBoardBuilder()
                        .Board("    k   " +
                               "        " +
                               "        " +
                               "        " +
                               "        " +
                               "        " +
                               "        " +
                               "   K   R"
                               );

            var boardState = ChessFactory.CustomChessGame(board.ToGameSetup(), Colours.White).BoardState;

            Assert.False(_validator.ValidateMove(_whiteInvalidKingCastle, boardState), "Invalid castle move allowed");
        }
        public void Should_serialise_and_deserialise_to_68char_format()
        {
            var chessGame      = ChessFactory.NewChessGame();
            var actualNewBoard = ChessGameConvert.Serialise(chessGame);

            var expectedNewBoard = "rnbqkbnrpppppppp................................PPPPPPPPRNBQKBNR" // The board
                                   + "W"                                                              // Whose turn
                                   + "0000";                                                          // White Queen/King Black Queen/King castle availability

            Assert.That(actualNewBoard, Is.EqualTo(expectedNewBoard));

            var actualGame = ChessGameConvert.Deserialise(actualNewBoard);

            var actualGameAsString   = new ChessBoardBuilder().FromChessGame(actualGame).ToTextBoard();
            var expectedGameAsString = new ChessBoardBuilder().FromChessGame(chessGame).ToTextBoard();

            Assert.That(actualGameAsString, Is.EqualTo(expectedGameAsString));
            Console.WriteLine(actualGameAsString);
        }
        public void Should_find_castle_moves(string sanText, string expectedMoveText, Colours toPlay)
        {
            var builder = new ChessBoardBuilder()
                          .Board("r   k  r" +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "        " +
                                 "R   K  R"
                                 );

            var game = ChessFactory.CustomChessGame(builder.ToGameSetup(), toPlay);
            var move = new SanMoveFinder(game.BoardState)
                       .Find(sanText.ToSan(), toPlay);

            Assert.NotNull(move, "No move found!");
            Assert.That(move.ToChessCoords(), Is.EqualTo(expectedMoveText));
        }
        public void Should_not_find_move_that_leaves_king_in_check()
        {
            var board = new ChessBoardBuilder()
                        .Board("    k   " +
                               "        " +
                               "        " +
                               "    p   " +
                               "   PQ   " +
                               "        " +
                               "        " +
                               "    K   "
                               );
            var game = ChessFactory.CustomChessGame(board.ToGameSetup(), Colours.Black);

            var blockedPieceLocation = "E5".ToBoardLocation();

            var blockedPiece = game.BoardState.GetItem(blockedPieceLocation);

            Assert.False(blockedPiece.Paths.ContainsMoveTo("D4".ToBoardLocation()),
                         $"Pawn at E5 should NOT be able to move D4");
        }
        public void Regression_Kings_cant_move_next_to_each_other_black()
        {
            var board = new ChessBoardBuilder()
                        .Board("  K k   " +
                               "        " +
                               "        " +
                               "        " +
                               "        " +
                               "        " +
                               "        " +
                               "        "
                               );

            var boardState = ChessFactory.CustomChessGame(board.ToGameSetup(), Colours.Black).BoardState;

            var from = "e8".ToBoardLocation();
            var to   = "d8".ToBoardLocation();
            var move = BoardMove.Create(from, to, (int)ChessMoveTypes.KingMove);
            var item = boardState.GetItem(from);

            Assert.False(item.Paths.ContainsMoveTo(to), "kings cannot move next to each other");
        }
        public void Should_put_plus_on_end_of_moves_that_cause_check()
        {
            // TODO: Better way to check this, than using a full board.
            var builder = new ChessBoardBuilder()
                          .Board("....rrk." +
                                 ".b...pp." +
                                 ".n...q.p" +
                                 "..p.N..." +
                                 ".pB....." +
                                 ".......P" +
                                 "PP...PP." +
                                 "R..QR.K."
                                 );

            var game      = ChessFactory.CustomChessGame(builder.ToGameSetup());
            var from      = "C4".ToBoardLocation();
            var piece     = game.BoardState.GetItem(from);
            var boardMove = piece.Paths.FindMove(from, "f7".ToBoardLocation());
            var san       = StandardAlgebraicNotation.ParseFromGameMove(game.BoardState, boardMove, true);

            san.ToNotation().ShouldBe("Bxf7+");
        }