Subversion Repositories Games.Chess Giants

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
108 pmbaty 1
#include "chess.h"
2
/* *INDENT-OFF* */
3
/*
4
 ************************************************************
5
 *                                                          *
6
 *  Pawn scoring terms.                                     *
7
 *                                                          *
8
 ************************************************************
9
 */
10
const int pawn_can_promote          = 525;
11
const int pawn_file_width           =   8;
12
const int pawn_unsupported[2]       = { -8, -4 };
13
const int pawn_defects[2][8] = {
14
  { 0, 0, 0, 1, 2, 3, 0, 0 },               /* [black][8] */
15
  { 0, 0, 3, 2, 1, 0, 0, 0 }                /* [white][8] */
16
};
17
const int passed_pawn[8] = { 0, 0, 0, 2, 6, 12, 21, 0 };
18
const int passed_pawn_base[2] = { 4, 8 };
19
const int passed_pawn_free_advance = 8;
20
const int passed_pawn_free_advance_1 = 5;
21
const int passed_pawn_defended = 3;
22
const int passed_pawn_defended_1 = 2;
23
const int passed_pawn_candidate[2][8] = {
24
  { 0, 2, 2,  6, 13, 32, 0, 0 },            /* [mg][rank] */
25
  { 0, 5, 5, 11, 27, 65, 0, 0 }             /* [eg][rank] */
26
};
27
const int pawn_doubled[2][8] = {
28
  { 5,  8,  9,  9,  9,  9,  8,  5},
29
  {17, 19, 19, 19, 19, 19, 19, 17}
30
};
31
const int pawn_isolated[2][8] = {
32
  {14, 21, 23, 23, 23, 23, 21, 14},
33
  {10, 14, 16, 16, 16, 16, 14, 10}
34
};
35
const int pawn_backward[2][8] = {
36
  {12, 17, 19, 19, 19, 19, 17, 12},
37
  { 8, 11, 16, 16, 16, 16, 11,  8}
38
};
39
const int pawn_connected[8][8] = {
40
  {  0,   0,   0,   0,   0,   0,   0,   0},
41
  {  0,   1,   1,   2,   2,   1,   1,   0},
42
  {  1,   2,   2,   3,   3,   2,   2,   1},
43
  {  3,   5,   5,   6,   6,   5,   5,   3},
44
  { 11,  13,  13,  14,  14,  13,  13,  11},
45
  { 25,  27,  27,  28,  28,  27,  27,  25},
46
  { 48,  52,  52,  53,  53,  52,  52,  48},
47
  {  0,   0,   0,   0,   0,   0,   0,   0}
48
};
49
const int pval[2][2][64] = {
50
  {{ 0,   0,   0,   0,   0,   0,   0,   0,
51
   -10,   0,   0,   0,   0,   0,   0, -10,
52
   -10,   0,   0,   0,   0,   0,   0, -10,
53
   -10,   0,   6,  10,  10,   6,   0, -10,  /* [mg][black][64] */
54
   -10,   0,  10,  21,  21,  10,   0, -10,
55
   -10,   0,   7,  11,  11,   7,   0, -10,
56
   -10,   0,   0,   0,   0,   0,   0, -10,
57
     0,   0,   0,   0,   0,   0,   0,   0 },
58
 
59
   { 0,   0,   0,   0,   0,   0,   0,   0,
60
   -10,   0,   0,   0,   0,   0,   0, -10,
61
   -10,   0,   7,  11,  11,   7,   0, -10,
62
   -10,   0,  10,  21,  21,  10,   0, -10,  /* [mg][white][64] */
63
   -10,   0,   6,  10,  10,   6,   0, -10,
64
   -10,   0,   0,   0,   0,   0,   0, -10,
65
   -10,   0,   0,   0,   0,   0,   0, -10,
66
     0,   0,   0,   0,   0,   0,   0,   0 }},
67
 
68
  {{ 0,   0,   0,   0,   0,   0,   0,   0,
69
    -4,   1,   1,   1,   1,   1,   1,  -4,
70
    -4,   1,   1,   1,   1,   1,   1,  -4,
71
    -4,   1,   4,   6,   6,   4,   1,  -4,  /* [eg][black][64] */
72
    -4,   1,   6,  12,  12,   6,   1,  -4,
73
    -4,   1,   5,   7,   7,   5,   1,  -4,
74
    -4,   1,   1,   1,   1,   1,   1,  -4,
75
     0,   0,   0,   0,   0,   0,   0,   0 },
76
 
77
   { 0,   0,   0,   0,   0,   0,   0,   0,
78
    -4,   1,   1,   1,   1,   1,   1,  -4,
79
    -4,   1,   5,   7,   7,   5,   1,  -4,
80
    -4,   1,   6,  12,  12,   6,   1,  -4,  /* [eg][white][64] */
81
    -4,   1,   4,   6,   6,   4,   1,  -4,
82
    -4,   1,   1,   1,   1,   1,   1,  -4,
83
    -4,   1,   1,   1,   1,   1,   1,  -4,
84
     0,   0,   0,   0,   0,   0,   0,   0 }}
85
};
86
/*
87
 ************************************************************
88
 *                                                          *
89
 *  Knight scoring terms.                                   *
90
 *                                                          *
91
 ************************************************************
92
 */
