[単語]
本書で使用しているpython-shogiライブラリの変数や関数をメモ。
python-shogiのGitHub
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
コメント