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"
4 namespace 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: