/**
A static board evaluator for Chess
*/
public class ChessEvaluator extends SBE {
//boards with bonus scores for positional score:
//*****************************************
static int KnightCenterScores[] =
{-4, 0, 0, 0, 0, 0, 0, -4,
-4, 0, 2, 2, 2, 2, 0, -4,
-4, 2, 3, 2, 2, 3, 2, -4,
-4, 2, 2, 5, 5, 2, 2, -4,
-4, 2, 2, 5, 5, 2, 2, -4,
-4, 2, 3, 2, 2, 3, 2, -4,
-4, 0, 2, 2, 2, 2, 0, -4,
-4, 0, 0, 0, 0, 0, 0, -4};
static int PawnCenterScores[] =
{0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 4, 4, 0, 0, 0,
0, 0, 5, 7, 7, 5, 0, 0,
0, 0, 3, 4, 4, 3, 0, 0,
0, 0, -1, -2, -2, -1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0};
static int PawnColScores[] =
{-30, -20, -10, 0, 0, -10, -20, -30};
static int PawnRowScores[] =
{0, 0, 5, 7, 9, 11, 15, 0};
static int KingCenterScores[] =
{0, 0, 1, 1, 1, 1, 0, 0,
0, 1, 2, 3, 3, 2, 1, 0,
1, 2, 6, 7, 7, 6, 2, 1,
1, 3, 7, 9, 9, 7, 3, 1,
1, 3, 7, 9, 9, 7, 3, 1,
1, 2, 6, 7, 7, 6, 2, 1,
0, 1, 2, 3, 3, 2, 1, 0,
0, 0, 1, 1, 1, 1, 0, 0};
static int QueenCenterScores[] =
{-2, 0, 0, 0, 0, 0, 0, -2,
-2, 0, 0, 0, 0, 0, 0, -2,
-2, 0, 1, 1, 1, 1, 0, -2,
-2, 0, 1, 2, 2, 1, 0, -2,
-2, 0, 1, 2, 2, 1, 0, -2,
-2, 0, 1, 1, 1, 1, 0, -2,
-2, 0, 0, 0, 0, 0, 0, -2,
-2, 0, 0, 0, 0, 0, 0, -2};
/**
Use the constructor as a chance to initialize constants or
arrays used in the evaluator.
*/
public ChessEvaluator()
{
}
/**
Decide who is doing better in board b and return an appropariate score.
Higher values if B_SIDE is winning, lower if R_SIDE is winning.
*/
public int evaluate( Board b )
{
int score = 0;
int red_counter = 0;
int blue_counter = 0;
boolean red_king = false;
boolean blue_king = false;
for ( int row = 0 ; row < Board.HEIGHT ; row++ )
for ( int col = 0 ; col < Board.WIDTH ; col++ ){
if (b.Space(row,col) < 0)
red_counter += MaterialScore(b,row,col) + PositionalScore(b, row, col);
else
blue_counter += MaterialScore(b,row,col) + PositionalScore(b, row, col);
if (b.Space(row,col) == Board.R_KING) red_king = true;
if (b.Space(row,col) == Board.B_KING) blue_king = true;
}
score = blue_counter - red_counter;
if(!blue_king)
score = Board.R_WIN_SCORE;
if(!red_king)
score = Board.B_WIN_SCORE;
return score;
}
private int PositionalScore (Board b, int row, int col){
switch (b.Space(row,col)){
case Board.R_QUEEN :return QueenCenterScores[(row*8+col)];
case Board.B_QUEEN :return QueenCenterScores[(row*8+col)];
case Board.R_PAWN : return PawnCenterScores[(row*8+col)]+
PawnColScores[col]+
PawnRowScores[7-row];
case Board.B_PAWN : return PawnCenterScores[63-(row*8+col)]+
PawnColScores[col]+
PawnRowScores[row];
case Board.R_KNIGHT : return KnightCenterScores[(row*8+col)];
case Board.B_KNIGHT : return KnightCenterScores[(row*8+col)];
case Board.R_KING : return KingCenterScores[(row*8+col)];
case Board.B_KING : return KingCenterScores[(row*8+col)];
}
return 0;
}
private int MaterialScore(Board b, int row,int col)
{
return Board.VAL[ b.Space(row,col) + 6];
}
}