Subversion Repositories Games.Chess Giants

Rev

Rev 108 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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