4 #include <boost/dynamic_bitset.hpp> 55 pawn_pieces.reserve(18);
56 lance_pieces.reserve(4);
57 knight_pieces.reserve(4);
58 silver_pieces.reserve(4);
59 bishop_pieces.reserve(2);
60 rook_pieces.reserve(2);
61 gold_pieces.reserve(4);
63 for (
int i = 0; i < 40; ++i)
76 knight_pieces.push_back(
OPSquare(p));
79 silver_pieces.push_back(
OPSquare(p));
82 bishop_pieces.push_back(
OPSquare(p));
88 gold_pieces.push_back(
OSquare(p));
102 std::sort(pawn_pieces.begin(), pawn_pieces.end(),
oposition_sort());
103 std::sort(lance_pieces.begin(), lance_pieces.end(),
oposition_sort());
104 std::sort(knight_pieces.begin(), knight_pieces.end(),
oposition_sort());
105 std::sort(silver_pieces.begin(), silver_pieces.end(),
oposition_sort());
106 std::sort(bishop_pieces.begin(), bishop_pieces.end(),
oposition_sort());
107 std::sort(rook_pieces.begin(), rook_pieces.end(),
oposition_sort());
108 std::sort(gold_pieces.begin(), gold_pieces.end(),
oposition_sort());
117 for (PawnArray::const_iterator p = pawn_pieces.begin();
118 p != pawn_pieces.end(); ++p)
123 state.
setPiece(p->getOwner(), p->getSquare(), ptype);
125 for (LanceArray::const_iterator p = lance_pieces.begin();
126 p != lance_pieces.end(); ++p)
131 state.
setPiece(p->getOwner(), p->getSquare(), ptype);
133 for (KnightArray::const_iterator p = knight_pieces.begin();
134 p != knight_pieces.end(); ++p)
139 state.
setPiece(p->getOwner(), p->getSquare(), ptype);
141 for (SilverArray::const_iterator p = silver_pieces.begin();
142 p != silver_pieces.end(); ++p)
147 state.
setPiece(p->getOwner(), p->getSquare(), ptype);
149 for (BishopArray::const_iterator p = bishop_pieces.begin();
150 p != bishop_pieces.end(); ++p)
155 state.
setPiece(p->getOwner(), p->getSquare(), ptype);
157 for (RookArray::const_iterator p = rook_pieces.begin();
158 p != rook_pieces.end(); ++p)
163 state.
setPiece(p->getOwner(), p->getSquare(), ptype);
165 for (GoldArray::const_iterator p = gold_pieces.begin();
166 p != gold_pieces.end(); ++p)
177 boost::dynamic_bitset<>
180 boost::dynamic_bitset<> bits(total_bits);
182 for (PawnArray::const_iterator p = pawn_pieces.begin();
183 p != pawn_pieces.end(); ++p)
185 const int value =
static_cast<int>(*p);
186 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
187 bits = bits << OPSquare::total_bits | mask;
189 for (LanceArray::const_iterator p = lance_pieces.begin();
190 p != lance_pieces.end(); ++p)
192 const int value =
static_cast<int>(*p);
193 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
194 bits = bits << OPSquare::total_bits | mask;
196 for (KnightArray::const_iterator p = knight_pieces.begin();
197 p != knight_pieces.end(); ++p)
199 const int value =
static_cast<int>(*p);
200 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
201 bits = bits << OPSquare::total_bits | mask;
203 for (SilverArray::const_iterator p = silver_pieces.begin();
204 p != silver_pieces.end(); ++p)
206 const int value =
static_cast<int>(*p);
207 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
208 bits = bits << OPSquare::total_bits | mask;
210 for (BishopArray::const_iterator p = bishop_pieces.begin();
211 p != bishop_pieces.end(); ++p)
213 const int value =
static_cast<int>(*p);
214 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
215 bits = bits << OPSquare::total_bits | mask;
217 for (RookArray::const_iterator p = rook_pieces.begin();
218 p != rook_pieces.end(); ++p)
220 const int value =
static_cast<int>(*p);
221 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
222 bits = bits << OPSquare::total_bits | mask;
224 for (GoldArray::const_iterator p = gold_pieces.begin();
225 p != gold_pieces.end(); ++p)
227 const int value =
static_cast<int>(*p);
228 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
229 bits = bits << OSquare::total_bits | mask;
232 p != king_pieces.end(); ++p)
234 const char value =
static_cast<char>(*p);
235 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
236 bits = bits << 8 | mask;
239 unsigned long value = 0;
244 const boost::dynamic_bitset<> mask(total_bits, static_cast<unsigned long>(value));
245 bits = bits << 8 | mask;
253 const boost::dynamic_bitset<> bits = toBits();
260 if (bits.size() == 0)
264 for (
int i=0; i<18; ++i)
266 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 1023ul);
267 const unsigned long value =
268 (bits >> (MiniBoard::total_bits - OPSquare::total_bits*(i+1))
270 const OPSquare p(static_cast<int>(value));
273 for (
int i=0; i<4; ++i)
275 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 1023ul);
276 const unsigned long value =
277 (bits >> (MiniBoard::total_bits - OPSquare::total_bits*(i+19))
279 const OPSquare p(static_cast<int>(value));
282 for (
int i=0; i<4; ++i)
284 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 1023ul);
285 const unsigned long value =
286 (bits >> (MiniBoard::total_bits - OPSquare::total_bits*(i+23))
288 const OPSquare p(static_cast<int>(value));
291 for (
int i=0; i<4; ++i)
293 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 1023ul);
294 const unsigned long value =
295 (bits >> (MiniBoard::total_bits - OPSquare::total_bits*(i+27))
297 const OPSquare p(static_cast<int>(value));
300 for (
int i=0; i<2; ++i)
302 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 1023ul);
303 const unsigned long value =
304 (bits >> (MiniBoard::total_bits - OPSquare::total_bits*(i+31))
306 const OPSquare p(static_cast<int>(value));
309 for (
int i=0; i<2; ++i)
311 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 1023ul);
312 const unsigned long value =
313 (bits >> (MiniBoard::total_bits - OPSquare::total_bits*(i+33))
315 const OPSquare p(static_cast<int>(value));
318 for (
int i=0; i<4; ++i)
320 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 511ul);
321 const unsigned long value =
322 (bits >> (MiniBoard::total_bits - OPSquare::total_bits*34 - OSquare::total_bits*(i+1)) & mask).to_ulong();
323 const OSquare p(static_cast<int>(value));
326 for (
int i=0; i<2; ++i)
328 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 255ul);
329 const unsigned long value =
330 (bits >> (MiniBoard::total_bits - OPSquare::total_bits*34 - OSquare::total_bits*4 - 8*(i+1)) & mask).to_ulong();
333 const boost::dynamic_bitset<> mask(MiniBoard::total_bits, 255ul);
334 const unsigned long value = (bits & mask).to_ulong();
Ptype unpromote(Ptype ptype)
ptypeがpromote後の型の時に,promote前の型を返す. promoteしていない型の時はそのまま返す ...
int fromBase64(const std::string &base64, MiniBoard &mb)
bool operator()(const OSquare &l, const OSquare &r)
std::string base64Encode(boost::dynamic_bitset<> src)
void setPiece(Player player, Square sq, Ptype ptype)
SilverArray silver_pieces
int y() const
将棋としてのY座標を返す.
boost::dynamic_bitset toBits() const
int x() const
将棋としてのX座標を返す.
Ptype promote(Ptype ptype)
promote可能なptypeに対して,promote後の型を返す promote不可のptypeを与えてはいけない. ...
Square, Owner, Promoted : 10 bits.
More compact board than CompactBoard.
const Piece pieceOf(int num) const
std::string toBase64() const
static Square bits2Square(const int bit_position)
Converts an integer (bits) to Square.
static const size_t total_bits
boost::dynamic_bitset base64Decode(std::string src)
std::array< char, Capacity >::const_iterator const_iterator
static int position2Bits(const Square &pos)
Converts a position to an integer (bits)
const Square square() const
const PieceMask & usedMask() const
BishopArray bishop_pieces
static const size_t total_bits
KnightArray knight_pieces
static const size_t total_bits
SimpleState getState() const
static const Square STAND()
void setTurn(Player player)