Пример #1
0
        public void QuickestBlackWinTest()
        {
            var moves = new List <ChessMove>()
            {
                //right bishop's white pawn two up
                new ChessMove(new Position(5, 1), new Position(5, 3)),
                //king's black pawn two down
                new ChessMove(new Position(4, 6), new Position(4, 4)),
                //right knight's white pawn two up
                new ChessMove(new Position(6, 1), new Position(6, 3)),
                //black queen checkmate
                new ChessMove(new Position(3, 7), new Position(7, 3)),
            };

            var factory = new ChessGameFactory();
            var game    = factory.Create();

            ChessPlayResult result = ChessPlayResult.SuccessfulMove;

            foreach (var move in moves)
            {
                Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);
                result = game.Play(move, game.CurrentPlayer);
            }

            Assert.AreEqual(ChessPlayResult.BlackWin, result);
        }
        private PlayResult TurnChessResultIntoPlayResult(ChessPlayResult result)
        {
            switch (result)
            {
            case ChessPlayResult.SuccessfulMove:
                return(PlayResult.Success);

            case ChessPlayResult.PromotionRequired:
                return(PlayResult.PromotionRequired);

            case ChessPlayResult.Stalemate:
                return(PlayResult.Draw);

            case ChessPlayResult.WhiteWin:
            case ChessPlayResult.BlackWin:
                return(PlayResult.YouWin);

            case ChessPlayResult.BlackChecked:
            case ChessPlayResult.WhiteChecked:
                return(PlayResult.Check);

            case ChessPlayResult.WrongPlayer:
                return(PlayResult.NotYourTurn);

            default:
                return(PlayResult.Error);
            }
        }
Пример #3
0
        public void PawnCanPerformEnPassant()
        {
            var moves = new List <ChessMove>()
            {
                //white pawn two up
                new ChessMove(new Position(6, 1), new Position(6, 3)),
                //black pawn two down
                new ChessMove(new Position(7, 6), new Position(7, 4)),
                //white pawn captures black pawn
                new ChessMove(new Position(6, 3), new Position(7, 4)),
                //black pawn two down
                new ChessMove(new Position(6, 6), new Position(6, 4)),
                //white pawn performs en passant
                new ChessMove(new Position(7, 4), new Position(6, 5)),
            };

            var factory = new ChessGameFactory();
            var game    = factory.Create();

            ChessPlayResult result = ChessPlayResult.SuccessfulMove;

            foreach (var move in moves)
            {
                Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);
                result = game.Play(move, game.CurrentPlayer);
            }

            Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);
            Assert.AreEqual(30, game.Pieces.Count());
        }
Пример #4
0
        public void KingCanCaptureOtherPieces()
        {
            var moves = new List <ChessMove>()
            {
                //white pawn two up
                new ChessMove(new Position(5, 1), new Position(5, 3)),
                //black pawn two down
                new ChessMove(new Position(3, 6), new Position(3, 4)),
                //white king up right
                new ChessMove(new Position(4, 0), new Position(5, 1)),
                //left black bishop move
                new ChessMove(new Position(2, 7), new Position(6, 3)),
                //white king up right
                new ChessMove(new Position(5, 1), new Position(6, 2)),
                //black pawn one down
                new ChessMove(new Position(3, 4), new Position(3, 3)),
                //white king capturing bishop
                new ChessMove(new Position(6, 2), new Position(6, 3)),
            };

            var factory = new ChessGameFactory();
            var game    = factory.Create();

            ChessPlayResult result = ChessPlayResult.SuccessfulMove;

            foreach (var move in moves)
            {
                Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);
                result = game.Play(move, game.CurrentPlayer);
            }

            Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);
            Assert.AreEqual(31, game.Pieces.Count());
        }
