File: drawn.c

package info (click to toggle)
crafty 23.4-10
  • links: PTS, VCS
  • area: non-free
  • in suites: sid
  • size: 3,296 kB
  • sloc: ansic: 30,650; cpp: 5,829; makefile: 890; sh: 46; perl: 30
file content (87 lines) | stat: -rw-r--r-- 4,508 bytes parent folder | download | duplicates (5)
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
#include "chess.h"
#include "data.h"
/* last modified 12/21/09 */
/*
 *******************************************************************************
 *                                                                             *
 *   Drawn() is used to answer the question "is this position a hopeless draw?"*
 *   Several considerations are included in making this decision, but the most *
 *   basic one is simply the remaining material for each side.  If either side *
 *   has pawns, it's not a draw.  With no pawns, equal material is a draw.     *
 *   Otherwise, the superior side must have enough material to be able to force*
 *   a mate.                                                                   *
 *                                                                             *
 *   Drawn() has 0 possible return values:                                     *
 *                                                                             *
 *   0:  Game is not a draw by rule or drawish in nature.                      *
 *                                                                             *
 *   1:  Game is a "technical draw" where material is even with no pawns and   *
 *       the search is also returning draw scores as the best outcome.         *
 *                                                                             *
 *   2:  Game is an "actual draw" by FIDE rules, such as KB vs K, where mate   *
 *       can't be forced, even with worst possible play by one side.           *
 *                                                                             *
 *******************************************************************************
 */
int Drawn(TREE * RESTRICT tree, int value) {
/*
 ************************************************************
 *                                                          *
 *   If either side has pawns, the game is not a draw for   *
 *   lack of material.                                      *
 *                                                          *
 ************************************************************
 */
  if (TotalPieces(white, pawn) || TotalPieces(black, pawn))
    return (0);
/*
 ************************************************************
 *                                                          *
 *   If the score suggests a mate has been found, this is   *
 *   not a draw.                                            *
 *                                                          *
 ************************************************************
 */
  if (Abs(value) > MATE - 1024)
    return (0);
/*
 ************************************************************
 *                                                          *
 *   If neither side has pawns, and one side has some sort  *
 *   of material superiority, then determine if the winning *
 *   side has enough material to win.                       *
 *                                                          *
 ************************************************************
 */
  if (TotalPieces(white, occupied) + TotalPieces(black, occupied) < 4)
    return (2);
  if (TotalPieces(white, occupied) < 5 && TotalPieces(black, occupied) < 5)
    return (1);
  if (TotalPieces(white, occupied) == 5 || TotalPieces(white, occupied) > 6)
    return (0);
  if (TotalPieces(black, occupied) == 5 || TotalPieces(black, occupied) > 6)
    return (0);
  if ((TotalPieces(white, occupied) == 6 && !Bishops(white) && Material > 0)
      || (TotalPieces(black, occupied) == 6 && !Bishops(black) &&
          Material < 0))
    return (1);
/*
 ************************************************************
 *                                                          *
 *   The search result must indicate a draw also, otherwise *
 *   it could be a tactical win or loss, so we will skip    *
 *   calling an equal material (no pawns) position a draw   *
 *   to make sure there is no mate that the search sees.    *
 *                                                          *
 *   If neither side has pawns, then one side must have     *
 *   some sort of material superiority, otherwise it is a   *
 *   draw.                                                  *
 *                                                          *
 ************************************************************
 */
  if (value != DrawScore(wtm))
    return (0);
  if (TotalPieces(white, occupied) == TotalPieces(black, occupied))
    return (1);
  return (0);
}