-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevaluate.cpp
More file actions
112 lines (99 loc) · 3.29 KB
/
evaluate.cpp
File metadata and controls
112 lines (99 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "evaluate.h"
#include <bit>
static const int PAWN_TABLE[64] = {
0, 0, 0, 0, 0, 0, 0, 0,
50, 50, 50, 50, 50, 50, 50, 50,
10, 10, 20, 30, 30, 20, 10, 10,
5, 5, 10, 25, 25, 10, 5, 5,
0, 0, 0, 20, 20, 0, 0, 0,
5, -5,-10, 0, 0,-10, -5, 5,
5, 10, 10,-20,-20, 10, 10, 5,
0, 0, 0, 0, 0, 0, 0, 0
};
static const int KNIGHT_TABLE[64] = {
-50,-40,-30,-30,-30,-30,-40,-50,
-40,-20, 0, 0, 0, 0,-20,-40,
-30, 0, 10, 15, 15, 10, 0,-30,
-30, 5, 15, 20, 20, 15, 5,-30,
-30, 0, 15, 20, 20, 15, 0,-30,
-30, 5, 10, 15, 15, 10, 5,-30,
-40,-20, 0, 5, 5, 0,-20,-40,
-50,-40,-30,-30,-30,-30,-40,-50
};
static const int BISHOP_TABLE[64] = {
-20,-10,-10,-10,-10,-10,-10,-20,
-10, 0, 0, 0, 0, 0, 0,-10,
-10, 0, 5, 10, 10, 5, 0,-10,
-10, 5, 5, 10, 10, 5, 5,-10,
-10, 0, 10, 10, 10, 10, 0,-10,
-10, 10, 10, 10, 10, 10, 10,-10,
-10, 5, 0, 0, 0, 0, 5,-10,
-20,-10,-10,-10,-10,-10,-10,-20
};
static const int ROOK_TABLE[64] = {
0, 0, 0, 0, 0, 0, 0, 0,
5, 10, 10, 10, 10, 10, 10, 5,
-5, 0, 0, 0, 0, 0, 0, -5,
-5, 0, 0, 0, 0, 0, 0, -5,
-5, 0, 0, 0, 0, 0, 0, -5,
-5, 0, 0, 0, 0, 0, 0, -5,
-5, 0, 0, 0, 0, 0, 0, -5,
0, 0, 0, 5, 5, 0, 0, 0
};
static const int QUEEN_TABLE[64] = {
-20,-10,-10, -5, -5,-10,-10,-20,
-10, 0, 0, 0, 0, 0, 0,-10,
-10, 0, 5, 5, 5, 5, 0,-10,
-5, 0, 5, 5, 5, 5, 0, -5,
0, 0, 5, 5, 5, 5, 0, -5,
-10, 5, 5, 5, 5, 5, 0,-10,
-10, 0, 5, 0, 0, 0, 0,-10,
-20,-10,-10, -5, -5,-10,-10,-20
};
static const int KING_MIDDLE_TABLE[64] = {
-30,-40,-40,-50,-50,-40,-40,-30,
-30,-40,-40,-50,-50,-40,-40,-30,
-30,-40,-40,-50,-50,-40,-40,-30,
-30,-40,-40,-50,-50,-40,-40,-30,
-20,-30,-30,-40,-40,-30,-30,-20,
-10,-20,-20,-20,-20,-20,-20,-10,
20, 20, 0, 0, 0, 0, 20, 20,
20, 30, 10, 0, 0, 10, 30, 20
};
// Mirror for black
static constexpr int mirror(int sq) {
return sq ^ 56; // Flips rank
}
static int pieceSquareBonus(PieceType pt, Colour c, Square sq) {
int idx = (c == Colour::White) ? sq : mirror(sq);
switch (pt) {
case PieceType::Pawn: return PAWN_TABLE[idx];
case PieceType::Knight: return KNIGHT_TABLE[idx];
case PieceType::Bishop: return BISHOP_TABLE[idx];
case PieceType::Rook: return ROOK_TABLE[idx];
case PieceType::Queen: return QUEEN_TABLE[idx];
case PieceType::King: return KING_MIDDLE_TABLE[idx];
default: return 0;
}
}
static constexpr int PIECE_VALUES[6] = {
PAWN_VALUE, KNIGHT_VALUE, BISHOP_VALUE,
ROOK_VALUE, QUEEN_VALUE, KING_VALUE
};
int evaluate(const Position& pos) {
int score = 0;
for (int c = 0; c < 2; c++) {
int sign = (c == static_cast<int>(pos.sideToMove)) ? 1 : -1;
Colour colour = static_cast<Colour>(c);
for (int pt = 0; pt < 6; pt++) {
Bitboard bb = pos.getPieces(colour, static_cast<PieceType>(pt));
while (bb) {
Square sq = popLsb(bb);
score += sign * (PIECE_VALUES[pt] +
pieceSquareBonus(static_cast<PieceType>(pt),
colour, sq));
}
}
}
return score;
}