クラス Board(object)
Boardクラス(主クラス)
def __init__(self, sfen=None)
self.pseudo_legal_moves 着手生成クラスのインスタンス
self.legal_moves 着手生成クラスのインスタンス
sfen文字列で局面を与えられていなければ初期局面で初期化(reset関数)
sfen文字列が与えられていればそれで局面を初期化
def reset(self)
__init__から呼ばれ局面を初期化する
self.piece_bb 駒種ごとに座標のbitboardを登録しておく
self.pieces_in_hand 持ち駒を管理する配列、カラーごとにある。pieces_in_hand[BLACKmWHITE]
self.occupied 駒が存在するbitboard座標
self.king_squares KINGが存在するSQUARES座標、KINGは特別扱い
self.pieces[81] SQUARES座標ごとに駒種を記録している
self.turn 手番 初期値はBLACK
self.move_number 手数 増やすのはpush関数減らすのはpop関数
self.captured_piece_stack push関数で取った駒をキューに登録している。pop関数で取り出して削除
self.move_stack push関数で渡されたmoveインスタンスをキューに登録している。pop関数で取り出して削除
self.incremental_zobrist_hash zobristハッシュ値を保持
self.transpositions 局面のzobristハッシュ値を記録しており同一のハッシュ値のカウンテングをしている。is_fourfold_repetition関数などで千日手の判定に利用している
def clear(self)
局面のクリアに使用set_sfen関数からのみ呼び出し
def piece_at(self, square)
指定したSQUARES座標からPieceインスタンスを返す
def piece_type_at(self, square)
指定したSQUARES座標から駒種を返す
def add_piece_into_hand(self, piece_type, color, count=1)
指定した駒種の持ち駒数を1増やす
def remove_piece_from_hand(self, piece_type, color)
指定した駒種の持ち駒数を1減らす
def has_piece_in_hand(self, piece_type, color)
指定した駒種、カラーの持ち駒があるかチエックする
def remove_piece_at(self, square, into_hand=False)
指定した座標にある駒を取り除く関数push,pop関数のヘルパー
def set_piece_at(self, square, piece, from_hand=False, into_hand=False)
指定した座標に指定した駒種をセットする関数push,pop関数のヘルパー
def generate_pseudo_legal_moves(self, pawns=True, lances=True, knights=True, silvers=True, golds=True,
bishops=True, rooks=True,
kings=True,
prom_pawns=True, prom_lances=True, prom_knights=True, prom_silvers=True, prom_bishops=True, prom_rooks=True,
pawns_drop=True, lances_drop=True, knights_drop=True, silvers_drop=True, golds_drop=True,
bishops_drop=True, rooks_drop=True):
合法手を生成するジネレータ式なので呼び出す側(generate_legal_moves関数、PseudoLegalMoveGeneratorクラスの__iter__関数他)からnextを呼ばれるとそのつどMoveクラスを返す
def is_attacked_by(self, color, square, piece_types=PIECE_TYPES)
指定座標にATTACKをかけている駒があればTrueそうでなければFalse
def attacker_mask(self, color, square)
指定座標にATTACKをかけている駒の移動bitboardを返す
def attackers(self, color, square)
指定座標にATTACKをかけている移動bitboardで初期化したSquareSetクラスを返す
def is_check(self)
自KINGに王手がかかっていたらTrue
def attacks_from(piece_type, square, occupied, move_color)
指定座標に指定駒種、指定カラーの駒の移動bitboardを返す
def is_suicide_or_check_by_dropping_pawn(self, move)
渡されたmoveインスタンスが死に駒、詰め王手でないかcheckしている。was_suicide関数,was_check_by_dropping_pawn関数をヘルパーとして呼んでいる
def is_game_over(self)
内部でgenerate_legal_moves関数を呼び出し合法手がなかったらゲームオーバーと判定
def is_checkmate(self)
チエックメイトでなければFalse
def is_stalemate(self)
ステイルメイトでなければFalse
def is_fourfold_repetition(self)
千日手判定、千日手であればTrue
def is_double_pawn(self, to_square, piece_type)
2歩判定、これから打つ手が2歩になるか判定、なるならTrue
def push(self, move)
moveインスタンスを使って局面を更新
def pop(self)
局面を戻す
def peek(self)
move_stackの最後の要素にアクセス
def sfen(self)
sfen文字列を使って局面を構築
def set_sfen(self, sfen)
初期局面を構築
def push_usi(self, usi)
usi表記の着手文字列をパースして局面を更新
def kif_pieces_in_hand_str(self, color)
'先手の持駒:'colorをBLACKにした場合
'後手の持駒:'colorをWHITEにした場合
def kif_str(self)
'後手の持駒:\n 9 8 7 6 5 4 3 2 1\n+---------------------------+\n|v香v桂v銀v金v玉v金v銀v桂v香|一\n| ・v飛 ・ ・ ・ ・ ・v角 ・|二\n|v歩v歩v歩v歩v歩v歩v歩v歩v歩|三\n| ・ ・ ・ ・ ・ ・ ・ ・ ・|四\n| ・ ・ ・ ・ ・ ・ ・ ・ ・|五\n| ・ ・ ・ ・ ・ ・ ・ ・ ・|六\n| 歩 歩 歩 歩 歩 歩 歩 歩 歩|七\n| ・ 角 ・ ・ ・ ・ ・ 飛 ・|八\n| 香 桂 銀 金 玉 金 銀 桂 香|九\n+---------------------------+\n先手の持駒:'
def __repr__(self)
def def __str__(self)
l n s g k g s n l
. r . . . . . b .
p p p p p p p p p
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
P P P P P P P P P
. B . . . . . R .
L N S G K G S N L
def __eq__(self, board)
borad同士を比較する
def __ne__(self, board)
bitboard同士 or piece_bb同士 or pieces_in_hand同士 or turn同士 or move_number同士が不一致ならTrue
def zobrist_hash(self, array=None)
呼び出された時点でのzobrist_hash値を返す。
def board_zobrist_hash(self, array=None)
局面上の駒の配置で決まるzobrist_hash値を返す
クラス PseudoLegalMoveGenerator(object)
def __init__(self, board)
def __bool__(self)
board.generate_pseudo_legal_movesを呼び出し着手可能であればTrue
der __iter__(self)
board.generate_pseudo_legal_moves関数を呼び出し着手を返す
def __contains__(self, move)
board.is_pseudo_legal(move)を呼び出し引数のmoveが合法手かチエックしている
クラス SquareSet(object)
SquareSetクラスは移動bitboardを渡される
def __init__(self, mask)
def __len__(self)
移動bitboardの1が立っている数を数えて返す
def __iter__(self)
移動bitboardをスキャンしてSquare座標に変換して返すジネレータ関数なので呼び出す側がnextで呼んで始めて返す
def __contains__(self, square)
指定したsquare座標が移動bitboardに含まれているかチエックして含まれていればTrueを返す