/usr/include/osl/checkmate/king8Info.h is in libosl-dev 0.6.0-3.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | /* king8Info.h
*/
#ifndef OSL_CHECKMATE_KING8INFO_H
#define OSL_CHECKMATE_KING8INFO_H
#include "osl/state/numEffectState.h"
#include "osl/misc/bitOp.h"
#include "osl/effect_util/additionalEffect.h"
#include <boost/cstdint.hpp>
#include <iosfwd>
namespace osl
{
namespace checkmate
{
/**
* 敵玉の8近傍の状態を表す. 王手がかかっている場合も含むことにする.
* Dirは相手の玉に対してDir方向で王手をかける位置
* 0-7 : 敵玉以外の利きがなく,自分の利きがある空白
* (駒を打つ候補となりうる点)
* 8-15 : 敵玉がDirに移動可能(王手がかかっている場合は長い利きも延ばす)
* 16-23 : 空白か味方の駒(利き次第では移動可能になる)
* 24-31 : 敵玉以外の利きがなく,自分の利きがある空白,敵駒
* (OLD
* 24-31 : 敵玉以外の利きがなく,自分の利きが2つ以上ある空白,敵駒
* (駒を動かす候補となりうる点) )
* 32-39 : 空白(駒打ち王手の候補)
* 40-47 : 味方の利き(kingの利きも含んでいる)がある空白,敵駒
* 48-51 : 敵玉がDirに移動可能(王手がかかっている場合は長い利きも延ばす)な数
*/
class King8Info
{
uint64_t value;
public:
explicit King8Info(uint64_t v) : value(v)
{
}
template<Player P>
static const King8Info make(NumEffectState const& state,Square king, PieceMask pinned);
template<Player P>
static const King8Info make(NumEffectState const& state,Square king);
/** alt(attack) のking について計算 */
static const King8Info make(Player attack, NumEffectState const& state);
/** alt(attack) のking について計算. pinが既に求まっている */
static const King8Info makeWithPin(Player attack, NumEffectState const& state,
const PieceMask& pinned);
uint64_t uint64Value() const { return value; }
/** 0-7 bit 目を返す */
unsigned int dropCandidate() const
{
return (unsigned int)(value&0xffull);
}
/** 8-15 bit 目を 0-7bitにshiftして返す */
unsigned int liberty() const
{
return (unsigned int)((value>>8)&0xffull);
}
/** 0-15bit */
unsigned int libertyDropMask() const
{
return (unsigned int)(value&0xffffull);
}
/** 16-23 bit 目を 0-7bitにshiftして返す */
unsigned int libertyCandidate() const
{
return (unsigned int)((value>>16)&0xffull);
}
/** 24-31 bit 目を 0-7bitにshiftして返す */
unsigned int moveCandidate2() const
{
return (unsigned int)((value>>24)&0xffull);
}
unsigned int spaces() const
{
return (unsigned int)((value>>32)&0xffull);
}
unsigned int moves() const
{
return (unsigned int)((value>>40)&0xffull);
}
/** libertyの数 */
unsigned int libertyCount() const
{
return (unsigned int)((value>>48)&0xfull);
}
template<Player P,Direction Dir>
unsigned int moveCandidateDir(NumEffectState const& state,Square target) const{
if((value & (1ull<<(24+Dir)))==0) return 0;
Square pos=target-DirectionPlayerTraits<Dir,P>::offset();
if(state.countEffect(P,pos)<2 &&
!effect_util::AdditionalEffect::hasEffect(state,pos,P)) return 0;
return 1;
}
template<Player P>
unsigned int countMoveCandidate(NumEffectState const& state) const
{
const Player altP=PlayerTraits<P>::opponent;
Square king=state.kingSquare<altP>();
return moveCandidateDir<P,UL>(state,king)+
moveCandidateDir<P,U>(state,king)+
moveCandidateDir<P,UR>(state,king)+
moveCandidateDir<P,L>(state,king)+
moveCandidateDir<P,R>(state,king)+
moveCandidateDir<P,DL>(state,king)+
moveCandidateDir<P,D>(state,king)+
moveCandidateDir<P,DR>(state,king);
}
unsigned int countMoveCandidate(Player player, NumEffectState const& state) const
{
if(player==BLACK) return countMoveCandidate<BLACK>(state);
else return countMoveCandidate<WHITE>(state);
}
template<Player P>
unsigned int moveCandidateMask(NumEffectState const& state) const
{
const Player altP=PlayerTraits<P>::opponent;
Square king=state.kingSquare<altP>();
return (moveCandidateDir<P,UL>(state,king)<<UL)+
(moveCandidateDir<P,U>(state,king)<<U)+
(moveCandidateDir<P,UR>(state,king)<<UR)+
(moveCandidateDir<P,L>(state,king)<<L)+
(moveCandidateDir<P,R>(state,king)<<R)+
(moveCandidateDir<P,DL>(state,king)<<DL)+
(moveCandidateDir<P,D>(state,king)<<D)+
(moveCandidateDir<P,DR>(state,king)<<DR);
}
template<Player P>
bool hasMoveCandidate(NumEffectState const& state) const
{
const Player altP=PlayerTraits<P>::opponent;
Square king=state.kingSquare<altP>();
if(moveCandidateDir<P,U>(state,king)!=0) return true;
if(moveCandidateDir<P,UL>(state,king)!=0) return true;
if(moveCandidateDir<P,UR>(state,king)!=0) return true;
if(moveCandidateDir<P,L>(state,king)!=0) return true;
if(moveCandidateDir<P,R>(state,king)!=0) return true;
if(moveCandidateDir<P,D>(state,king)!=0) return true;
if(moveCandidateDir<P,DL>(state,king)!=0) return true;
if(moveCandidateDir<P,DR>(state,king)!=0) return true;
return false;
}
private:
/**
* alt(P)の玉にDirの方向で迫るcanMoveMaskを計算する.
* @param P(template) - 攻撃側のplayer
* @param Dir(template) - 敵玉に迫る方向(shortの8方向)
* @param state - 初期状態
* @param target - alt(P)の玉があるpotision
*/
template<Player P,Direction Dir>
static uint64_t
#ifdef __GNUC__
__attribute__ ((pure))
#endif
hasEffectMask(NumEffectState const& state,Square target, PieceMask pinned,
PieceMask on_board_defense);
};
class EdgeTable
{
CArray2d<uint64_t, 2, Square::SIZE> edge_mask;
public:
EdgeTable();
/** liberty から盤の淵(xかyが1か9)を取り除く. libertyCount()==0になっても詰みとは限らない */
const King8Info
#ifdef __GNUC__
__attribute__ ((pure))
#endif
resetEdgeFromLiberty(Player king_player, Square king, King8Info info) const
{
uint64_t ret = info.uint64Value();
ret &= edge_mask[king_player][king.index()];
const uint64_t count = misc::BitOp::countBit((ret>>8)&0xffull);
ret |= count << 48;
return King8Info(ret);
}
};
extern const EdgeTable Edge_Table;
std::ostream& operator<<(std::ostream&, King8Info);
} // namespace checkmate
using checkmate::King8Info;
} // namespace osl
#endif /* OSL_CHECKMATE_KING8INFO_H */
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End:
|