Rev 33 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 33 | Rev 108 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #include "chess.h" |
1 | #include "chess.h" |
2 | #include "data.h" |
2 | #include "data.h" |
3 | /* last modified |
3 | /* last modified 04/29/15 */ |
4 | /* |
4 | /* |
5 | ******************************************************************************* |
5 | ******************************************************************************* |
6 | * * |
6 | * * |
7 | * Repeat() is used to detect a draw by repetition. The repetition list is * |
7 | * Repeat() is used to detect a draw by repetition. The repetition list is * |
8 | * a simple 1d array that contains the Zobrist signatures for each position * |
8 | * a simple 1d array that contains the Zobrist signatures for each position * |
Line 30... | Line 30... | ||
30 | * in Iterate() or repetition detection will be broken. * |
30 | * in Iterate() or repetition detection will be broken. * |
31 | * * |
31 | * * |
32 | ******************************************************************************* |
32 | ******************************************************************************* |
33 | */ |
33 | */ |
34 | int Repeat(TREE * RESTRICT tree, int ply) { |
34 | int Repeat(TREE * RESTRICT tree, int ply) { |
35 | int where; |
35 | int where, count; |
36 | 36 | ||
37 | /* |
37 | /* |
38 | ************************************************************ |
38 | ************************************************************ |
39 | * * |
39 | * * |
40 | * If the 50-move rule has been reached, then adjust the * |
40 | * If the 50-move rule has been reached, then adjust the * |
Line 43... | Line 43... | ||
43 | * irreversible move, there is no way to repeat a prior * |
43 | * irreversible move, there is no way to repeat a prior * |
44 | * position. * |
44 | * position. * |
45 | * * |
45 | * * |
46 | ************************************************************ |
46 | ************************************************************ |
47 | */ |
47 | */ |
48 | tree->rep_list[ |
48 | tree->rep_list[rep_index + ply] = HashKey; |
49 | if (Reversible(ply) < 4) |
49 | if (Reversible(ply) < 4) |
50 | return 0; |
50 | return 0; |
51 | if (Reversible(ply) > 99) |
51 | if (Reversible(ply) > 99) |
52 | return 2; |
52 | return 2; |
53 | /* |
53 | /* |
Line 63... | Line 63... | ||
63 | * beyond the last capture/pawn move since there can not * |
63 | * beyond the last capture/pawn move since there can not * |
64 | * possibly be a repeat beyond that point. * |
64 | * possibly be a repeat beyond that point. * |
65 | * * |
65 | * * |
66 | ************************************************************ |
66 | ************************************************************ |
67 | */ |
67 | */ |
68 |
|
68 | count = Reversible(ply) / 2 - 1; |
69 |
|
69 | for (where = rep_index + ply - 4; count; where -= 2, count--) { |
70 | if (HashKey == tree->rep_list[where]) |
70 | if (HashKey == tree->rep_list[where]) |
71 | return 1; |
71 | return 1; |
- | 72 | } |
|
72 | return 0; |
73 | return 0; |
73 | } |
74 | } |
74 | 75 | ||
75 | /* last modified 05/08/14 */ |
76 | /* last modified 05/08/14 */ |
76 | /* |
77 | /* |
Line 82... | Line 83... | ||
82 | * position.) This is used to actually claim a draw by repetition or by the * |
83 | * position.) This is used to actually claim a draw by repetition or by the * |
83 | * 50 move rule. * |
84 | * 50 move rule. * |
84 | * * |
85 | * * |
85 | ******************************************************************************* |
86 | ******************************************************************************* |
86 | */ |
87 | */ |
87 | int Repeat3x(TREE * RESTRICT tree |
88 | int Repeat3x(TREE * RESTRICT tree) { |
88 | int reps, where; |
89 | int reps = 0, where; |
89 | 90 | ||
90 | /* |
91 | /* |
91 | ************************************************************ |
92 | ************************************************************ |
92 | * * |
93 | * * |
93 | * If the 50-move rule has been reached, then return an * |
94 | * If the 50-move rule has been reached, then return an * |
Line 106... | Line 107... | ||
106 | * other entry since the position has to be repeated 3x * |
107 | * other entry since the position has to be repeated 3x * |
107 | * with the SAME side on move. * |
108 | * with the SAME side on move. * |
108 | * * |
109 | * * |
109 | ************************************************************ |
110 | ************************************************************ |
110 | */ |
111 | */ |
111 | reps = 0; |
- | |
112 | for (where = |
112 | for (where = rep_index % 2; where < rep_index; where += 2) |
113 | if (HashKey == tree->rep_list[where]) |
113 | if (HashKey == tree->rep_list[where]) |
114 | reps++; |
114 | reps++; |
115 | return reps == 2; |
115 | return reps == 2; |
116 | } |
116 | } |