93
const int king_tropism_n[8] = { 3, 3, 3, 2, 1, 0, 0, 0 };
94
const int knight_outpost[2][64] = {
95
  { 0, 0, 0, 0, 0, 0, 0, 0,
96
    0, 0, 0, 0, 0, 0, 0, 0,
97
    0, 1, 4, 4, 4, 4, 1, 0,
98
    0, 2, 6, 8, 8, 6, 2, 0,
99
    0, 1, 4, 4, 4, 4, 1, 0,   /* [black][64] */
100
    0, 0, 0, 0, 0, 0, 0, 0,
101
    0, 0, 0, 0, 0, 0, 0, 0,
102
    0, 0, 0, 0, 0, 0, 0, 0 },
103
 
104
  { 0, 0, 0, 0, 0, 0, 0, 0,
105
    0, 0, 0, 0, 0, 0, 0, 0,
106
    0, 0, 0, 0, 0, 0, 0, 0,
107
    0, 1, 4, 4, 4, 4, 1, 0,
108
    0, 2, 6, 8, 8, 6, 2, 0,   /* [white][64] */
109
    0, 1, 4, 4, 4, 4, 1, 0,
110
    0, 0, 0, 0, 0, 0, 0, 0,
111
    0, 0, 0, 0, 0, 0, 0, 0 }
112
};
113
const int nval[2][2][64] = {
114
  {{ -41, -29, -27, -15, -15, -27, -29, -41,
115
      -9,   4,  14,  20,  20,  14,   4,  -9,
116
      -7,  10,  23,  29,  29,  23,  10,  -7,
117
      -5,  12,  25,  32,  32,  25,  12,  -5,  /* [mg][black][64] */
118
      -5,  10,  23,  28,  28,  23,  10,  -5,
119
      -7,  -2,  19,  19,  19,  19,  -2,  -7,
120
      -9,  -6,  -2,   0,   0,  -2,  -6,  -9,
121
     -31, -29, -27, -25, -25, -27, -29, -31 },
122
 
123
   { -31, -29, -27, -25, -25, -27, -29, -31,
124
      -9,  -6,  -2,   0,   0,  -2,  -6,  -9,
125
      -7,  -2,  19,  19,  19,  19,  -2,  -7,
126
      -5,  10,  23,  28,  28,  23,  10,  -5,  /* [mg][white][64] */
127
      -5,  12,  25,  32,  32,  25,  12,  -5,
128
      -7,  10,  23,  29,  29,  23,  10,  -7,
129
      -9,   4,  14,  20,  20,  14,   4,  -9,
130
     -41, -29, -27, -15, -15, -27, -29, -41 }},
131
 
132
  {{ -41, -29, -27, -15, -15, -27, -29, -41,
133
      -9,   4,  14,  20,  20,  14,   4,  -9,
134
      -7,  10,  23,  29,  29,  23,  10,  -7,
135
      -5,  12,  25,  32,  32,  25,  12,  -5,  /* [eg][black][64] */
136
      -5,  10,  23,  28,  28,  23,  10,  -5,
137
      -7,  -2,  19,  19,  19,  19,  -2,  -7,
138
      -9,  -6,  -2,   0,   0,  -2,  -6,  -9,
139
     -31, -29, -27, -25, -25, -27, -29, -31 },
140
 
141
   { -31, -29, -27, -25, -25, -27, -29, -31,
142
      -9,  -6,  -2,   0,   0,  -2,  -6,  -9,
143
      -7,  -2,  19,  19,  19,  19,  -2,  -7,
144
      -5,  10,  23,  28,  28,  23,  10,  -5,  /* [eg][white][64] */
145
      -5,  12,  25,  32,  32,  25,  12,  -5,
146
      -7,  10,  23,  29,  29,  23,  10,  -7,
147
      -9,   4,  14,  20,  20,  14,   4,  -9,
148
     -41, -29, -27, -15, -15, -27, -29, -41 }}
149
};
150
/*
151
 ************************************************************
152
 *                                                          *
153
 *  Bishop scoring terms.                                   *
154
 *                                                          *
155
 ************************************************************
156
 */
