boardTable.h
Go to the documentation of this file.
1 /* directionTable.h
2  */
3 #ifndef OSL_BOARD_TABLE_H
4 #define OSL_BOARD_TABLE_H
5 
6 #include "osl/basic_type.h"
7 #include "osl/container.h"
8 #include "osl/bits/offset32.h"
9 
10 namespace osl
11 {
12  class BoardTable
13  {
15  // 上位はoffsetが,下位3bitはdirectionが入る. 
20 #ifndef MINIMAL
22 #endif
23  public:
27  private:
28  template<Direction Dir>
29  void setDirections();
30  template<Direction Dir>
31  void setKnightDirections();
32  void init();
33  public:
38  return offsets[static_cast<int>(dir)];
39  }
40  int getDxForBlack(Direction dir) const{
41  return dxs[static_cast<int>(dir)];
42  }
43  int getDyForBlack(Direction dir) const{
44  return dys[static_cast<int>(dir)];
45  }
46  template<Player P>
47  const Offset getOffset(Direction dir) const{
48  return getOffsetForBlack(dir)*sign(P);
49  }
50  const Offset getOffset(Player pl,Direction dir) const{
51  if (pl==BLACK)
52  return getOffset<BLACK>(dir);
53  else
54  return getOffset<WHITE>(dir);
55  }
56 
61  const Square nextSquare(Player P, Square pos, Direction dr) const
62  {
63  assert(pos.isOnBoard());
64  const Offset offset = getOffset(P, dr);
65  return pos + offset;
66  }
67 
68  BoardTable();
70  template <Player P>
72  {
73  assert(offset32.isValid());
74  const Offset32 blackOffset32 = offset32.blackOffset32<P>();
75  Direction ret=directions[blackOffset32.index()];
76  assert(isValid(ret));
77  return ret;
78  }
80  {
81  if (P == BLACK)
82  return getLongDirection<BLACK>(offset32);
83  else
84  return getLongDirection<WHITE>(offset32);
85  }
87  template <Player P>
89  {
90  return getLongDirection<P>(Offset32(to,from));
91  }
92 #ifndef MINIMAL
93 
99  int spaceCounts(Square from,Square to) const
100  {
101  Offset32Wide offset32(from,to);
102  return space_counts[offset32.index()];
103  }
104 #endif
105 
110  const Offset getShortOffset(Offset32 offset32) const{
111  assert(offset32.isValid());
112  return short_offsets[offset32.index()];
113  }
119  const Offset getShortOffsetNotKnight(Offset32 offset32) const{
120  assert(offset32.isValid());
121  return short_offsets_not_knight[offset32.index()];
122  }
127  int i=(int)(to.uintValue())-(int)(from.uintValue())-Offset::ONBOARD_OFFSET_MIN;
128  return Offset::makeDirect(short8Offset[i]);
129  }
133  template<Player P>
135  if(P==BLACK)
136  return static_cast<Direction>(short8Dir[(int)(to.uintValue())-(int)(from.uintValue())-Offset::ONBOARD_OFFSET_MIN]);
137  else
138  return static_cast<Direction>(short8Dir[(int)(from.uintValue())-(int)(to.uintValue())-Offset::ONBOARD_OFFSET_MIN]);
139  }
141  if(P==BLACK)
142  return getShort8Unsafe<BLACK>(from, to);
143  else
144  return getShort8Unsafe<WHITE>(from, to);
145  }
146  template<Player P>
148  assert(from.isOnBoard() && to.isOnBoard());
149  assert(from.x()==to.x() || from.y()==to.y() ||
150  abs(from.x()-to.x())==abs(from.y()-to.y()));
151  return getShort8Unsafe<P>(from,to);
152  }
153 
154  template<Player P>
156  assert(from.isOnBoard() && to.isOnBoard());
157  assert(from.x()==to.x() || from.y()==to.y() ||
158  abs(from.x()-to.x())==abs(from.y()-to.y()));
159  int i=(int)(to.uintValue())-(int)(from.uintValue())-Offset::ONBOARD_OFFSET_MIN;
160  o=Offset::makeDirect(short8Offset[i]);
161  Direction d=static_cast<Direction>(short8Dir[i]);
162  if(P==BLACK)
163  return d;
164  else
165  return inverse(d);
166  }
172  bool isBetween(Square t,Square p0,Square p1) const
173  {
174  int i1=(int)(t.uintValue())-(int)(p0.uintValue())-Offset::ONBOARD_OFFSET_MIN;
175  int i2=(int)(p1.uintValue())-(int)(t.uintValue())-Offset::ONBOARD_OFFSET_MIN;
176  assert(short8Dir[i1]!=DIRECTION_INVALID_VALUE || short8Dir[i2]!=DIRECTION_INVALID_VALUE);
177  return short8Dir[i1]==short8Dir[i2];
178  }
179  bool isBetweenSafe(Square t,Square p0,Square p1) const
180  {
181  if (getShortOffsetNotKnight(Offset32(t, p0)).zero())
182  return false;
183  return isBetween(t, p0, p1);
184  }
185  };
186 
187  extern const BoardTable Board_Table;
188 } // namespace osl
189 
190 
191 #endif /* OSL_BOARD_TABLE_H */
192 // ;;; Local Variables:
193 // ;;; mode:c++
194 // ;;; c-basic-offset:2
195 // ;;; End:
CArray< int, Offset32Wide::SIZE > space_counts
Definition: boardTable.h:21
constexpr Direction inverse(Direction d)
Definition: basic_type.h:358
Direction getShort8(Square from, Square to, Offset &o) const
Definition: boardTable.h:155
const Offset32Base blackOffset32() const
Player P からみた offset を黒番のものに変更する
Definition: offset32.h:52
CArray< signed char, Offset::ONBOARD_OFFSET_SIZE > short8Offset
Definition: boardTable.h:16
座標の差分
Definition: basic_type.h:429
void setKnightDirections()
Definition: boardTable.cc:36
差が uniqになるような座標の差分.
Definition: offset32.h:16
bool isBetweenSafe(Square t, Square p0, Square p1) const
Definition: boardTable.h:179
int y() const
将棋としてのY座標を返す.
Definition: basic_type.h:567
CArray< Direction, Offset32::SIZE > directions
Definition: boardTable.h:14
bool isValid() const
Definition: offset32.h:44
const Offset getShortOffsetNotKnight(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Knight以外のShortの利きのoffsetの場合はそ...
Definition: boardTable.h:119
int x() const
将棋としてのX座標を返す.
Definition: basic_type.h:563
Offset32Base< 8, 9 > Offset32
Definition: offset32.h:63
const Offset getOffsetForBlack(Direction dir) const
黒にとってのoffsetを返す
Definition: boardTable.h:37
CArray< Offset, Offset32::SIZE > short_offsets
Definition: boardTable.h:18
const Offset getOffset(Player pl, Direction dir) const
Definition: boardTable.h:50
void setDirections()
Definition: boardTable.cc:7
bool isOnBoard() const
盤面上を表すかどうかの判定. 1<=x() && x()<=9 && 1<=y() && y()<=9 Squareの内部表現に依存する. ...
Definition: basic_type.h:583
static const Offset makeDirect(int value)
Definition: basic_type.h:447
bool isValid(Player player)
cast等で作られたplayerが正しいかどうかを返す
Definition: basic_type.cc:9
bool isBetween(Square t, Square p0, Square p1) const
p0, p1の間にtがあるかどうか.
Definition: boardTable.h:172
unsigned int index() const
Definition: offset32.h:40
constexpr int sign(Player player)
Definition: basic_type.h:23
CArray< Offset, Offset32::SIZE > short_offsets_not_knight
Definition: boardTable.h:19
Direction getLongDirection(Player P, Offset32 offset32) const
Definition: boardTable.h:79
static const CArray< int, DIRECTION_SIZE > dxs
Definition: boardTable.h:25
int spaceCounts(Square from, Square to) const
fromとtoが長い利きを持つ位置にある時,間のマスの数を求める 一致している時は0 となりも0 関係ない時は-1...
Definition: boardTable.h:99
int getDxForBlack(Direction dir) const
Definition: boardTable.h:40
Direction
Definition: basic_type.h:310
Direction getLongDirection(Square from, Square to) const
Definition: boardTable.h:88
const Offset getShortOffset(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Shortの利きのoffsetの場合はそれ自身を返す...
Definition: boardTable.h:110
Offset getShort8OffsetUnsafe(Square from, Square to) const
8方向にいない場合も適当なものを返す.
Definition: boardTable.h:126
int getDyForBlack(Direction dir) const
Definition: boardTable.h:43
CArray< unsigned char, Offset::ONBOARD_OFFSET_SIZE > short8Dir
Definition: boardTable.h:17
const Square nextSquare(Player P, Square pos, Direction dr) const
next position from pos for player P.
Definition: boardTable.h:61
Direction getShort8(Square from, Square to) const
Definition: boardTable.h:147
Direction getShort8Unsafe(Player P, Square from, Square to) const
Definition: boardTable.h:140
Player
Definition: basic_type.h:8
Direction getShort8Unsafe(Square from, Square to) const
8方向にいない場合も適当なものを返す.
Definition: boardTable.h:134
const Offset getOffset(Direction dir) const
Definition: boardTable.h:47
static const CArray< int, DIRECTION_SIZE > dys
Definition: boardTable.h:26
Direction getLongDirection(Offset32 offset32) const
Definition: boardTable.h:71
unsigned int uintValue() const
Definition: basic_type.h:539
static const CArray< Offset, DIRECTION_SIZE > offsets
Definition: boardTable.h:24
const BoardTable Board_Table
Definition: tables.cc:95