__Boardの関数列挙

  • __Board()
  • __Board(string)
  • ~__Board()
  • void set(string)
  • bool set_position(string)
  • bool set_hcp(char*)
  • bool set_psfen(char*)
  • void reset()
  • string dump()
  • void push(int)
  • void pop()
  • int peek()
  • bool is_game_over()
  • int isDraw(int)
  • move(int, int, bool)
  • drop_move(int, int)
  • int move_from_usi(string&)
  • int move_from_csa(string&)
  • int move_from_move16(unsigned short)
  • int move_from_psv(unsigned short)
  • int turn()
  • int ply()
  • string toSFEN()
  • string toCSAPos()
  • void toHuffmanCodedPos(char*)
  • void toPackedSfen(char*)
  • int piece(int sq)
  • void toPackedSfen(char*)
  • int piece (int)
  • bool inCheck()
  • int mateMoveIn1Ply()
  • int mateMove(int)
  • bool is_mate(int)
  • unsigned long long getKey()
  • bool moveIsLegal(int)
  • bool is_nyugoyoku()
  • bool isOK()
  • vector piece_in_hand(int)
  • vector pieces()
  • void piece_planes(char*)
  • void piece_planes_rotate(char*)
  • unsigned long long bookKey()
  • void bbToVector(PiceType, Color, Piece, vector)

__Boardの変数

  • Position pos
  • deque<pair<Move, StateInfo>> history

ポインタ

スマートポインタについて読んだ C++11スマートポインタ入門

__LegalMoveListはshared_ptrでMoveListを管理している. 理由はよくわからない. 所有権を複数で保つ必要がなさそうに見えるが. MoveListのポインタを持っているのでMoveListについて読む MoveListはgenerateMovesで初期化したMoveの配列を管理するクラスっぽい. Pythonでのイテレータとしての機能を果たすための関数を用意してあげているような感じ. 他にもいろいろ関数がありそうだけど,知りたいことは合法手生成だからgenerateMovesをよむ. generateMoves.cppで作っているLanceAttackみたいな配列の計算. これは色,香車の位置,駒の配置の3軸のパターンで可能な移動先をbitboardなんかよくわからない.

generateLegalMoves

関数のながれは次のよう

  • generateMoves(moveList, pos)
  • GenerateMoves<Legal, US>()(moveList, pos)
    • GenerateMoves<Eavasion, US>()(moveList, pos)
      • makeNonPromoteMove(King, ksq, to, pos)
      • GeneratePieceMoves<Evasion, Pawn, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<Evasion, Lance, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<Evasion, Knight, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<Evasion, Silver, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<Evasion, Bishop, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<Evasion, Rook, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<Evasion, GoldHorseDragon, US, false>()(moveList, pos, target, ksq)
    • GenerateMoves<NonEavasion, US>()(moveList, pos)
      • generateDropMoves(moveList, pos, target)
      • GeneratePieceMoves<NonEvasion, Pawn, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<NonEvasion, Lance, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<NonEvasion, Knight, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<NonEvasion, Silver, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<NonEvasion, Bishop, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<NonEvasion, Rook, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<NonEvasion, GoldHorseDragon, US, false>()(moveList, pos, target, ksq)
      • GeneratePieceMoves<NonEvasion, King, US, false>()(moveList, pos, target, ksq)

王手回避のEvasionの方は難しいので,NonEvasionを読む.

なんか読めた気がする.トップダウン・アプローチ大事. 関係関数省略できるもんね. GeneratePiceMovesのPawnと,Lanceを読んだ. bitboardの使い方がやっとわかった.PawnとLanceの合法手生成まででいちど書いてみるのもいいかもしれない. 一番めんどくさいのは,事前計算部分だと思う. 具体的にはinit.cppで作っているLanceAttackみたいな配列の計算. これは色,香車の位置,駒の配置の3軸のパターンで可能な移動先をbitboardとして返してくれる配列. これの計算パートはまだ読んでいない.... そうでした.ここが不思議かもしれない.