157
const int bishop_trapped            = 174;
158
const int bishop_pawns_on_color[2]  = { 4, 6 };
159
const int bishop_wing_pawns[2]      = { 18, 36 };
160
const int bishop_pair[2]            = { 38, 56 };
161
const int king_tropism_b[8] = { 2, 2, 2, 1, 0, 0, 0, 0 };
162
const int bishop_outpost[2][64] = {
163
  { 0, 0, 0, 0, 0, 0, 0, 0,
164
    0, 0, 0, 0, 0, 0, 0, 0,
165
    0, 1, 3, 3, 3, 3, 1, 0,
166
    0, 3, 5, 5, 5, 5, 3, 0,
167
    0, 1, 2, 2, 2, 2, 1, 0,   /* [black][64] */
168
    0, 0, 1, 1, 1, 1, 0, 0,
169
    0, 0, 0, 0, 0, 0, 0, 0,
170
    0, 0, 0, 0, 0, 0, 0, 0 },
171
 
172
  { 0, 0, 0, 0, 0, 0, 0, 0,
173
    0, 0, 0, 0, 0, 0, 0, 0,
174
    0, 0, 1, 1, 1, 1, 0, 0,
175
    0, 1, 2, 2, 2, 2, 1, 0,
176
    0, 3, 5, 5, 5, 5, 3, 0,   /* [white][64] */
177
    0, 1, 3, 3, 3, 3, 1, 0,
178
    0, 0, 0, 0, 0, 0, 0, 0,
179
    0, 0, 0, 0, 0, 0, 0, 0 }
180
};
181
const int bval[2][2][64] = {
182
  {{  0,   0,   0,   0,   0,   0,   0,   0,
183
      0,   4,   4,   4,   4,   4,   4,   0,
184
      0,   4,   8,   8,   8,   8,   4,   0,
185
      0,   4,   8,  12,  12,   8,   4,   0,
186
      0,   4,   8,  12,  12,   8,   4,   0,  /* [mg][black][64] */
187
      0,   4,   8,   8,   8,   8,   4,   0,
188
      0,   4,   4,   4,   4,   4,   4,   0,
189
    -15, -15, -15, -15, -15, -15, -15, -15},
190
 
191
   {-15, -15, -15, -15, -15, -15, -15, -15,
192
      0,   4,   4,   4,   4,   4,   4,   0,
193
      0,   4,   8,   8,   8,   8,   4,   0,
194
      0,   4,   8,  12,  12,   8,   4,   0,
195
      0,   4,   8,  12,  12,   8,   4,   0,  /* [mg][white][64] */
196
      0,   4,   8,   8,   8,   8,   4,   0,
197
      0,   4,   4,   4,   4,   4,   4,   0,
198
      0,   0,   0,   0,   0,   0,   0,   0}},
199
 
200
  {{  0,   0,   0,   0,   0,   0,   0,   0,
201
      0,   4,   4,   4,   4,   4,   4,   0,
202
      0,   4,   8,   8,   8,   8,   4,   0,
203
      0,   4,   8,  12,  12,   8,   4,   0,
204
      0,   4,   8,  12,  12,   8,   4,   0,  /* [eg][black][64] */
205
      0,   4,   8,   8,   8,   8,   4,   0,
206
      0,   4,   4,   4,   4,   4,   4,   0,
207
    -15, -15, -15, -15, -15, -15, -15, -15},
208
 
209
   {-15, -15, -15, -15, -15, -15, -15, -15,
210
      0,   4,   4,   4,   4,   4,   4,   0,
211
      0,   4,   8,   8,   8,   8,   4,   0,
212
      0,   4,   8,  12,  12,   8,   4,   0,
213
      0,   4,   8,  12,  12,   8,   4,   0,  /* [eg][white][64] */
214
      0,   4,   8,   8,   8,   8,   4,   0,
215
      0,   4,   4,   4,   4,   4,   4,   0,
216
      0,   0,   0,   0,   0,   0,   0,   0}}
217
};
218
/*
219
 ************************************************************
220
 *                                                          *
221
 *  Rook scoring terms.                                     *
222
 *                                                          *
223
 ************************************************************
224
 */
