186 lines
3.3 KiB
JavaScript
186 lines
3.3 KiB
JavaScript
var PawnTable = [
|
|
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
|
|
10 , 10 , 0 , -10 , -10 , 0 , 10 , 10 ,
|
|
5 , 0 , 0 , 5 , 5 , 0 , 0 , 5 ,
|
|
0 , 0 , 10 , 20 , 20 , 10 , 0 , 0 ,
|
|
5 , 5 , 5 , 10 , 10 , 5 , 5 , 5 ,
|
|
10 , 10 , 10 , 20 , 20 , 10 , 10 , 10 ,
|
|
20 , 20 , 20 , 30 , 30 , 20 , 20 , 20 ,
|
|
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
|
|
];
|
|
|
|
|
|
var KnightTable = [
|
|
0 , -10 , 0 , 0 , 0 , 0 , -10 , 0 ,
|
|
0 , 0 , 0 , 5 , 5 , 0 , 0 , 0 ,
|
|
0 , 0 , 10 , 10 , 10 , 10 , 0 , 0 ,
|
|
0 , 0 , 10 , 20 , 20 , 10 , 5 , 0 ,
|
|
5 , 10 , 15 , 20 , 20 , 15 , 10 , 5 ,
|
|
5 , 10 , 10 , 20 , 20 , 10 , 10 , 5 ,
|
|
0 , 0 , 5 , 10 , 10 , 5 , 0 , 0 ,
|
|
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
|
|
];
|
|
|
|
var BishopTable = [
|
|
0 , 0 , -10 , 0 , 0 , -10 , 0 , 0 ,
|
|
0 , 0 , 0 , 10 , 10 , 0 , 0 , 0 ,
|
|
0 , 0 , 10 , 15 , 15 , 10 , 0 , 0 ,
|
|
0 , 10 , 15 , 20 , 20 , 15 , 10 , 0 ,
|
|
0 , 10 , 15 , 20 , 20 , 15 , 10 , 0 ,
|
|
0 , 0 , 10 , 15 , 15 , 10 , 0 , 0 ,
|
|
0 , 0 , 0 , 10 , 10 , 0 , 0 , 0 ,
|
|
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
|
|
];
|
|
|
|
var RookTable = [
|
|
0 , 0 , 5 , 10 , 10 , 5 , 0 , 0 ,
|
|
0 , 0 , 5 , 10 , 10 , 5 , 0 , 0 ,
|
|
0 , 0 , 5 , 10 , 10 , 5 , 0 , 0 ,
|
|
0 , 0 , 5 , 10 , 10 , 5 , 0 , 0 ,
|
|
0 , 0 , 5 , 10 , 10 , 5 , 0 , 0 ,
|
|
0 , 0 , 5 , 10 , 10 , 5 , 0 , 0 ,
|
|
25 , 25 , 25 , 25 , 25 , 25 , 25 , 25 ,
|
|
0 , 0 , 5 , 10 , 10 , 5 , 0 , 0
|
|
];
|
|
|
|
var BishopPair = 40;
|
|
|
|
|
|
function EvalPosition() {
|
|
|
|
var score = GameBoard.material[COLOURS.WHITE] - GameBoard.material[COLOURS.BLACK];
|
|
|
|
var pce;
|
|
var sq;
|
|
var pceNum;
|
|
|
|
pce = PIECES.wP;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score += PawnTable[SQ64(sq)];
|
|
}
|
|
|
|
pce = PIECES.bP;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score -= PawnTable[MIRROR64(SQ64(sq))];
|
|
}
|
|
|
|
pce = PIECES.wN;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score += KnightTable[SQ64(sq)];
|
|
}
|
|
|
|
pce = PIECES.bN;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score -= KnightTable[MIRROR64(SQ64(sq))];
|
|
}
|
|
|
|
pce = PIECES.wB;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score += BishopTable[SQ64(sq)];
|
|
}
|
|
|
|
pce = PIECES.bB;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score -= BishopTable[MIRROR64(SQ64(sq))];
|
|
}
|
|
|
|
pce = PIECES.wR;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score += RookTable[SQ64(sq)];
|
|
}
|
|
|
|
pce = PIECES.bR;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score -= RookTable[MIRROR64(SQ64(sq))];
|
|
}
|
|
|
|
pce = PIECES.wQ;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score += RookTable[SQ64(sq)];
|
|
}
|
|
|
|
pce = PIECES.bQ;
|
|
for(pceNum = 0; pceNum < GameBoard.pceNum[pce]; ++pceNum) {
|
|
sq = GameBoard.pList[PCEINDEX(pce,pceNum)];
|
|
score -= RookTable[MIRROR64(SQ64(sq))];
|
|
}
|
|
|
|
if(GameBoard.pceNum[PIECES.wB] >= 2) {
|
|
score += BishopPair;
|
|
}
|
|
|
|
if(GameBoard.pceNum[PIECES.bB] >= 2) {
|
|
score -= BishopPair;
|
|
}
|
|
|
|
if(GameBoard.side == COLOURS.WHITE) {
|
|
return score;
|
|
} else {
|
|
return -score;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|