~ubuntu-branches/ubuntu/utopic/fruit/utopic

« back to all changes in this revision

Viewing changes to src/move_legal.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Oliver Korff
  • Date: 2005-10-07 19:40:10 UTC
  • Revision ID: james.westby@ubuntu.com-20051007194010-a99a9utegtl89htk
Tags: upstream-2.1
ImportĀ upstreamĀ versionĀ 2.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
// move_legal.cpp
 
3
 
 
4
// includes
 
5
 
 
6
#include "attack.h"
 
7
#include "colour.h"
 
8
#include "fen.h"
 
9
#include "list.h"
 
10
#include "move.h"
 
11
#include "move_do.h"
 
12
#include "move_gen.h"
 
13
#include "move_legal.h"
 
14
#include "piece.h"
 
15
#include "square.h"
 
16
#include "util.h"
 
17
 
 
18
// prototypes
 
19
 
 
20
static bool move_is_pseudo_debug (int move, board_t * board);
 
21
 
 
22
// functions
 
23
 
 
24
// move_is_pseudo()
 
25
 
 
26
bool move_is_pseudo(int move, board_t * board) {
 
27
 
 
28
   int me, opp;
 
29
   int from, to;
 
30
   int piece, capture;
 
31
   int inc, delta;
 
32
 
 
33
   ASSERT(move_is_ok(move));
 
34
   ASSERT(board!=NULL);
 
35
 
 
36
   ASSERT(!board_is_check(board));
 
37
 
 
38
   // special cases
 
39
 
 
40
   if (MOVE_IS_SPECIAL(move)) {
 
41
      return move_is_pseudo_debug(move,board);
 
42
   }
 
43
 
 
44
   ASSERT((move&~07777)==0);
 
45
 
 
46
   // init
 
47
 
 
48
   me = board->turn;
 
49
   opp = COLOUR_OPP(board->turn);
 
50
 
 
51
   // from
 
52
 
 
53
   from = MOVE_FROM(move);
 
54
   ASSERT(SQUARE_IS_OK(from));
 
55
 
 
56
   piece = board->square[from];
 
57
   if (!COLOUR_IS(piece,me)) return false;
 
58
 
 
59
   ASSERT(piece_is_ok(piece));
 
60
 
 
61
   // to
 
62
 
 
63
   to = MOVE_TO(move);
 
64
   ASSERT(SQUARE_IS_OK(to));
 
65
 
 
66
   capture = board->square[to];
 
67
   if (COLOUR_IS(capture,me)) return false;
 
68
 
 
69
   // move
 
70
 
 
71
   if (PIECE_IS_PAWN(piece)) {
 
72
 
 
73
      if (SQUARE_IS_PROMOTE(to)) return false;
 
74
 
 
75
      inc = PAWN_MOVE_INC(me);
 
76
      delta = to - from;
 
77
      ASSERT(delta_is_ok(delta));
 
78
 
 
79
      if (capture == Empty) {
 
80
 
 
81
         // pawn push
 
82
 
 
83
         if (delta == inc) return true;
 
84
 
 
85
         if (delta == (2*inc)
 
86
          && PAWN_RANK(from,me) == Rank2
 
87
          && board->square[from+inc] == Empty) {
 
88
            return true;
 
89
         }
 
90
 
 
91
      } else {
 
92
 
 
93
         // pawn capture
 
94
 
 
95
         if (delta == (inc-1) || delta == (inc+1)) return true;
 
96
      }
 
97
 
 
98
   } else {
 
99
 
 
100
      if (PIECE_ATTACK(board,piece,from,to)) return true;
 
101
   }
 
102
 
 
103
   return false;
 
104
}
 
105
 
 
106
// quiet_is_pseudo()
 
