将棋AIで学ぶディープラーニング on Mac and Google Colab

AI

[単語]

本書で使用しているpython-shogiライブラリの変数や関数をメモ。

python-shogiのGitHub

GitHub - gunyarakun/python-shogi: A pure Python shogi library with move generation and validation and handling of common formats.
A pure Python shogi library with move generation and validation and handling of common formats. - gunyarakun/python-shogi

shogi.BB_SQUARES

[0b000・・・0001, 0b000・・・0010, 0b000・・・0100, ・・・, 0b100・・・0000]。要素81個。

shogi.COLORS

range(0, 2)のこと。0,1。

shogi.CSA.Parser.parse_file(filepath)

CSAファイルからnames、sfen、moves、winの4つのキーを持ったディクショナリに変換される。このディクショナリが1要素としてリストに入っている。(filepath)の後ろに[0]をつければディクショナリだけ取り出せる。

shogi.PIECE_TYPES_WITH_NONE

range(0, 15)のこと。0,1,・・・,14。0は空白、1以降は駒の種類を表す。歩、香、桂、銀、金、角、飛車、と金、成香、成桂、成銀、馬、龍、玉。順番は未確認。

shogi.MAX_PIECES_IN_HAND

[0, 18, 4, 4, 4, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0]のこと。
持ち駒の数の意味。インデックス1~7に何が対応しているのかは未確認。おそらく下記のような感じ。
shogi.MAX_PIECES_IN_HAND[1] = 18 :歩
shogi.MAX_PIECES_IN_HAND[2] = 4 :香車
shogi.MAX_PIECES_IN_HAND[3] = 4 :桂馬
shogi.MAX_PIECES_IN_HAND[4] = 4 :銀
shogi.MAX_PIECES_IN_HAND[5] = 4 :金
shogi.MAX_PIECES_IN_HAND[6] = 2 :角
shogi.MAX_PIECES_IN_HAND[7] = 2 :飛車

shogi.SQUARES

range(0, 81)のこと。

shogi.I1~A9

shogi.I1 = 80
shogi.I2 = 79
shogi.I3 = 78

shogi.A7 = 2
shogi.A8 = 1
shogi.A9 = 0

USIプロトコルの座標系と対応するようになっているっぽい。

USIプロトコルの座標系
9   8   7   6   5   4   3   2   1   筋
                                        段
9a  8a  7a  6a  5a  4a  3a  2a  1a      一
9b  8b  7b  6b  5b  4b  3b  2b  1b      二
9c  8c  7c  6c  5c  4c  3c  2c  1c      三
9d  8d  7d  6d  5d  4d  3d  2d  1d      四
9e  8e  7e  6e  5e  4e  3e  2e  1e      五
9f  8f  7f  6f  5f  4f  3f  2f  1f      六
9g  8g  7g  6g  5g  4g  3g  2g  1g      七
9h  8h  7h  6h  5h  4h  3h  2h  1h      八
9i  8i  7i  6i  5i  4i  3i  2i  1i      九
shogi.I1~A9をUSIプロトコルの座標系に当てはめてみた
9   8   7   6   5   4   3   2   1   筋
                                        段
0   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      九

Moveクラス

from_square

盤面を0~80の数値で表したときの移動元を表す変数。
9で割ったときの商がy座標、余りがx座標となる。xy座標は0オリジン。

x座標
0   1   2   3   4   5   6   7   8

0   1   2   3   4   5   6   7   8       0 y座標
9   10  11  12  13  14  15  16  17      1
18  19  20  21  22  23  24  25  26      2
27  28  29  30  31  32  33  34  35      3
36  37  38  39  40  41  42  43  44      4
45  46  47  48  49  50  51  52  53      5
54  55  56  57  58  59  60  61  62      6
63  64  65  66  67  68  69  70  71      7
72  73  74  75  76  77  78  79  80      8

to_square

同上(移動先)。

Boardクラス

局面を表すクラス。ちなみに以下のようにprintすると盤面を2次元表示できる。

import shogi
board = shogi.Board()
print(board)

# 出力結果
 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

piece_bb

15要素の配列。各要素は各駒の配置を示す。0:空白、1:歩、2:香、・・・

print(board.piece_bb)

# 出力結果
[0,  # 空白
9205357638479249408,  # 歩
1213648186097498819920129,  # 香
613907642773053877780610,  # 桂
321120920835135874531396,  # 銀
188894659314785808547880,  # 金
18446744073709617152,  # 角
1180591620717411304448,  # 飛
75557863725914323419152,  # 玉
0,  # 成・・・
0, 
0, 
0, 
0, 
0]

各15要素それぞれが81マスを表す81桁の0か1(つまりbit board)を10進数で表示したもの。81桁の0か1で表示したいときはprint(‘{:0=81b}’.format(10進数の値)) とすればできる。

# 歩
print('{:0=81b}'.format(board.piece_bb[1]))

# 出力結果
000000000
000000000
111111111
000000000
000000000
000000000
111111111
000000000
000000000
# 香
print('{:0=81b}'.format(board.piece_bb[2]))

# 出力結果
100000001
000000000
000000000
000000000
000000000
000000000
000000000
000000000
100000001

occupied

2要素の配列。各要素は先手後手の占有している駒の位置。bit board。

print(board.occupied)

# 出力結果
Occupied([2414337516468818170347520, 134022655])
# 先手の占有している駒の位置
print('{:0=81b}'.format(board.occupied[0]))

# 出力結果
111111111
010000010
111111111
000000000
000000000
000000000
000000000
000000000
000000000
# 後手の占有している駒の位置
print('{:0=81b}'.format(board.occupied[1]))

# 出力結果
000000000
000000000
000000000
000000000
000000000
000000000
111111111
010000010
111111111

pieces_in_hand

2要素の配列。各要素は先手後手がどの駒(=key)を何枚(=value)持っているかを示すディクショナリ型。

# 例
# 先手持ち駒 : 角1枚、桂1枚
# 後手持ち駒 : 香1枚
print(board.pieces_in_hand)
[Counter({6: 1, 3: 1}), Counter({2: 1})]

move_number

対局開始からの手数。

push_usi

着手する。

>>> board.push_usi('7g7f')
Move.from_usi('7g7f')
>>> print(board)
 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

コメント

タイトルとURLをコピーしました