My Project
drop.tcc
Go to the documentation of this file.
1#ifndef _GENERATE_DROP_MOVES_TCC
2#define _GENERATE_DROP_MOVES_TCC
3#include "osl/move_generator/drop.h"
4namespace osl
5{
6 namespace move_generator
7 {
8 namespace drop
9 {
10 /**
11 * Nは有効なptypeの数
12 * http://d.hatena.ne.jp/LS3600/200911 2009-11-10 参照
13 */
14 template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight,int N>
15 void
16 generateX(const NumEffectState& state,Action& action,int x,Move m1,Move m2,Move m3,Ptype t1,Ptype t2,Ptype t3)
17 {
18 assert(hasPawn || hasLance || hasKnight || N>0);
19 if(P==BLACK){
20 if(N>0){
21 Square pos(x,1);
22 Piece p=state.pieceAt(pos);
23 if(p.isEmpty()){
24 if(N==4){
25 action.dropMove(pos,ROOK,P);
26 action.dropMove(pos,BISHOP,P);
27 action.dropMove(pos,GOLD,P);
28 action.dropMove(pos,SILVER,P);
29 }
30 else{
31 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
32 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
33 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
34 }
35 }
36 }
37 if(hasPawn || hasLance || N>0){
38 Square pos(x,2);
39 Piece p=state.pieceAt(pos);
40 if(p.isEmpty()){
41 if(N==4){
42 action.dropMove(pos,ROOK,P);
43 action.dropMove(pos,BISHOP,P);
44 action.dropMove(pos,GOLD,P);
45 action.dropMove(pos,SILVER,P);
46 }
47 else{
48 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
49 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
50 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
51 }
52 if(hasLance)
53 action.dropMove(pos,LANCE,P);
54 if(hasPawn)
55 action.dropMove(pos,PAWN,P);
56 }
57 }
58 for(int y=3;y<=9;y++){
59 Square pos(x,y);
60 Piece p=state.pieceAt(pos);
61 if(p.isEmpty()){
62 if(N==4){
63 action.dropMove(pos,ROOK,P);
64 action.dropMove(pos,BISHOP,P);
65 action.dropMove(pos,GOLD,P);
66 action.dropMove(pos,SILVER,P);
67 }
68 else{
69 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
70 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
71 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
72 }
73 if(hasKnight)
74 action.dropMove(pos,KNIGHT,P);
75 if(hasLance)
76 action.dropMove(pos,LANCE,P);
77 if(hasPawn)
78 action.dropMove(pos,PAWN,P);
79 }
80 }
81 }
82 else{
83 if(N>0){
84 Square pos(x,9);
85 Piece p=state.pieceAt(pos);
86 if(p.isEmpty()){
87 if(N==4){
88 action.dropMove(pos,ROOK,P);
89 action.dropMove(pos,BISHOP,P);
90 action.dropMove(pos,GOLD,P);
91 action.dropMove(pos,SILVER,P);
92 }
93 else{
94 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
95 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
96 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
97 }
98 }
99 }
100 if(hasPawn || hasLance || N>0){
101 Square pos(x,8);
102 Piece p=state.pieceAt(pos);
103 if(p.isEmpty()){
104 if(N==4){
105 action.dropMove(pos,ROOK,P);
106 action.dropMove(pos,BISHOP,P);
107 action.dropMove(pos,GOLD,P);
108 action.dropMove(pos,SILVER,P);
109 }
110 else{
111 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
112 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
113 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
114 }
115 if(hasLance)
116 action.dropMove(pos,LANCE,P);
117 if(hasPawn)
118 action.dropMove(pos,PAWN,P);
119 }
120 }
121 for(int y=7;y>=1;y--){
122 Square pos(x,y);
123 Piece p=state.pieceAt(pos);
124 if(p.isEmpty()){
125 if(N==4){
126 action.dropMove(pos,ROOK,P);
127 action.dropMove(pos,BISHOP,P);
128 action.dropMove(pos,GOLD,P);
129 action.dropMove(pos,SILVER,P);
130 }
131 else{
132 if(N>=1) action.dropMove(pos,t1,P,m1.newAddTo(pos));
133 if(N>=2) action.dropMove(pos,t2,P,m2.newAddTo(pos));
134 if(N>=3) action.dropMove(pos,t3,P,m3.newAddTo(pos));
135 }
136 if(hasKnight)
137 action.dropMove(pos,KNIGHT,P);
138 if(hasLance)
139 action.dropMove(pos,LANCE,P);
140 if(hasPawn)
141 action.dropMove(pos,PAWN,P);
142 }
143 }
144 }
145 }
146
147 template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight,int N>
148 void
149 generate(const NumEffectState& state,Action& action,Move m1,Move m2,Move m3,Ptype t1,Ptype t2,Ptype t3)
150 {
151 if(hasPawn || hasLance || hasKnight || N>0){
152 if(hasPawn){
153 if(hasLance || hasKnight || N>0){
154 for(int x=9;x>0;x--){
155 if(state.isPawnMaskSet<P>(x))
156 generateX<P,Action,false,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
157 else
158 generateX<P,Action,true,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
159 }
160 }
161 else{
162 for(int x=9;x>0;x--){
163 if(!state.isPawnMaskSet<P>(x))
164 generateX<P,Action,true,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
165 }
166 }
167 }
168 else{ // pawnなし
169 for(int x=9;x>0;x--){
170 generateX<P,Action,false,hasLance,hasKnight,N>(state,action,x,m1,m2,m3,t1,t2,t3);
171 }
172 }
173 }
174 }
175
176
177 template<Player P,class Action,bool hasPawn,bool hasLance,bool hasKnight>
178 static void checkSilver(const NumEffectState& state,Action& action)
179 {
180 if(state.template hasPieceOnStand<SILVER>(P)){
181 if(state.template hasPieceOnStand<GOLD>(P)){
182 if(state.template hasPieceOnStand<BISHOP>(P)){
183 if(state.template hasPieceOnStand<ROOK>(P))
184 generate<P,Action,hasPawn,hasLance,hasKnight,4>(
185 state,action,
186 Move::makeDirect(0),Move::makeDirect(0),Move::makeDirect(0),
187 PTYPE_EMPTY,PTYPE_EMPTY,PTYPE_EMPTY);
188 else
189 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
190 state,action,
191 Move(Square::STAND(),BISHOP,P),
192 Move(Square::STAND(),GOLD,P),
193 Move(Square::STAND(),SILVER,P),
194 BISHOP,GOLD,SILVER);
195 }
196 else if(state.template hasPieceOnStand<ROOK>(P))
197 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
198 state,action,
199 Move(Square::STAND(),ROOK,P),
200 Move(Square::STAND(),GOLD,P),
201 Move(Square::STAND(),SILVER,P),
202 ROOK,GOLD,SILVER);
203 else
204 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
205 state,action,
206 Move(Square::STAND(),GOLD,P),
207 Move(Square::STAND(),SILVER,P),
208 Move::makeDirect(0),
209 GOLD,SILVER,PTYPE_EMPTY);
210 }
211 else if(state.template hasPieceOnStand<BISHOP>(P)){
212 if(state.template hasPieceOnStand<ROOK>(P))
213 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
214 state,action,
215 Move(Square::STAND(),ROOK,P),
216 Move(Square::STAND(),BISHOP,P),
217 Move(Square::STAND(),SILVER,P),
218 ROOK,BISHOP,SILVER);
219 else
220 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
221 state,action,
222 Move(Square::STAND(),BISHOP,P),
223 Move(Square::STAND(),SILVER,P),
224 Move::makeDirect(0),
225 BISHOP,SILVER,PTYPE_EMPTY);
226 }
227 else if(state.template hasPieceOnStand<ROOK>(P))
228 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
229 state,action,
230 Move(Square::STAND(),ROOK,P),
231 Move(Square::STAND(),SILVER,P),
232 Move::makeDirect(0),
233 ROOK,SILVER,PTYPE_EMPTY);
234 else
235 generate<P,Action,hasPawn,hasLance,hasKnight,1>(
236 state,action,
237 Move(Square::STAND(),SILVER,P),
238 Move::makeDirect(0),
239 Move::makeDirect(0),
240 SILVER,PTYPE_EMPTY,PTYPE_EMPTY);
241 }
242 else if(state.template hasPieceOnStand<GOLD>(P)){
243 if(state.template hasPieceOnStand<BISHOP>(P)){
244 if(state.template hasPieceOnStand<ROOK>(P))
245 generate<P,Action,hasPawn,hasLance,hasKnight,3>(
246 state,action,
247 Move(Square::STAND(),ROOK,P),
248 Move(Square::STAND(),BISHOP,P),
249 Move(Square::STAND(),GOLD,P),
250 ROOK,BISHOP,GOLD);
251 else
252 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
253 state,action,
254 Move(Square::STAND(),BISHOP,P),
255 Move(Square::STAND(),GOLD,P),
256 Move::makeDirect(0),
257 BISHOP,GOLD,PTYPE_EMPTY);
258 }
259 else if(state.template hasPieceOnStand<ROOK>(P))
260 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
261 state,action,
262 Move(Square::STAND(),ROOK,P),
263 Move(Square::STAND(),GOLD,P),
264 Move::makeDirect(0),
265 ROOK,GOLD,PTYPE_EMPTY);
266 else
267 generate<P,Action,hasPawn,hasLance,hasKnight,1>(
268 state,action,
269 Move(Square::STAND(),GOLD,P),
270 Move::makeDirect(0),
271 Move::makeDirect(0),
272 GOLD,PTYPE_EMPTY,PTYPE_EMPTY);
273 }
274 else if(state.template hasPieceOnStand<BISHOP>(P)){
275 if(state.template hasPieceOnStand<ROOK>(P))
276 generate<P,Action,hasPawn,hasLance,hasKnight,2>(
277 state,action,
278 Move(Square::STAND(),ROOK,P),
279 Move(Square::STAND(),BISHOP,P),
280 Move::makeDirect(0),
281 ROOK,BISHOP,PTYPE_EMPTY);
282 else
283 generate<P,Action,hasPawn,hasLance,hasKnight,1>(
284 state,action,
285 Move(Square::STAND(),BISHOP,P),
286 Move::makeDirect(0),
287 Move::makeDirect(0),
288 BISHOP,PTYPE_EMPTY,PTYPE_EMPTY);
289 }
290 else if(state.template hasPieceOnStand<ROOK>(P))
291 generate<P,Action,hasPawn,hasLance,hasKnight,1>(
292 state,action,
293 Move(Square::STAND(),ROOK,P),
294 Move::makeDirect(0),
295 Move::makeDirect(0),
296 ROOK,PTYPE_EMPTY,PTYPE_EMPTY);
297 else
298 generate<P,Action,hasPawn,hasLance,hasKnight,0>(
299 state,action,
300 Move::makeDirect(0),
301 Move::makeDirect(0),
302 Move::makeDirect(0),
303 PTYPE_EMPTY,PTYPE_EMPTY,PTYPE_EMPTY);
304 }
305
306 template<Player P,class Action,bool hasPawn,bool hasLance>
307 static void checkKnight(const NumEffectState& state,Action& action)
308 {
309 if(state.template hasPieceOnStand<KNIGHT>(P))
310 checkSilver<P,Action,hasPawn,hasLance,true>(state,action);
311 else
312 checkSilver<P,Action,hasPawn,hasLance,false>(state,action);
313 }
314
315 template<Player P,class Action,bool hasPawn>
316 static void checkLance(const NumEffectState& state,Action& action)
317 {
318 if(state.template hasPieceOnStand<LANCE>(P))
319 checkKnight<P,Action,hasPawn,true>(state,action);
320 else
321 checkKnight<P,Action,hasPawn,false>(state,action);
322 }
323
324 } // namespace drop
325 using drop::checkLance;
326
327 template<class Action>
328 template<osl::Player P>
329 void osl::move_generator::Drop<Action>::
330 generate(const NumEffectState& state,Action& action)
331 {
332 if(state.template hasPieceOnStand<PAWN>(P))
333 checkLance<P,Action,true>(state,action);
334 else
335 checkLance<P,Action,false>(state,action);
336 }
337 } // namespace move_generator
338} // namespace osl
339
340#endif /* _GENERATE_DROP_MOVES_TCC */
341// ;;; Local Variables:
342// ;;; mode:c++
343// ;;; c-basic-offset:2
344// ;;; End: