My Project
basic_type.cc
Go to the documentation of this file.
1 #include "osl/basic_type.h"
2 #include "osl/bits/boardTable.h"
3 #include "osl/bits/ptypeTable.h"
4 #include "osl/simpleState.h"
6 // #include "move-phash.c"
7 #include <iostream>
8 
9 bool osl::isValid(Player player)
10 {
11  return player==BLACK || player==WHITE;
12 }
13 
14 std::ostream& osl::operator<<(std::ostream& os,Player player)
15 {
16  if(player==BLACK)
17  return os << "+";
18  else
19  return os << "-";
20 }
21 
22 ␌
23 
24 bool osl::isValid(Ptype ptype)
25 {
26  return static_cast<int>(ptype)>=PTYPE_MIN
27  && static_cast<int>(ptype)<=PTYPE_MAX;
28 }
29 
30 bool osl::isValidPtypeO(int ptypeO)
31 {
32  return (ptypeO >= PTYPEO_MIN) && (ptypeO <= PTYPEO_MAX);
33 }
34 
35 std::istream& osl::operator>>(std::istream& is, osl::Ptype& ptype)
36 {
37  std::string s;
38  is >> s;
39  if (s == "PTYPE_EMPTY")
40  ptype = PTYPE_EMPTY;
41  else if (s == "PTYPE_EDGE")
42  ptype = PTYPE_EDGE;
43  else if (s == "PPAWN")
44  ptype = PPAWN;
45  else if (s == "PLANCE")
46  ptype = PLANCE;
47  else if (s == "PKNIGHT")
48  ptype = PKNIGHT;
49  else if (s == "PSILVER")
50  ptype = PSILVER;
51  else if (s == "PBISHOP")
52  ptype = PBISHOP;
53  else if (s == "PROOK")
54  ptype = PROOK;
55  else if (s == "KING")
56  ptype = KING;
57  else if (s == "GOLD")
58  ptype = GOLD;
59  else if (s == "PAWN")
60  ptype = PAWN;
61  else if (s == "LANCE")
62  ptype = LANCE;
63  else if (s == "KNIGHT")
64  ptype = KNIGHT;
65  else if (s == "SILVER")
66  ptype = SILVER;
67  else if (s == "BISHOP")
68  ptype = BISHOP;
69  else if (s == "ROOK")
70  ptype = ROOK;
71  else{
72  std::cerr << "Incorrect input : " << s << std::endl;
73  ptype = PTYPE_EMPTY;
74  }
75  return is;
76 }
77 
78 std::ostream& osl::operator<<(std::ostream& os,const osl::Ptype ptype)
79 {
80  return os << Ptype_Table.getName(ptype);
81 }
82 
83 std::ostream& osl::operator<<(std::ostream& os,const osl::PtypeO ptypeO)
84 {
85  if (isPiece(ptypeO))
86  return os << "PtypeO(" << getOwner(ptypeO) << ","
87  << getPtype(ptypeO) << ")";
88  return os << "PtypeO(" << (int)ptypeO << "," << getPtype(ptypeO) << ")";
89 }
90 
91 ␌
92 
94  return DIRECTION_MIN<=d && d<=DIRECTION_MAX;
95 }
96 
97 std::ostream& osl::operator<<(std::ostream& os,const Direction d){
98  static const char* names[]={
99  "UL","U","UR","L",
100  "R","DL","D","DR",
101  "UUL","UUR","LONG_UL",
102  "LONG_U","LONG_UR","LONG_L",
103  "LONG_R","LONG_DL","LONG_D","LONG_DR"
104  };
105  return os << names[static_cast<int>(d)];
106 }
107 
108 #define OFFSET_INDEX(dx,dy) ((dx*BOARD_HEIGHT + dy) - OFFSET_MIN)
109 
111 {
112  *this = Board_Table.getOffset(player, direction);
113 }
114 
119 int osl::Offset::dx() const
120 {
121  switch (index())
122  {
123  case OFFSET_INDEX(-1,-2): return -1;
124  case OFFSET_INDEX(1,-2): return 1;
125  case OFFSET_INDEX(-1,-1): return -1;
126  case OFFSET_INDEX(0,-1): return 0;
127  case OFFSET_INDEX(1,-1): return 1;
128  case OFFSET_INDEX(-1,0): return -1;
129  case OFFSET_INDEX(1,0): return 1;
130  case OFFSET_INDEX(-1,1): return -1;
131  case OFFSET_INDEX(0,1): return 0;
132  case OFFSET_INDEX(1,1): return 1;
133  case OFFSET_INDEX(-1,2): return -1;
134  case OFFSET_INDEX(1,2): return 1;
135  default:
136  std::cerr << index() << " " << ZERO().index() << "\n";
137  assert(0);
138  }
139  return 0;
140 }
141 
146 int osl::Offset::dy() const
147 {
148  switch (index())
149  {
150  case OFFSET_INDEX(-1,-2): return -2;
151  case OFFSET_INDEX(1,-2): return -2;
152  case OFFSET_INDEX(-1,-1): return -1;
153  case OFFSET_INDEX(0,-1): return -1;
154  case OFFSET_INDEX(1,-1): return -1;
155  case OFFSET_INDEX(-1,0): return 0;
156  case OFFSET_INDEX(1,0): return 0;
157  case OFFSET_INDEX(-1,1): return 1;
158  case OFFSET_INDEX(0,1): return 1;
159  case OFFSET_INDEX(1,1): return 1;
160  case OFFSET_INDEX(-1,2): return 2;
161  case OFFSET_INDEX(1,2): return 2;
162  default: assert(0);
163  }
164  return 0;
165 }
166 
167 #ifndef MINIMAL
168 std::ostream& osl::operator<<(std::ostream& os, Offset offset)
169 {
170  return os << "offset(" << offset.intValue() << ')';
171 }
172 #endif
173 
174 ␌
175 
176 static_assert(sizeof(osl::Square) == 4, "square size");
177 
179 {
180  return (1<=x() && x() <=9
181  && 1<=y() && y() <=9);
182 }
183 
185 {
186  return isPieceStand() || isOnBoard();
187 }
188 
189 
192 {
193  return Board_Table.nextSquare(P, *this, D);
194 }
195 
197 Square::back(Player P, Direction D) const
198 {
199  return Board_Table.nextSquare(alt(P), *this, D);
200 }
201 
203  return (*this != to)
204  && (to == *this+Board_Table.getShortOffsetNotKnight(Offset32(to,*this)));
205 }
206 
207 std::ostream& osl::operator<<(std::ostream& os, Square square)
208 {
209  if (square.isPieceStand())
210  return os << "OFF";
211  return os << "Square(" << square.x() << square.y() << ")";
212 }
213 ␌
214 static_assert(sizeof(osl::Piece) == 4, "piece size");
215 
216 std::ostream& osl::operator<<(std::ostream& os,const Piece piece)
217 {
218  if (piece.isPiece())
219  os << "Piece(" << piece.owner() << "," << piece.ptype()
220  << ",num=" << piece.number()
221  << "," << piece.square() << ')';
222  else if (piece == Piece::EMPTY())
223  os << "PIECE_EMPTY";
224  else if (piece == Piece::EDGE())
225  os << "PIECE_EDGE";
226  else
227  os << "unknown piece?!";
228  return os;
229 }
230 
232 {
233  const int number = ((owner == BLACK)
235  : (int)KingTraits<WHITE>::index);
236  return Piece(owner, KING, number, position);
237 }
238 
239 ␌
240 
241 namespace osl
242 {
243  static_assert(sizeof(Move) == 4, "move size");
244 } //namespace osl
245 
246 bool osl::Move::isValid() const
247 {
248  if (! isNormal())
249  return false;
250  const Square from = this->from();
251  if (! from.isValid())
252  return false;
253  const Square to = this->to();
254  if (! to.isOnBoard())
255  return false;
256  return osl::isValid(ptype())
257  && osl::isValid(capturePtype())
258  && capturePtype()!=KING
259  && osl::isValid(player());
260 }
261 
263 {
264  if (isPass())
265  return Move::PASS(alt(player()));
266  if (! isNormal())
267  return *this;
268  return Move(from().rotate180Safe(), to().rotate180(), ptype(),
269  capturePtype(), isPromotion(), alt(player()));
270 }
271 
272 std::ostream& osl::operator<<(std::ostream& os,const Move move)
273 {
274  if (move == Move::DeclareWin())
275  return os << "MOVE_DECLARE_WIN";
276  if (move.isInvalid())
277  return os << "MOVE_INVALID";
278  if (move.isPass())
279  return os << "MOVE_PASS";
280  const Player turn = move.player();
281  if (move.isValid())
282  {
283  if (move.from().isPieceStand())
284  {
285  os << "Drop(" << turn << "," << move.ptype() << "," << move.to() << ")";
286  }
287  else
288  {
289  const Ptype capture_ptype=move.capturePtype();
290  os << "Move(" << turn << "," << move.ptype() << ","
291  << move.from() << "->" << move.to() ;
292  if (move.promoteMask())
293  os << ",promote";
294  if (capture_ptype != PTYPE_EMPTY)
295  os << ",capture=" << capture_ptype;
296  os << ")";
297  }
298  }
299  else
300  {
301  os << "InvalidMove " << move.from() << " " << move.to()
302  << " " << move.ptypeO() << " " << move.oldPtypeO()
303  << " " << move.promoteMask()
304  << " " << move.capturePtype() << "\n";
305  }
306  return os;
307 }
308 
309 unsigned int osl::Move::hash() const
310 {
311  assert(capturePtype() == PTYPE_EMPTY);
312  // return move_phash(intValue());
313  return intValue();
314 }
315 
317 fromMove16(Move16 move16, const SimpleState& state)
318 {
319  if (move16==MOVE16_NONE)
320  return Move();
321  Player turn=state.turn();
322  Square to=SquareCompressor::melt((move16>>8)&0x7f);
323  if((move16&0x80)!=0){
324  Ptype ptype=(Ptype)(move16-0x80);
325  return Move(to,ptype,turn);
326  }
327  Square from=SquareCompressor::melt(move16&0x7f);
328  Ptype ptype=state[from].ptype();
329  Ptype capture_ptype=state[to].ptype();
330  bool is_promote=(move16&0x8000)!=0;
331  if(is_promote)
332  return Move(from,to,::osl::promote(ptype),capture_ptype,true,turn);
333  else
334  return Move(from,to,ptype,capture_ptype,false,turn);
335 }
337 {
338  if (isInvalid())
339  return MOVE16_NONE;
340  if (isDrop())
341  return Move16(0x80+(uint16_t)ptype()+((SquareCompressor::compress(to()))<<8));
342  if (isPromotion())
343  return Move16(SquareCompressor::compress(from())+(SquareCompressor::compress(to())<<8)+0x8000);
345 }
346 
347 
348 // ;;; Local Variables:
349 // ;;; mode:c++
350 // ;;; c-basic-offset:2
351 // ;;; End:
#define OFFSET_INDEX(dx, dy)
Definition: basic_type.cc:108
const Offset getOffset(Direction dir) const
Definition: boardTable.h:47
const Offset getShortOffsetNotKnight(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Knight以外のShortの利きのoffsetの場合はそれ自身を返す.
Definition: boardTable.h:119
const Square nextSquare(Player P, Square pos, Direction dr) const
next position from pos for player P.
Definition: boardTable.h:61
圧縮していない moveの表現 .
Definition: basic_type.h:1052
PtypeO ptypeO() const
移動後のPtype, i.e., 成る手だった場合成った後
Definition: basic_type.h:1162
static const Move PASS(Player P)
Definition: basic_type.h:1094
bool isValid() const
Definition: basic_type.cc:246
bool isInvalid() const
state に apply 可能でない場合にtrue
Definition: basic_type.h:1202
Ptype ptype() const
Definition: basic_type.h:1155
Player player() const
Definition: basic_type.h:1195
PtypeO oldPtypeO() const
移動前のPtypeO, i.e., 成る手だった場合成る前
Definition: basic_type.h:1168
Move16 toMove16() const
Definition: basic_type.cc:336
static const Move DeclareWin()
Definition: basic_type.h:1096
bool isPass() const
Definition: basic_type.h:1092
Ptype capturePtype() const
Definition: basic_type.h:1180
static const Move fromMove16(Move16, const SimpleState &)
Definition: basic_type.cc:317
int promoteMask() const
pieceに使うためのmaskなので
Definition: basic_type.h:1143
const Move rotate180() const
Definition: basic_type.cc:262
unsigned int hash() const
駒を取らない手を [0, 16305] にmap
Definition: basic_type.cc:309
const Square to() const
Definition: basic_type.h:1132
const Square from() const
Definition: basic_type.h:1125
座標の差分
Definition: basic_type.h:430
int intValue() const
Definition: basic_type.h:448
int dx() const
Offsetから一般に dxは求まらないので, ここでの入力は12近傍のみとする
Definition: basic_type.cc:119
int dy() const
Offsetから一般に dyは求まらないので, ここでの入力は12近傍のみとする
Definition: basic_type.cc:146
Ptype ptype() const
Definition: basic_type.h:821
const Square square() const
Definition: basic_type.h:832
Player owner() const
Definition: basic_type.h:963
bool isPiece() const
Definition: basic_type.h:953
int number() const
Definition: basic_type.h:828
static const Piece EMPTY()
Definition: basic_type.h:797
static const Piece makeKing(Player owner, Square square)
玉を作る
Definition: basic_type.cc:231
static const Piece EDGE()
Definition: basic_type.h:798
const char * getName(Ptype ptype) const
Definition: ptypeTable.h:76
Player turn() const
Definition: simpleState.h:220
bool isPieceStand() const
Definition: basic_type.h:576
int y() const
将棋としてのY座標を返す.
Definition: basic_type.h:567
bool isNeighboring8(Square to) const
Definition: basic_type.cc:202
bool isOnBoardSlow() const
Definition: basic_type.cc:178
const Square neighbor() const
Definition: basic_type.h:746
const Square back() const
Definition: basic_type.h:750
bool isOnBoard() const
盤面上を表すかどうかの判定. 1<=x() && x()<=9 && 1<=y() && y()<=9 Squareの内部表現に依存する.
Definition: basic_type.h:583
bool isValid() const
Definition: basic_type.cc:184
int x() const
将棋としてのX座標を返す.
Definition: basic_type.h:563
Ptype
駒の種類を4ビットでコード化する
Definition: basic_type.h:84
@ PTYPE_MAX
Definition: basic_type.h:105
@ 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
@ PTYPE_MIN
Definition: basic_type.h:102
@ PSILVER
Definition: basic_type.h:90
const PtypeTable Ptype_Table
Definition: tables.cc:97
Move16
16bit 表現
Definition: basic_type.h:1023
@ MOVE16_NONE
Definition: basic_type.h:1024
Ptype getPtype(PtypeO ptypeO)
Definition: basic_type.h:217
bool isValidPtypeO(int ptypeO)
Definition: basic_type.cc:30
const BoardTable Board_Table
Definition: tables.cc:95
Player getOwner(PtypeO ptypeO)
Definition: basic_type.h:256
bool isValid(Player player)
cast等で作られたplayerが正しいかどうかを返す
Definition: basic_type.cc:9
Direction
Definition: basic_type.h:310
@ D
Definition: basic_type.h:319
@ DIRECTION_MAX
Definition: basic_type.h:337
@ DIRECTION_MIN
Definition: basic_type.h:334
Offset32Base< 8, 9 > Offset32
Definition: offset32.h:63
Player
Definition: basic_type.h:8
@ WHITE
Definition: basic_type.h:10
@ BLACK
Definition: basic_type.h:9
constexpr bool isPiece(Ptype ptype)
ptypeが空白やEDGEでないかのチェック
Definition: basic_type.h:120
PtypeO
Player + Ptype [-15, 15] PtypeO の O は Owner の O.
Definition: basic_type.h:199
@ PTYPEO_MAX
Definition: basic_type.h:201
@ PTYPEO_MIN
Definition: basic_type.h:200
std::istream & operator>>(std::istream &is, Ptype &ptype)
Definition: basic_type.cc:35
constexpr Player alt(Player player)
Definition: basic_type.h:13
Ptype promote(Ptype ptype)
promote可能なptypeに対して,promote後の型を返す promote不可のptypeを与えてはいけない.
Definition: basic_type.h:173
std::ostream & operator<<(std::ostream &os, Player player)
Definition: basic_type.cc:14
static int compress(Square pos)
static Square melt(int index)