説明を見る。00001
00002
00003 #include "osl/book/miniBoardChar50.h"
00004 #include "osl/book/compactBoard.h"
00005 #include "osl/bits/ptypeTable.h"
00006 #include "osl/bits/pieceTable.h"
00007 #include <tuple>
00008 #include <algorithm>
00009 #include <stdexcept>
00010
00011 osl::book::
00012 MiniBoardChar50::MiniBoardChar50()
00013 {
00014 data.fill(0);
00015 }
00016
00017 osl::book::
00018 MiniBoardChar50::MiniBoardChar50(const SimpleState& org)
00019 {
00020 data.fill(0);
00021 SimpleState board = (org.turn() == BLACK) ? org : org.rotate180();
00022 CArray<std::tuple<int,bool,int ,Square>, Piece::SIZE> pieces;
00023 for (int i=0; i<Piece::SIZE; ++i)
00024 {
00025 const Piece p = board.pieceOf(i);
00026 const int ptype_index = Ptype_Table.getIndexMin(unpromote(p.ptype()));
00027 pieces[i] = std::make_tuple(ptype_index, p.isPromoted(), p.owner(), p.square());
00028 }
00029 std::sort(pieces.begin(), pieces.end());
00030 for (int i=0; i<Piece::SIZE; ++i)
00031 {
00032 data[i] = OPiece::position2Bits(std::get<3>(pieces[i]));
00033 data[Piece::SIZE + i/8] |= playerToIndex(static_cast<Player>(std::get<2>(pieces[i]))) << (i%8);
00034 data[Piece::SIZE + i/8 + 5] |= std::get<1>(pieces[i]) << (i%8);
00035 }
00036 }
00037
00038 osl::book::
00039 MiniBoardChar50::MiniBoardChar50(const std::string& src)
00040 {
00041 if (src.size() != data.size())
00042 throw std::runtime_error("bad argument in MiniBoardChar50::MiniBoardChar50(const std::string&)");
00043 std::copy(src.begin(), src.end(), data.begin());
00044 }
00045
00046 const osl::SimpleState osl::book::
00047 MiniBoardChar50::toSimpleState(Player turn) const
00048 {
00049 SimpleState state;
00050 state.init();
00051
00052 for (int i = 0; i<Piece::SIZE; i++)
00053 {
00054 const Square position = OPiece::bits2Square(data[i]);
00055 const Player owner = indexToPlayer((data[40+i/8] >> (i%8)) & 1);
00056 const bool promoted = (data[40+i/8+5] >> (i%8)) & 1;
00057 Ptype ptype = Piece_Table.getPtypeOf(i);
00058 if (promoted)
00059 ptype = promote(ptype);
00060 state.setPiece(owner, position, ptype);
00061 }
00062 state.setTurn(BLACK);
00063 state.initPawnMask();
00064 if (turn != BLACK)
00065 state = state.rotate180();
00066 assert(state.turn() == turn);
00067 return state;
00068 }
00069
00070 const std::string osl::book::
00071 MiniBoardChar50::toString() const
00072 {
00073 return std::string(data.begin(), data.end());
00074 }
00075
00076 bool osl::book::operator<(const MiniBoardChar50& l, const MiniBoardChar50& r)
00077 {
00078 return std::lexicographical_compare(l.data.begin(), l.data.end(),
00079 r.data.begin(), r.data.end());
00080 }
00081 bool osl::book::operator==(const MiniBoardChar50& l, const MiniBoardChar50& r)
00082 {
00083 return std::equal(l.data.begin(), l.data.end(), r.data.begin());
00084 }
00085
00086
00087
00088
00089