Пример #5
0
        public void QuickestBlackPromotionTest()
        {
            var moves = new List <ChessMove>()
            {
                //leftmost white pawn two up
                new ChessMove(new Position(0, 1), new Position(0, 3)),
                //left knight's black pawn two down
                new ChessMove(new Position(1, 6), new Position(1, 4)),
                //left white rook two up
                new ChessMove(new Position(0, 0), new Position(0, 2)),
                //left knight's black pawn capture of white pawn
                new ChessMove(new Position(1, 4), new Position(0, 3)),
                //left white rook four right
                new ChessMove(new Position(0, 2), new Position(4, 2)),
                //left knight's black pawn one down
                new ChessMove(new Position(0, 3), new Position(0, 2)),
                //right white knight move
                new ChessMove(new Position(6, 0), new Position(7, 2)),
                //left knight's black pawn one down
                new ChessMove(new Position(0, 2), new Position(0, 1)),
                //right white knight move
                new ChessMove(new Position(7, 2), new Position(6, 4)),
                //left knight's black pawn reaching promotion area
                new ChessMove(new Position(0, 1), new Position(0, 0)),
            };

            var factory = new ChessGameFactory();
            var game    = factory.Create();

            ChessPlayResult result = ChessPlayResult.SuccessfulMove;

            foreach (var move in moves)
            {
                Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);
                result = game.Play(move, game.CurrentPlayer);
            }

            Assert.AreEqual(ChessPlayResult.PromotionRequired, result);
            var promotionMove = new ChessMove(new Position(0, 0), new Position(0, 0), pawnPromotion: ChessPieceType.Queen);

            result = game.Play(promotionMove, game.CurrentPlayer);
            Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);

            var blackQueens = game.Pieces
                              .Where(p => p.Color == ChessColor.Black &&
                                     p.PieceType == ChessPieceType.Queen)
                              .ToList();

            Assert.AreEqual(2, blackQueens.Count);
        }
Пример #6
0
        public void QuickestBlackKingsideCastling()
        {
            var moves = new List <ChessMove>()
            {
                //leftmost white pawn one up
                new ChessMove(new Position(0, 1), new Position(0, 2)),
                //king's black pawn two down
                new ChessMove(new Position(4, 6), new Position(4, 4)),
                //left white rook 1 up
                new ChessMove(new Position(0, 0), new Position(0, 1)),
                //right black bishop capturing leftmost white pawn
                new ChessMove(new Position(5, 7), new Position(0, 2)),
                //second from left white pawn capturing black bishop
                new ChessMove(new Position(1, 1), new Position(0, 2)),
                //right black knight move
                new ChessMove(new Position(6, 7), new Position(5, 5)),
                //left white bishop move
                new ChessMove(new Position(2, 0), new Position(1, 1)),
                //black kingside castling
                new ChessMove(new Position(4, 7), new Position(7, 7)),
            };

            var factory = new ChessGameFactory();
            var game    = factory.Create();

            ChessPlayResult result = ChessPlayResult.SuccessfulMove;

            foreach (var move in moves)
            {
                Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);
                System.Console.WriteLine(move);
                result = game.Play(move, game.CurrentPlayer);
            }

            Assert.AreEqual(ChessPlayResult.SuccessfulMove, result);
            var isBlackKingOnCorrectPosition = game.Pieces
                                               .Any(p =>
                                                    p.Color == ChessColor.Black &&
                                                    p.PieceType == ChessPieceType.King &&
                                                    p.Position == new Position(6, 7));

            Assert.IsTrue(isBlackKingOnCorrectPosition);
        }
Пример #7
0
        public ChessPlayResult Play(ChessMove chessMove, ChessColor player)
        {
            if (IsGameFinished())
            {
                return(checkResult);
            }
            if (player != CurrentPlayer)
            {
                return(ChessPlayResult.WrongPlayer);
            }
            if (!moveValidator.ValidateAndMove(chessMove, player))
            {
                return(ChessPlayResult.InvalidMove);
            }

            if (promotionDetector.IsPromotionRequired())
            {
                return(ChessPlayResult.PromotionRequired);
            }
            CurrentPlayer = CurrentPlayer.Opposite();

            checkResult = gameFinishedDetector.IsGameFinished(CurrentPlayer);
            return(checkResult);
        }