Beispiel #1
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());
        }
Beispiel #2
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);
        }
Beispiel #3
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());
        }
Beispiel #4
0
        public void ThereShouldBe20StartingMoves()
        {
            var factory = new ChessGameFactory();
            var game    = factory.Create();
            var moves   = game.GetAvailableLegalMoves(ChessColor.White).ToList();

            Assert.AreEqual(20, moves.Count);
        }
Beispiel #5
0
        public void TryingToMoveEmptySpaceReturnsInvalidMove()
        {
            var invalidMove = new ChessMove(new Position(2, 2), new Position(2, 3));
            var factory     = new ChessGameFactory();
            var game        = factory.Create();

            var result = game.Play(invalidMove, ChessColor.White);

            Assert.AreEqual(ChessPlayResult.InvalidMove, result);
        }
Beispiel #6
0
        public void ThereShouldBe20FirstBlackMoves()
        {
            var factory = new ChessGameFactory();
            var game    = factory.Create();

            game.Play(new ChessMove(new Position(0, 1), new Position(0, 2)), ChessColor.White);
            var moves = game.GetAvailableLegalMoves(ChessColor.Black).ToList();

            Assert.AreEqual(20, moves.Count);
        }
Beispiel #7
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);
        }
Beispiel #8
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);
        }
Beispiel #9
0
        private void WaitingConnection()
        {
            IConnection connection = null;

            try
            {
                if (isServerSide)
                {
                    connection = new TcpIPServerConnection(form.SocketInfo.Host, int.Parse(form.SocketInfo.Port));
                    for (int i = 0; i < 40; i++)
                    {
                        if (!isWaitingConnection)
                        {
                            break;
                        }
                        else if (connection.TryToOpen())
                        {
                            game = ChessGameFactory.GetInstance().GetChessGame(connection);
                            break;
                        }
                        else
                        {
                            Thread.Sleep(100);
                        }
                    }
                }
                else
                {
                    connection = new TcpIPClientConnection(form.SocketInfo.Host, int.Parse(form.SocketInfo.Port));
                    for (int i = 0; i < 2; i++)
                    {
                        if (connection.TryToOpen())
                        {
                            game = RemoteChessGameFactory.GetInstance().GetChessGame(connection);
                            break;
                        }
                        else
                        {
                            Thread.Sleep(100);
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
                isWaitingConnection = false;
            }
            catch (Exception e) when(e is ConnectionException || e is IOException)
            {
                isWaitingConnection = false;
                form.ShowMessageBox("Fail to connect. Port is busy", "Error");
                form.Invoke((Action <bool>)form.StartStopWaitingConnBtnRename, new object[] { false });
            }
            catch (Exception e) when(e is FormatException || e is OverflowException)
            {
                isWaitingConnection = false;
                form.ShowMessageBox("Wrong host or port format", "Error");
                form.Invoke((Action <bool>)form.StartStopWaitingConnBtnRename, new object[] { false });
            }

            finally
            {
                if (isWaitingConnection)
                {
                    if (game == null)
                    {
                        form.Invoke((Action <bool>)form.StartStopWaitingConnBtnRename, new object[] { false });
                        isWaitingConnection = false;
                        form.ShowMessageBox("Fail to connect", "Error");
                    }
                    else
                    {
                        form.Invoke((ThreadStart)StartGame);
                    }
                }
                if (!isWaitingConnection)
                {
                    if (game != null)
                    {
                        try
                        {
                            game.Disconnect();
                        }
                        catch (Exception e) when(e is ConnectionException || e is IOException)
                        {
                        }
                        game = null;
                    }
                    if (connection != null)
                    {
                        connection.Close();
                        connection = null;
                    }
                }
                isWaitingConnection = false;
            }
        }