示例#1
0
        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));
        }