My Project
ptypeTraits.h
Go to the documentation of this file.
1/* ptypeTraits.h
2 */
3#ifndef OSL_PTYPETRAITS_H
4#define OSL_PTYPETRAITS_H
5
6#include "osl/basic_type.h"
8
9namespace osl
10{
11 template<Ptype T>
13
14 template <>
16 {
17 static const bool isBasic=false;
18 static const bool canPromote=false;
20 static const bool betterToPromote=false;
21 static const char *name() { return "PTYPE_EMPTY";}
22 static const char *csaName() { return "..";}
23 static const int moveMask=0;
24 };
25
26 template <>
28 {
29 static const bool isBasic=false;
30 static const bool canPromote=false;
31 static const bool betterToPromote=false;
32 static const char *name() { return "PTYPE_EDGE";}
33 static const char *csaName() { return "XX";}
34 static const int moveMask=0;
35 };
36
37 template <>
39 {
40 static const bool isBasic=true;
41 static const bool canPromote=false;
42 static const bool betterToPromote=false;
43 static const Ptype moveType=GOLD;
44 static const char *name() { return "GOLD";}
45 static const char *csaName() { return "KI";}
46 static const int indexMin=26;
47 static const int indexLimit=30;
48 static const int dropBlackFromY=1;
49 static const int dropBlackToY=9;
50 static const Ptype basicType=GOLD;
51 static const int moveMask=
55 };
56
57 template <>
59 {
60 static const bool isBasic=true;
61 static const bool canPromote=true;
62 static const bool betterToPromote=true;
63 static const Ptype moveType=PAWN;
64 static const Ptype basicType=PAWN;
65 static const char *name() { return "PAWN";}
66 static const char *csaName() { return "FU";}
67 static const int indexMin=0;
68 static const int indexLimit=18;
69 static const int dropBlackFromY=2;
70 static const int dropBlackToY=9;
71 static const int mayPromoteToY=4;
72 static const int moveMask=DirectionTraits<U>::mask;
73 };
74
75 template <>
77 {
78 static const bool isBasic=false;
79 static const bool canPromote=false;
80 // 疑問 falseの方がよいのでは?
81 static const bool betterToPromote=true;
82 static const Ptype moveType=GOLD;
83 static const char *name() { return "PPAWN";}
84 static const char *csaName() { return "TO";}
85 static const int moveMask=PtypeTraits<GOLD>::moveMask;
86 static const Ptype basicType=PAWN;
87 static const int indexMin=PtypeTraits<basicType>::indexMin;
88 };
89
90 template <>
92 {
93 static const bool isBasic=true;
94 static const bool canPromote=true;
95 static const bool betterToPromote=false;
96 static const Ptype moveType=LANCE;
97 static const Ptype basicType=LANCE;
98 static const char *name() { return "LANCE";}
99 static const char *csaName() { return "KY";}
100 static const int indexMin=32;
101 static const int indexLimit=36;
102 static const int dropBlackFromY=2;
103 static const int dropBlackToY=9;
104 static const int mayPromoteToY=9;
105 static const int moveMask=DirectionTraits<LONG_U>::mask;
106 };
107
108 template <>
110 {
111 static const bool isBasic=false;
112 static const bool canPromote=false;
113 static const bool betterToPromote=false;
114 static const Ptype moveType=GOLD;
115 static const char *name() { return "PLANCE";}
116 static const char *csaName() { return "NY";}
117 static const int moveMask=PtypeTraits<GOLD>::moveMask;
118 static const Ptype basicType=LANCE;
119 static const int indexMin=PtypeTraits<basicType>::indexMin;
120 };
121
122 template <>
124 {
125 static const bool isBasic=true;
126 static const bool canPromote=true;
127 static const bool betterToPromote=false;
128 static const Ptype moveType=KNIGHT;
129 static const Ptype basicType=KNIGHT;
130 static const char *name() { return "KNIGHT";}
131 static const char *csaName() { return "KE";}
132 static const int indexMin=18;
133 static const int indexLimit=22;
134 static const int dropBlackFromY=3;
135 static const int dropBlackToY=9;
136 static const int mayPromoteToY=5;
138 };
139
140 template <>
142 {
143 static const bool isBasic=false;
144 static const bool canPromote=false;
145 static const bool betterToPromote=false;
146 static const Ptype moveType=GOLD;
147 static const char *name() { return "PKNIGHT";}
148 static const char *csaName() { return "NK";}
149 static const int moveMask=PtypeTraits<GOLD>::moveMask;
150 static const Ptype basicType=KNIGHT;
151 static const int indexMin=PtypeTraits<basicType>::indexMin;
152 };
153
154 template <>
156 {
157 static const bool isBasic=true;
158 static const bool canPromote=true;
159 static const bool betterToPromote=false;
160 static const Ptype moveType=SILVER;
161 static const Ptype basicType=SILVER;
162 static const char *name() { return "SILVER";}
163 static const char *csaName() { return "GI";}
164 static const int indexMin=22;
165 static const int indexLimit=26;
166 static const int dropBlackFromY=1;
167 static const int dropBlackToY=9;
168 static const int mayPromoteToY=4;
169 static const int moveMask=
173 };
174
175 template <>
177 {
178 static const bool isBasic=false;
179 static const bool canPromote=false;
180 static const bool betterToPromote=false;
181 static const Ptype moveType=GOLD;
182 static const char *name() { return "PSILVER";}
183 static const char *csaName() { return "NG";}
184 static const int moveMask=PtypeTraits<GOLD>::moveMask;
185 static const Ptype basicType=SILVER;
186 static const int indexMin=PtypeTraits<basicType>::indexMin;
187 };
188
189 template <>
191 {
192 static const bool isBasic=true;
193 static const bool canPromote=true;
194 static const bool betterToPromote=true;
195 static const Ptype moveType=BISHOP;
196 static const Ptype basicType=BISHOP;
197 static const char *name() { return "BISHOP";}
198 static const char *csaName() { return "KA";}
199 static const int indexMin=36;
200 static const int indexLimit=38;
201 static const int dropBlackFromY=1;
202 static const int dropBlackToY=9;
203 static const int mayPromoteToY=9;
204 static const int moveMask=
207 };
208
209 template <>
211 {
212 static const bool isBasic=false;
213 static const bool canPromote=false;
214 // 疑問 falseの方がよいのでは?
215 static const bool betterToPromote=true;
216 static const Ptype moveType=PBISHOP;
217 static const char *name() { return "PBISHOP";}
218 static const char *csaName() { return "UM";}
219 static const int moveMask=
224 static const Ptype basicType=BISHOP;
225 static const int indexMin=PtypeTraits<basicType>::indexMin;
226 };
227
228 template <>
230 {
231 static const bool isBasic=true;
232 static const bool canPromote=true;
233 static const bool betterToPromote=true;
234 static const Ptype moveType=ROOK;
235 static const Ptype basicType=ROOK;
236 static const char *name() { return "ROOK";}
237 static const char *csaName() { return "HI";}
238 static const int indexMin=38;
239 static const int indexLimit=40;
240 static const int dropBlackFromY=1;
241 static const int dropBlackToY=9;
242 static const int mayPromoteToY=9;
243 static const int moveMask=
246 };
247
248 template <>
250 {
251 static const bool isBasic=false;
252 static const bool canPromote=false;
253 // 疑問 falseの方がよいのでは?
254 static const bool betterToPromote=true;
255 static const Ptype moveType=PROOK;
256 static const char *name() { return "PROOK";}
257 static const char *csaName() { return "RY";}
258 static const int moveMask=
263 static const Ptype basicType=ROOK;
264 static const int indexMin=PtypeTraits<basicType>::indexMin;
265 };
266
267
268 template <>
270 {
271 static const bool isBasic=true;
272 static const bool canPromote=false;
273 static const bool betterToPromote=false;
274 static const Ptype moveType=KING;
275 static const Ptype basicType=KING;
276 static const char *name() { return "KING";}
277 static const char *csaName() { return "OU";}
278 static const int indexMin=30;
279 static const int indexLimit=32;
280 static const int dropBlackFromY=1;
281 static const int dropBlackToY=9;
282 static const int moveMask=
287 };
288
289 template<Ptype T,bool IsBasic>
291
292 template<Ptype T>
293 struct PtypeFunsSub<T,true>
294 {
295 static const uint64_t indexMask=(((unsigned long long) -1)<<(PtypeTraits<T>::indexMin))^(((unsigned long long) -1)<<(PtypeTraits<T>::indexLimit));
296 static const Ptype promotePtype=static_cast<Ptype>(static_cast<int>(T)-8);
297 static const Ptype basicType = T;
298 };
299
300 template<Ptype T>
301 struct PtypeFunsSub<T,false>
302 {
303 static const uint64_t indexMask=static_cast<uint64_t>(0);
304 // static const Ptype promotePtype=PTYPE_EMPTY;
305 static const Ptype promotePtype=T;
306 static const Ptype basicType = PtypeTraits<T>::basicType;
307 };
308
309 template<Ptype T>
311 {
312#if OSL_WORDSIZE == 64
313 static const unsigned int indexNum=0;
314#elif OSL_WORDSIZE == 32
315 static const unsigned int indexNum=(PtypeTraits<T>::indexMin >> 5);
316#endif
317 static const bool hasLongMove=(PtypeTraits<T>::indexMin>=32);
321 };
322
337
338 template<Ptype T,Direction D>
353
354
355 template<Player T>
357 {
359 };
360
361 template<Ptype T,Player P>
363 {
364 static bool canDropTo(Square pos)
365 {
366 static_assert(PtypeTraits<T>::isBasic, "canDropTo");
368 return true;
369
370 if (P==BLACK)
371 return pos.y() >= PtypeTraits<T>::dropBlackFromY;
372 else
374 }
379 static bool mayPromote(Square pos)
380 {
381 static_assert(PtypeTraits<T>::isBasic&&PtypeTraits<T>::canPromote, "mayPromote");
383 return true;
384
385 if (P==BLACK)
386 return pos.y() <= PtypeTraits<T>::mayPromoteToY;
387 else
389 }
393 static bool mustPromote(Square pos)
394 {
395 if(P==BLACK){
396 if(T==PAWN || T==LANCE) return pos.yEq<2>();
397 else if(T==KNIGHT) return pos.yLe<4>();
398 else return false;
399 }
400 else{
401 if(T==PAWN || T==LANCE) return pos.yEq<8>();
402 else if(T==KNIGHT) return pos.yGe<6>();
403 else return false;
404 }
405 }
409 static bool canPromote(Square pos)
410 {
411 if(P==BLACK){
412 if(T==PAWN || T==LANCE) return pos.yLe<4>();
413 else if(T==KNIGHT) return pos.yLe<5>();
414 else return pos.yLe<3>();
415 }
416 else{
417 if(T==PAWN || T==LANCE) return pos.yGe<6>();
418 else if(T==KNIGHT) return pos.yGe<5>();
419 else return pos.yGe<7>();
420 }
421 }
426 static bool checkPromote(Square pos)
427 {
428 if(P==BLACK){
429 if(T==SILVER) return pos.yEq<4>();
430 else if(T==LANCE || T==ROOK || T==BISHOP)
431 return true;
432 else return false;
433 }
434 else{
435 if(T==SILVER) return pos.yEq<6>();
436 else if(T==LANCE || T==ROOK || T==BISHOP)
437 return true;
438 else return false;
439 }
440 }
444 static bool noPromote(Square pos)
445 {
446 if(P==BLACK){
447 if(T==PAWN || T==SILVER) return pos.yGe<5>();
448 else if(T==KNIGHT) return pos.yGe<6>();
449 else if(T==LANCE || T==ROOK || T==BISHOP) return false;
450 else return true;
451 }
452 else{
453 if(T==PAWN || T==SILVER) return pos.yLe<5>();
454 else if(T==KNIGHT) return pos.yLe<4>();
455 else if(T==LANCE || T==ROOK || T==BISHOP) return false;
456 else return true;
457 }
458 }
459 };
460
461
462} // namespace osl
463
464#endif /* OSL_PTYPETRAITS_H */
465// ;;; Local Variables:
466// ;;; mode:c++
467// ;;; c-basic-offset:2
468// ;;; End:
std::enable_if< Y!=7, bool >::type yGe()
Definition basic_type.h:738
int y() const
将棋としてのY座標を返す.
Definition basic_type.h:567
static int reverseY(int y)
Definition basic_type.h:652
std::enable_if< Y!=2, bool >::type yLe()
Definition basic_type.h:730
Ptype
駒の種類を4ビットでコード化する
Definition basic_type.h:84
@ ROOK
Definition basic_type.h:100
@ PPAWN
Definition basic_type.h:87
@ BISHOP
Definition basic_type.h:99
@ PROOK
Definition basic_type.h:92
@ PAWN
Definition basic_type.h:95
@ PTYPE_EDGE
Definition basic_type.h:86
@ KING
Definition basic_type.h:93
@ KNIGHT
Definition basic_type.h:97
@ PTYPE_EMPTY
Definition basic_type.h:85
@ SILVER
Definition basic_type.h:98
@ PKNIGHT
Definition basic_type.h:89
@ GOLD
Definition basic_type.h:94
@ PLANCE
Definition basic_type.h:88
@ PBISHOP
Definition basic_type.h:91
@ LANCE
Definition basic_type.h:96
@ PSILVER
Definition basic_type.h:90
bool canPromote(Ptype ptype)
ptypeがpromote可能な型かどうかのチェック promote済みの場合はfalseを返す
Definition basic_type.h:147
constexpr int playerToIndex(Player player)
Definition basic_type.h:16
@ BLACK
Definition basic_type.h:9
bool isBasic(Ptype ptype)
ptypeが基本型(promoteしていない)かのチェック
Definition basic_type.h:128
MoveConstraint
ある方向にある駒が移動可能かを表す.
@ NoConstraint
promoteしていようが,いまいが可能
@ OnlyBasic
promoteしていない駒の場合にのみ可能
@ OnlyPromoted
promote済みの駒の場合にのみ可能
@ CannotMove
可能でない
static const int index
static const bool hasMove
static const bool canMove
static const MoveConstraint moveConstraint
static const Ptype promotePtype
static const Ptype basicType
static const uint64_t indexMask
static const bool hasLongMove
static bool canDropTo(Square pos)
static bool checkPromote(Square pos)
posにあるTの駒がpromote可能なdirectionに動く時だけpromote可能 shortの時はその時のみYES
static bool canPromote(Square pos)
posにあるTの駒がどの方向に動いてもpromote可能
static bool mayPromote(Square pos)
posにある駒がpromoteする可能性があるか? 先手BISHOPが49,58,59,69などにいる場合は可能性がないが,この時点では排除しない
static bool noPromote(Square pos)
posにあるTの駒は次に絶対にpromoteできない
static bool mustPromote(Square pos)
posにあるTの駒がpromoteする手しかない
static const char * name()
static const char * csaName()
static const char * csaName()
Definition ptypeTraits.h:45
static const char * name()
Definition ptypeTraits.h:44
static const char * name()
static const char * csaName()
static const char * csaName()
static const char * name()
static const char * csaName()
Definition ptypeTraits.h:99
static const char * name()
Definition ptypeTraits.h:98
static const char * csaName()
Definition ptypeTraits.h:66
static const char * name()
Definition ptypeTraits.h:65
static const char * csaName()
static const char * name()
static const char * csaName()
static const char * name()
static const char * name()
static const char * csaName()
static const char * csaName()
Definition ptypeTraits.h:84
static const char * name()
Definition ptypeTraits.h:83
static const char * name()
static const char * csaName()
static const char * csaName()
static const char * name()
static const char * csaName()
Definition ptypeTraits.h:33
static const char * name()
Definition ptypeTraits.h:32
static const char * name()
Definition ptypeTraits.h:21
static const char * csaName()
Definition ptypeTraits.h:22
static const char * name()
static const char * csaName()
static const char * csaName()
static const char * name()