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); } }
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()); }
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()); }
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); }
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); }
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); }