public BoardScorer(DoktorChessAIBoard toScore, pieceColour newViewpoint, scoreModifiers newModifiers) { modifiers = newModifiers; viewpoint = newViewpoint; List<square> myPieces = toScore.getPiecesForColour(viewpoint); List<square> enemyPieces = toScore.getPiecesForColour(viewpoint == pieceColour.black ? pieceColour.white : pieceColour.black); parentBoard = toScore; if (viewpoint == pieceColour.black) { _myMaterialAdvantage = toScore.blackMaterialAdvantage; _myMaterialDisadvantage = toScore.whiteMaterialAdvantage; } else if (viewpoint == pieceColour.white) { _myMaterialAdvantage = toScore.whiteMaterialAdvantage; _myMaterialDisadvantage = toScore.blackMaterialAdvantage; } _status = toScore.getGameStatus(myPieces, enemyPieces); }
private void verifyWonForWhite(DoktorChessAIBoard ourBoard, pieceColour wonCol) { pieceColour lostCol = DoktorChessAIBoard.getOtherSide(wonCol); // The position should be won/lost for white/black, respectively Assert.IsTrue(ourBoard.getGameStatus(wonCol) == gameStatus.won); Assert.IsTrue(ourBoard.getGameStatus(lostCol) == gameStatus.lost); // and this should be reflected in the scores BoardScorer whiteScorer = new BoardScorer(ourBoard, wonCol, new scoreModifiers()); Assert.AreEqual(BoardScorer.highest, whiteScorer.getScore()); // and won for black. BoardScorer blackScorer = new BoardScorer(ourBoard, lostCol, new scoreModifiers()); Assert.AreEqual(BoardScorer.lowest, blackScorer.getScore()); }
public void testFinishedGameScoreStalemate() { // Generate a board two pawns, deadlocked in front of each other. This should // be a draw via stalemate. Add a third pawn to ensure that stalemate is causing // the '0' board score, not a materian mismatch. DoktorChessAIBoard ourboard = new DoktorChessAIBoard(gameType.queenAndPawns, boardSearchConfig.getDebugConfig()); // Two deadlocked pawns ourboard.addPiece(pieceType.pawn, pieceColour.white, 1, 2); ourboard.addPiece(pieceType.pawn, pieceColour.black, 1, 3); // an outlier pawn ourboard.addPiece(pieceType.pawn, pieceColour.black, 4, 4); Assert.IsTrue(ourboard.getGameStatus(pieceColour.white) == gameStatus.drawn); Assert.IsTrue(ourboard.getGameStatus(pieceColour.black) == gameStatus.drawn); BoardScorer whiteScorer = new BoardScorer(ourboard, pieceColour.white, new scoreModifiers()); Assert.AreEqual(0, whiteScorer.getScore()); BoardScorer blackScorer = new BoardScorer(ourboard, pieceColour.black, new scoreModifiers()); Assert.AreEqual(0, blackScorer.getScore()); }
public void verifyFiftyMoveRule(DoktorChessAIBoard ourBoard, int moveOffset) { for (int n = 0; n < 100 - moveOffset; n++) { Assert.AreEqual(gameStatus.inProgress, ourBoard.getGameStatus(pieceColour.white), "Game declared drawn at move " + n.ToString()); switch (n % 4) { case 0: // Play Nc3 ourBoard.doMove(new move(ourBoard[1, 0], ourBoard[2, 2])); break; case 1: // Play Nc6 ourBoard.doMove(new move(ourBoard[1, 7], ourBoard[2, 5])); break; case 2: // And move knights back again. // Nb1 ourBoard.doMove(new move(ourBoard[2, 2], ourBoard[1, 0])); break; case 3: // nb8 ourBoard.doMove(new move(ourBoard[2, 5], ourBoard[1, 7])); break; default: throw new ArgumentException(); } } // 50 moves have elapsed! It's a draw! Assert.AreEqual(gameStatus.drawn, ourBoard.getGameStatus(pieceColour.white)); }