My Project
king8Info.cc
Go to the documentation of this file.
1/* king8Info.cc
2 */
6#include <bitset>
7#include <iostream>
8
9#ifndef MINIMAL
10std::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
20namespace osl
21{
22 namespace
23 {
33template<Player P> inline
34bool
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
65template<osl::Player P,osl::Direction Dir>
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
106template<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
137template <osl::Player P>
139#if (defined __GNUC__) && (! defined GPSONE) && (! defined GPSUSIONE)
140__attribute__ ((noinline))
141#endif
143King8Info::make(NumEffectState const& state, Square target)
144{
145 return make<P>(state,target,state.pin(alt(P)));
146}
147
149King8Info::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
159King8Info::makeWithPin(Player attack, NumEffectState const& state,
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
const Offset getShortOffset(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Shortの利きのoffsetの場合はそれ自身を返す.
Definition boardTable.h:110
Direction getShort8(Square from, Square to) const
Definition boardTable.h:147
利きを持つ局面
const NumBitmapEffect effectSetAt(Square sq) const
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
const PieceMask pin(Player king) const
const mask_t longEffectAt(Square target) const
const PieceMask & piecesOnBoard(Player p) const
差が uniqになるような座標の差分.
Definition offset32.h:17
駒番号のビットセット.
Definition pieceMask.h:21
bool any() const
Definition pieceMask.h:57
void reset(int num)
Definition pieceMask.h:54
const Square square() const
Definition basic_type.h:832
bool isEmpty() const
Definition basic_type.h:913
bool isEdge() const
Definition basic_type.h:919
bool canMoveOn() const
Player Pの駒が,thisの上に移動できるか? PIECE_EMPTY 0x00008000 BLACK_PIECE 0x000XxxYY X>=2, YY>0 PIECE_EDGE 0xfff1...
Definition basic_type.h:980
bool isOnBoardByOwner() const
piece がプレイヤーPの持ち物でかつボード上にある駒の場合は true.
Definition basic_type.h:852
const Piece pieceOf(int num) const
Definition simpleState.h:76
Square kingSquare() const
Definition simpleState.h:94
const Piece pieceAt(Square sq) const
bool isOnBoard() const
盤面上を表すかどうかの判定. 1<=x() && x()<=9 && 1<=y() && y()<=9 Squareの内部表現に依存する.
Definition basic_type.h:583
敵玉の8近傍の状態を表す.
Definition king8Info.h:29
unsigned int libertyCandidate() const
16-23 bit 目を 0-7bitにshiftして返す
Definition king8Info.h:64
unsigned int liberty() const
8-15 bit 目を 0-7bitにshiftして返す
Definition king8Info.h:54
unsigned int moveCandidate2() const
24-31 bit 目を 0-7bitにshiftして返す
Definition king8Info.h:69
static const King8Info makeWithPin(Player attack, NumEffectState const &state, const PieceMask &pinned)
alt(attack) のking について計算.
Definition king8Info.cc:159
unsigned int dropCandidate() const
0-7 bit 目を返す
Definition king8Info.h:49
static const King8Info make(NumEffectState const &state, Square king, PieceMask pinned)
static uint64_t hasEffectMask(NumEffectState const &state, Square target, PieceMask pinned, PieceMask on_board_defense)
alt(P)の玉にDirの方向で迫るcanMoveMaskを計算する.
Definition king8Info.cc:67
std::ostream & operator<<(std::ostream &, King8Info)
Definition king8Info.cc:10
const BoardTable Board_Table
Definition tables.cc:95
Direction
Definition basic_type.h:310
Player
Definition basic_type.h:8
@ BLACK
Definition basic_type.h:9
const PtypeO PTYPEO_EDGE __attribute__((unused))
constexpr Player alt(Player player)
Definition basic_type.h:13