king8Info.cc
Go to the documentation of this file.
1 /* king8Info.cc
2  */
3 #include "osl/bits/king8Info.h"
4 #include "osl/numEffectState.h"
5 #include "osl/additionalEffect.h"
6 #include <bitset>
7 #include <iostream>
8 
9 #ifndef MINIMAL
10 std::ostream& osl::checkmate::operator<<(std::ostream& os, King8Info info)
11 {
12  typedef std::bitset<8> bs_t;
13  os << bs_t(info.moveCandidate2()) << " "
14  << bs_t(info.libertyCandidate()) << " "
15  << bs_t(info.liberty()) << " "
16  << bs_t(info.dropCandidate());
17  return os;
18 }
19 #endif
20 namespace osl
21 {
22  namespace
23  {
33 template<Player P> inline
34 bool
35 #ifdef __GNUC__
36 __attribute__ ((pure))
37 #endif
38  hasEnoughEffect(NumEffectState const& state,Square target,Square pos, const PieceMask& pinned,
39  const PieceMask& on_board_defense,
40  Direction dir)
41 {
42  assert(state.kingSquare(P)==target);
43  assert(pos.isOnBoard());
44  PieceMask pieceMask = state.effectSetAt(pos)&on_board_defense;
45  if(pieceMask.none()) return false;
46  PieceMask pieceMask1=pieceMask&~pinned;
47  if(pieceMask1.any()) return true;
48  pieceMask&=pinned;
49  assert(pieceMask.any());
50  do {
51  int num=pieceMask.takeOneBit();
52  Piece p=state.pieceOf(num);
53  assert(p.isOnBoardByOwner(P));
54  Square pos1=p.square();
55  assert(Board_Table.getShortOffset(Offset32(pos,target))
56  == pos-target);
57  Direction dir1=Board_Table.getShort8<P>(target,pos1);
58  if(dir1==dir) return true;
59  } while(pieceMask.any());
60  return false;
61 }
62  }
63 }
64 
65 template<osl::Player P,osl::Direction Dir>
66 uint64_t osl::checkmate::
68  PieceMask on_board_defense)
69 {
70  const Player altP=alt(P);
72  Piece p=state.pieceAt(pos);
73  if(p.isEdge())
74  return 0ull;
75  if(!state.hasEffectAt(P,pos)){
76  if(p.canMoveOn<altP>()){ // 自分の駒か空白
77  if(p.isEmpty())
78  return 0x1000000000000ull+(0x100010100ull<<static_cast<int>(Dir));
79  else
80  return 0x1000000000000ull+(0x10100ull<<static_cast<int>(Dir));
81  }
82  else // 相手の駒
83  return 0ull;
84  }
85  const bool has_enough_effect = hasEnoughEffect<altP>(state,target,pos,pinned,on_board_defense,Dir);
86  if(has_enough_effect){
87  if(p.canMoveOn<altP>()){
88  if(p.isEmpty())
89  return 0x10100010000ull<<static_cast<int>(Dir);
90  else
91  return 0x10000ull<<static_cast<int>(Dir);
92  }
93  else
94  return 0x10000000000ull<<static_cast<int>(Dir);
95  }
96  else{
97  if(p.isEmpty())
98  return 0x10101010001ull<<static_cast<int>(Dir);
99  else if(p.isOnBoardByOwner<P>())
100  return 0x10000ull<<static_cast<int>(Dir);
101  else
102  return 0x10001000000ull<<static_cast<int>(Dir);
103  }
104 }
105 
106 template<osl::Player P>
108 #if (defined __GNUC__) && (! defined GPSONE) && (! defined GPSUSIONE)
109 __attribute__ ((noinline))
110 #endif
112 {
113  PieceMask on_board_defense=state.piecesOnBoard(alt(P));
114  on_board_defense.reset(KingTraits<alt(P)>::index);
115  uint64_t canMoveMask=
116  hasEffectMask<P,UR>(state,target,pinned,on_board_defense)+
117  hasEffectMask<P,R>(state,target,pinned,on_board_defense)+
118  hasEffectMask<P,DR>(state,target,pinned,on_board_defense)+
119  hasEffectMask<P,U>(state,target,pinned,on_board_defense)+
120  hasEffectMask<P,D>(state,target,pinned,on_board_defense)+
121  hasEffectMask<P,UL>(state,target,pinned,on_board_defense)+
122  hasEffectMask<P,L>(state,target,pinned,on_board_defense)+
123  hasEffectMask<P,DL>(state,target,pinned,on_board_defense);
124  mask_t longMask=state.longEffectAt(target,P);
125  while(longMask.any()){
126  int num=longMask.takeOneBit()+PtypeFuns<LANCE>::indexNum*32;
127  Piece attacker=state.pieceOf(num);
128  Direction d=
129  Board_Table.getShort8<P>(target,attacker.square());
130  if((canMoveMask&(0x100<<d))!=0){
131  canMoveMask-=((0x100<<d)+0x1000000000000ull);
132  }
133  }
134  return King8Info(canMoveMask);
135 }
136 
137 template <osl::Player P>
139 #if (defined __GNUC__) && (! defined GPSONE) && (! defined GPSUSIONE)
140 __attribute__ ((noinline))
141 #endif
143 King8Info::make(NumEffectState const& state, Square target)
144 {
145  return make<P>(state,target,state.pin(alt(P)));
146 }
147 
149 King8Info::make(Player attack, NumEffectState const& state)
150 {
151  const Square king=state.kingSquare(alt(attack));
152  if (attack == BLACK)
153  return make<BLACK>(state, king);
154  else
155  return make<WHITE>(state, king);
156 }
157 
160  const PieceMask& pins)
161 {
162  const Square king=state.kingSquare(alt(attack));
163  if (attack == BLACK)
164  return make<BLACK>(state, king, pins);
165  else
166  return make<WHITE>(state, king, pins);
167 }
168 
169 /* ------------------------------------------------------------------------- */
170 // ;;; Local Variables:
171 // ;;; mode:c++
172 // ;;; c-basic-offset:2
173 // ;;; End:
174 
unsigned int libertyCandidate() const
16-23 bit 目を 0-7bitにshiftして返す
Definition: king8Info.h:64
bool isOnBoardByOwner() const
piece がプレイヤーPの持ち物でかつボード上にある駒の場合は true.
Definition: basic_type.h:852
GeneralMask< mask_int_t > mask_t
Definition: mask.h:351
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
bool canMoveOn() const
Player Pの駒が,thisの上に移動できるか? PIECE_EMPTY 0x00008000 BLACK_PIECE 0x000XxxYY X>=2...
Definition: basic_type.h:980
constexpr Player alt(Player player)
Definition: basic_type.h:13
const PtypeO PTYPEO_EDGE __attribute__((unused))
std::ostream & operator<<(std::ostream &, King8Info)
Definition: king8Info.cc:10
const Piece pieceAt(Square sq) const
Definition: simpleState.h:167
差が uniqになるような座標の差分.
Definition: offset32.h:16
const Piece pieceOf(int num) const
Definition: simpleState.h:76
Square kingSquare() const
Definition: simpleState.h:94
bool isOnBoard() const
盤面上を表すかどうかの判定. 1<=x() && x()<=9 && 1<=y() && y()<=9 Squareの内部表現に依存する. ...
Definition: basic_type.h:583
static const King8Info makeWithPin(Player attack, NumEffectState const &state, const PieceMask &pinned)
alt(attack) のking について計算.
Definition: king8Info.cc:159
static uint64_t hasEffectMask(NumEffectState const &state, Square target, PieceMask pinned, PieceMask on_board_defense)
alt(P)の玉にDirの方向で迫るcanMoveMaskを計算する.
Definition: king8Info.cc:67
const NumBitmapEffect effectSetAt(Square sq) const
駒番号のビットセット.
Definition: pieceMask.h:20
敵玉の8近傍の状態を表す.
Definition: king8Info.h:28
unsigned int dropCandidate() const
0-7 bit 目を返す
Definition: king8Info.h:49
unsigned int liberty() const
8-15 bit 目を 0-7bitにshiftして返す
Definition: king8Info.h:54
bool isEdge() const
Definition: basic_type.h:919
利きを持つ局面
const Square square() const
Definition: basic_type.h:832
unsigned int moveCandidate2() const
24-31 bit 目を 0-7bitにshiftして返す
Definition: king8Info.h:69
Direction
Definition: basic_type.h:310
static const King8Info make(NumEffectState const &state, Square king, PieceMask pinned)
const Offset getShortOffset(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Shortの利きのoffsetの場合はそれ自身を返す...
Definition: boardTable.h:110
const PieceMask & piecesOnBoard(Player p) const
void reset(int num)
Definition: pieceMask.h:54
bool isEmpty() const
Definition: basic_type.h:913
Direction getShort8(Square from, Square to) const
Definition: boardTable.h:147
bool any() const
Definition: pieceMask.h:57
Player
Definition: basic_type.h:8
const BoardTable Board_Table
Definition: tables.cc:95