107
 
 
108
bool quiet_is_pseudo(int move, board_t * board) {
 
109
 
 
110
   int me, opp;
 
111
   int from, to;
 
112
   int piece;
 
113
   int inc, delta;
 
114
 
 
115
   ASSERT(move_is_ok(move));
 
116
   ASSERT(board!=NULL);
 
117
 
 
118
   ASSERT(!board_is_check(board));
 
119
 
 
120
   // special cases
 
121
 
 
122
   if (MOVE_IS_CASTLE(move)) {
 
123
      return move_is_pseudo_debug(move,board);
 
124
   } else if (MOVE_IS_SPECIAL(move)) {
 
125
      return false;
 
126
   }
 
127
 
 
128
   ASSERT((move&~07777)==0);
 
129
 
 
130
   // init
 
131
 
 
132
   me = board->turn;
 
133
   opp = COLOUR_OPP(board->turn);
 
134
 
 
135
   // from
 
136
 
 
137
   from = MOVE_FROM(move);
 
138
   ASSERT(SQUARE_IS_OK(from));
 
139
 
 
140
   piece = board->square[from];
 
141
   if (!COLOUR_IS(piece,me)) return false;
 
142
 
 
143
   ASSERT(piece_is_ok(piece));
 
144
 
 
145
   // to
 
146
 
 
147
   to = MOVE_TO(move);
 
148
   ASSERT(SQUARE_IS_OK(to));
 
149
 
 
150
   if (board->square[to] != Empty) return false; // capture
 
151
 
 
152
   // move
 
153
 
 
154
   if (PIECE_IS_PAWN(piece)) {
 
155
 
 
156
      if (SQUARE_IS_PROMOTE(to)) return false;
 
157
 
 
158
      inc = PAWN_MOVE_INC(me);
 
159
      delta = to - from;
 
160
      ASSERT(delta_is_ok(delta));
 
161
 
 
162
      // pawn push
 
163
 
 
164
      if (delta == inc) return true;
 
165
 
 
166
      if (delta == (2*inc)
 
167
       && PAWN_RANK(from,me) == Rank2
 
168
       && board->square[from+inc] == Empty) {
 
169
         return true;
 
170
      }
 
171
 
 
172
   } else {
 
173
 
 
174
      if (PIECE_ATTACK(board,piece,from,to)) return true;
 
175
   }
 
176
 
 
177
   return false;
 
178
}
 
179
 
 
180
// pseudo_is_legal()
 
181
 
 
182
bool pseudo_is_legal(int move, board_t * board) {
 
183
 
 
184
   int me, opp;
 
185
   int from, to;
 
186
   int piece;
 
187
   bool legal;
 
188
   int king;
 
189
   undo_t undo[1];
 
190
 
 
191
   ASSERT(move_is_ok(move));
 
192
   ASSERT(board!=NULL);
 
193
 
 
194
   // init
 
195
 
 
196
   me = board->turn;
 
197
   opp = COLOUR_OPP(me);
 
198
 
 
199
   from = MOVE_FROM(move);
 
200
   to = MOVE_TO(move);
 
201
 
 
202
   piece = board->square[from];
 
203
   ASSERT(COLOUR_IS(piece,me));
 
204
 
 
205
   // slow test for en-passant captures
 
206
 
 
207
   if (MOVE_IS_EN_PASSANT(move)) {
 
208
 
 
209
      move_do(board,move,undo);
 
210
      legal = !IS_IN_CHECK(board,me);
 
211
      move_undo(board,move,undo);
 
212
 
 
213
      return legal;
 
214
   }
 
215
 
 
216
   // king moves (including castle)
 
217
 
 
218
   if (PIECE_IS_KING(piece)) {
 
219
 
 
220
      legal = !is_attacked(board,to,opp);
 
221
 
 
222
      if (DEBUG) {
 
223
         ASSERT(board->square[from]==piece);
 
224
         board->square[from] = Empty;
 
225
         ASSERT(legal==!is_attacked(board,to,opp));
 
226
         board->square[from] = piece;
 
227
      }
 
228
 
 
229
      return legal;
 
230
   }
 
231
 
 
232
   // pins
 
233
 
 
234
   if (is_pinned(board,from,me)) {
 
235
      king = KING_POS(board,me);
 
236
      return DELTA_INC_LINE(king-to) == DELTA_INC_LINE(king-from); // does not discover the line
 
237
   }
 
238
 
 
239
   return true;
 
240
}
 
241
 
 
242
// move_is_pseudo_debug()
 
243
 
 
244
static bool move_is_pseudo_debug(int move, board_t * board) {
 
245
 
 
246
   list_t list[1];
 
247
 
 
248
   ASSERT(move_is_ok(move));
 
249
   ASSERT(board!=NULL);
 
250
 
 
251
   ASSERT(!board_is_check(board));
 
252
 
 
253
   gen_moves(list,board);
 
254
 
 
255
   return list_contain(list,move);
 
256
}
 
257
 
 
258
// end of move_legal.cpp
 
259