225
const int rook_on_7th[2]          = { 25, 35 };
226
const int rook_connected_7th[2]   = {  6, 10 };
227
const int rook_open_file[2]       = { 35, 20 };
228
const int rook_half_open_file[2]  = { 10, 10 };
229
const int king_tropism_r[8] = { 4, 4, 3, 2, 1, 1, 1, 1 };
230
/*
231
 ************************************************************
232
 *                                                          *
233
 *  Queen scoring terms.                                    *
234
 *                                                          *
235
 ************************************************************
236
 */
237
const int king_tropism_q[8] = { 6, 6, 5, 4, 3, 2, 2, 2 };
238
const int qval[2][2][64] = {
239
   {{ 0,   0,   0,   0,   0,   0,   0,   0,
240
      0,   0,   4,   4,   4,   4,   0,   0,
241
      0,   4,   4,   6,   6,   4,   4,   0,
242
      0,   4,   6,   8,   8,   6,   4,   0,
243
      0,   4,   6,   8,   8,   6,   4,   0,   /* [mg][black][64] */
244
      0,   4,   4,   6,   6,   4,   4,   0,
245
      0,   0,   4,   4,   4,   4,   0,   0,
246
      0,   0,   0,   0,   0,   0,   0,   0 },
247
 
248
    { 0,   0,   0,   0,   0,   0,   0,   0,
249
      0,   0,   4,   4,   4,   4,   0,   0,
250
      0,   4,   4,   6,   6,   4,   4,   0,
251
      0,   4,   6,   8,   8,   6,   4,   0,
252
      0,   4,   6,   8,   8,   6,   4,   0,   /* [mg][white][64] */
253
      0,   4,   4,   6,   6,   4,   4,   0,
254
      0,   0,   4,   4,   4,   4,   0,   0,
255
      0,   0,   0,   0,   0,   0,   0,   0 }},
256
 
257
   {{ 0,   0,   0,   0,   0,   0,   0,   0,
258
      0,   0,   4,   4,   4,   4,   0,   0,
259
      0,   4,   4,   6,   6,   4,   4,   0,
260
      0,   4,   6,   8,   8,   6,   4,   0,
261
      0,   4,   6,   8,   8,   6,   4,   0,   /* [eg][black][64] */
262
      0,   4,   4,   6,   6,   4,   4,   0,
263
      0,   0,   4,   4,   4,   4,   0,   0,
264
      0,   0,   0,   0,   0,   0,   0,   0 },
265
 
266
    { 0,   0,   0,   0,   0,   0,   0,   0,
267
      0,   0,   4,   4,   4,   4,   0,   0,
268
      0,   4,   4,   6,   6,   4,   4,   0,
269
      0,   4,   6,   8,   8,   6,   4,   0,
270
      0,   4,   6,   8,   8,   6,   4,   0,   /* [eg][white][64] */
271
      0,   4,   4,   6,   6,   4,   4,   0,
272
      0,   0,   4,   4,   4,   4,   0,   0,
273
      0,   0,   0,   0,   0,   0,   0,   0 }}
274
};
275
/*
276
 ************************************************************
277
 *                                                          *
278
 *  King scoring terms.                                     *
279
 *                                                          *
280
 ************************************************************
281
 */
282
int king_safety[16][16];
283
const int king_safety_mate_threat = 600;
284
const int king_king_tropism       =  10;
285
const int open_file[8]            = { 6, 5, 4, 4, 4, 4, 5, 6 };
286
const int half_open_file[8] = { 4, 4, 3, 3, 3, 3, 4, 4 };
287
const int safety_vector[16] = {
288
   0,  7, 14, 21, 28, 35, 42,  49,
289
  56, 63, 70, 77, 84, 91, 98, 105
290
};
291
const int tropism_vector[16] = {
292
   0,  1,  2,  3,   4,   5,  11,  20,
293
  32, 47, 65, 86, 110, 137, 167, 200
294
};
295
const int kval[2][64] = {
296
   {-40, -40, -40, -40, -40, -40, -40, -40,
297
    -40, -10, -10, -10, -10, -10, -10, -40,
298
    -40, -10,  60,  60,  60,  60, -10, -40,
299
    -40, -10,  60,  60,  60,  60, -10, -40,
300
    -40, -10,  40,  40,  40,  40, -10, -40,   /* [black][64] */
301
    -40, -10,  20,  20,  20,  20, -10, -40,
302
    -40, -10, -10, -10, -10, -10, -10, -40,
303
    -40, -40, -40, -40, -40, -40, -40, -40 },
304
 
305
   {-40, -40, -40, -40, -40, -40, -40, -40,
306
    -40, -10, -10, -10, -10, -10, -10, -40,
307
    -40, -10,  20,  20,  20,  20, -10, -40,
308
    -40, -10,  40,  40,  40,  40, -10, -40,
309
    -40, -10,  60,  60,  60,  60, -10, -40,   /* [white][64] */
310
    -40, -10,  60,  60,  60,  60, -10, -40,
311
    -40, -10, -10, -10, -10, -10, -10, -40,
312
    -40, -40, -40, -40, -40, -40, -40, -40 }
313
};
314
/*
315
 ************************************************************
316
 *                                                          *
317
 *  Miscellaneous evaluation constants.                     *
318
 *                                                          *
319
 ************************************************************
320
 */
