将棋AIで学ぶディープラーニングを読む

7-3 python-shogi

クラス 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を返す