/** * Converts the string representation of a move into a move and then applies it to the current * board. * * @param m the move string. */ public void applyMove(String m) { if (board.plyCount() != plyCount++) { throw new IllegalStateException("Did you forget to call undoMove() somewhere?"); } board.applyMove(board.createMoveFromString(m)); }
/* * evalHigh * * This function evaluates the board according to the above spec. It * loops through all the pieces on the board and assigns two sums: * whiteSum and blackSum, for the value of white's and black's pieces, * respectively. Then it adds them and sets the sign according to whose * turn it is. */ private int evalHigh(ArrayBoard board, int color) { if (color == ArrayBoard.WHITE) { int whiteSum = 0; if (board.hasCastled[ArrayBoard.WHITE]) whiteSum += CASTLE_BONUS; for (ArrayPiece p : board.allPiecesOfColor(ArrayBoard.WHITE)) { switch (p.type()) { case ArrayPiece.KING: whiteSum += kingval; break; case ArrayPiece.QUEEN: whiteSum += queenval; break; case ArrayPiece.ROOK: whiteSum += rookval; break; case ArrayPiece.BISHOP: whiteSum += bishoppos[p.row()][p.col()] + bishopval; break; case ArrayPiece.KNIGHT: whiteSum += knightpos[p.row()][p.col()] + knightval; break; case ArrayPiece.PAWN: whiteSum += pawnpos[p.row()][p.col()] + pawnval; break; } } return whiteSum; } else { int blackSum = 0; for (ArrayPiece p : board.allPiecesOfColor(ArrayBoard.BLACK)) { switch (p.type()) { case ArrayPiece.KING: blackSum += kingval; break; case ArrayPiece.QUEEN: blackSum += queenval; break; case ArrayPiece.ROOK: blackSum += rookval; break; case ArrayPiece.BISHOP: blackSum += bishoppos[7 - p.row()][p.col()] + bishopval; break; case ArrayPiece.KNIGHT: blackSum += knightpos[7 - p.row()][p.col()] + knightval; break; case ArrayPiece.PAWN: blackSum += pawnpos[7 - p.row()][p.col()] + pawnval; break; } } return blackSum; } }
/* * eval * * This function figures out if it's endgame. if so, * evaluate with that knowledge. Else, use the regular evaluator, * which just counts pieces. */ public int eval(ArrayBoard board) { int whiteSum = 0, blackSum = 0; int numWhitePieces = board.countOfColor(ArrayBoard.WHITE); int numBlackPieces = board.countOfColor(ArrayBoard.BLACK); if (numWhitePieces <= 5 || numBlackPieces <= 5) { whiteSum = evalLow(board, ArrayBoard.WHITE); blackSum = evalLow(board, ArrayBoard.BLACK); } else { whiteSum = evalHigh(board, ArrayBoard.WHITE); blackSum = evalHigh(board, ArrayBoard.BLACK); } return (board.toPlay() == ArrayBoard.WHITE) ? (whiteSum - blackSum) : (blackSum - whiteSum); }
/* * evalLow * * This function evaluates the board according to the above spec, * but makes pieces more valuable. It also uses the kingpos array to * encourage the king to move towards the middle of the board. */ private int evalLow(ArrayBoard board, int color) { if (color == ArrayBoard.WHITE) { int whiteSum = 0; if (board.hasCastled[ArrayBoard.WHITE]) whiteSum += CASTLE_BONUS; for (ArrayPiece p : board.allPiecesOfColor(ArrayBoard.WHITE)) { switch (p.type()) { case ArrayPiece.KING: whiteSum += 4 * (calculateWhiteKingWeight( p, board.countOfColor(ArrayBoard.WHITE), board.countOfColor(ArrayBoard.BLACK))); break; case ArrayPiece.QUEEN: whiteSum += 2 * queenval; break; case ArrayPiece.ROOK: whiteSum += 2 * rookval; break; case ArrayPiece.BISHOP: whiteSum += 2 * (bishoppos[p.row()][p.col()] + bishopval); break; case ArrayPiece.KNIGHT: whiteSum += 2 * (knightpos[p.row()][p.col()] + knightval); break; case ArrayPiece.PAWN: whiteSum += 2 * (pawnpos[p.row()][p.col()] + pawnval); break; } } return whiteSum; } else { int blackSum = 0; for (ArrayPiece p : board.allPiecesOfColor(ArrayBoard.BLACK)) { switch (p.type()) { case ArrayPiece.KING: blackSum += 4 * (calculateBlackKingWeight( p, board.countOfColor(ArrayBoard.WHITE), board.countOfColor(ArrayBoard.BLACK))); break; case ArrayPiece.QUEEN: blackSum += 2 * queenval; break; case ArrayPiece.ROOK: blackSum += 2 * rookval; break; case ArrayPiece.BISHOP: blackSum += 2 * (bishoppos[7 - p.row()][p.col()] + bishopval); break; case ArrayPiece.KNIGHT: blackSum += 2 * (knightpos[7 - p.row()][p.col()] + knightval); break; case ArrayPiece.PAWN: blackSum += 2 * (pawnpos[7 - p.row()][p.col()] + pawnval); break; } } return blackSum; } }