321
const int bad_trade = 90;
322
const int dark_corner[2] =  { FILEA, FILEH };
323
const int light_corner[2] = { FILEH, FILEA };
324
const int direction[2] =    { -8, 8 };
325
const char square_color[64] = {
326
  1, 0, 1, 0, 1, 0, 1, 0,
327
  0, 1, 0, 1, 0, 1, 0, 1,
328
  1, 0, 1, 0, 1, 0, 1, 0,
329
  0, 1, 0, 1, 0, 1, 0, 1,
330
  1, 0, 1, 0, 1, 0, 1, 0,
331
  0, 1, 0, 1, 0, 1, 0, 1,
332
  1, 0, 1, 0, 1, 0, 1, 0,
333
  0, 1, 0, 1, 0, 1, 0, 1
334
};
335
/*
336
 ************************************************************
337
 *                                                          *
338
 *  Opening phase development terms.                        *
339
 *                                                          *
340
 ************************************************************
341
 */
342
const int development_thematic      =     12;
343
const int development_losing_castle =     20;
344
const int development_not_castled   =     20;
345
const int wtm_bonus[2]              = { 5, 8 };
346
/*
347
 ************************************************************
348
 *                                                          *
349
 *  Skill command constants (should not be changed)         *
350
 *                                                          *
351
 ************************************************************
352
 */
353
uint64_t burner[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
354
const int burnc[10] = {128000, 64000, 32400, 15200, 7600,
355
                         3800,  1960,  1040,   480,  140};
356
/*
357
 ************************************************************
358
 *                                                          *
359
 *  Mop-up scoring terms.  These are used in pawnless end-  *
360
 *  games to mate the weaker side.  There is a special PST  *
361
 *  B+N vs lone king to make it easier to win with very     *
362
 *  shallow search depths.                                  *
363
 *                                                          *
364
 ************************************************************
365
 */
366
const char b_n_mate_dark_squares[64] = {
367
  99, 90, 80, 70, 60, 50, 40, 30,
368
  90, 80, 70, 60, 50, 40, 30, 40,
369
  80, 70, 60, 50, 40, 30, 40, 50,
370
  70, 60, 50, 40, 30, 40, 50, 60,
371
  60, 50, 40, 30, 40, 50, 60, 70,
372
  50, 40, 30, 40, 50, 60, 70, 80,
373
  40, 30, 40, 50, 60, 70, 80, 90,
374
  30, 40, 50, 60, 70, 80, 90, 99
375
};
376
const char b_n_mate_light_squares[64] = {
377
  30, 40, 50, 60, 70, 80, 90, 99,
378
  40, 30, 40, 50, 60, 70, 80, 90,
379
  50, 40, 30, 40, 50, 60, 70, 80,
380
  60, 50, 40, 30, 40, 50, 60, 70,
381
  70, 60, 50, 40, 30, 40, 50, 60,
382
  80, 70, 60, 50, 40, 30, 40, 50,
383
  90, 80, 70, 60, 50, 40, 30, 40,
384
  99, 90, 80, 70, 60, 50, 40, 30
385
};
386
const int mate[64] = {
387
  200, 180, 160, 140, 140, 160, 180, 200,
388
  180, 160, 140, 120, 120, 140, 160, 180,
389
  160, 140, 120, 100, 100, 120, 140, 160,
390
  140, 120, 100, 100, 100, 100, 120, 140,
391
  140, 120, 100, 100, 100, 100, 120, 140,
392
  160, 140, 120, 100, 100, 120, 140, 160,
393
  180, 160, 140, 120, 120, 140, 160, 180,
394
  200, 180, 160, 140, 140, 160, 180, 200
395
};
396
/* *INDENT-ON* */