趣味でChessをやっていて、自分でも作れるのではないかと思い立ち制作することに。将来的にはWebページ上で実装したいなと。Webでの実装あんまわかんないから端末上で棋譜を入力するとピースが動くPythonプログラムを作るところから。
続くことを願ってタイトルにナンバリングをしておく。未来の俺よ。頼んだぞ(自力本願)
初心者プログラマーなのでそこはご了承を。
<<開発環境>>
・Windows 10 Home 22H2 OSBuild:19045.3803
・Thonny:version 4.1.4
<<>>
必要なライブラリのインポートから。
Thonnyを起動後、「ツール」タブ→「システムシェルを開く...」
プロンプト画面が起動するため以下のコマンドを実行。
pip install numpy
とりあえず二次元配列使いたいからNumpy入れる
まず最初にボードの表示から
import numpy as np
board = np.array([['R1*','N1*','B1*','Q*・','K*・','B2*','N2*','R2*'],
['Pa*','Pb*','Pc*','Pd*','Pe*','Pf*','Ph*','Ph*'],
['・・・','・・・','・・・','・・・','・・・','・・・','・・・','・・・'],
['・・・','・・・','・・・','・・・','・・・','・・・','・・・','・・・'],
['・・・','・・・','・・・','・・・','・・・','・・・','・・・','・・・'],
['・・・','・・・','・・・','・・・','・・・','・・・','・・・','・・・'],
['Pa・','Pb・','Pc・','Pd・','Pe・','Pf・','Ph・','Ph・'],
['R1・','N1・','B1・','・Q・','・K・','B2・','N2・','R2・']])
黒駒を' * 'で表している。ルーク(R)、ナイト(N)、ビショップ(B)は重複するためナンバーを付けている。
盤のマスを指定するための配列を作っておく
position = np.array([['a8','b8','c8','d8','e8','f8','g8','h8'],
['a7','b7','c7','d7','e7','f7','g7','h7'],
['a6','b6','c6','d6','e6','f6','g6','h6'],
['a5','b5','c5','d5','e5','f5','g5','h5'],
['a4','b4','c4','d4','e4','f4','g4','h4'],
['a3','b3','c3','d3','e3','f3','g3','h3'],
['a2','b2','c2','d2','e2','f2','g2','h2'],
['a1','b1','c1','d1','e1','f1','g1','h1']])
棋譜の読み方はここを参考にすればわかるかも
https://chess-primer.jp/how-to-read-score.html
movData = {'movPiece':'P','movStatus':'Nomal','movDist':'z'}
pieceLst = ['R','N','B','K','Q']
statusDic = {'x':'take','+':'check','#':'checkmate'}
グローバルにこれら3つを設定する。
棋譜から読み取るものは「ピース」、「効果」、「移動先」の3つ。
今回はこれら3つの読み取りを目標にする。
ここでは「ピース」、「効果」を定義したリストと辞書リストを
「移動先」は後ほど
def main():
while(True):
#入力待ち
print('Enter piece move')
move = input()
#moveを翻訳する関数 translate(move)
translate(move)
#盤の表示
for i in range(8):
for j in range(8):
print(board[i][j],end='|')
print()
def translate(mov):
movlst = list(mov)
for i in movlst:
#mov判定式
for s in movlst:
if s in pieceLst :
movData['movPiece'] = s
elif s in statusDic:
movData['movStatus'] = statusDic[s]
#mov末尾2桁から移動先を取得
dstatus = 0
if mov[-1] in statusDic:
dstatus = -1
else :
dstatus = 0
movData['movDist']= mov[-2 + dstatus]
movData['movDist'] += mov[-1 + dstatus]
#print(movData['movDist'])
print(movData)
print()
return movData
#移動先から元々その駒があった場所を逆探知する必要がある
#関数research(piece,dest)
#def movPiece():
if __name__ == "__main__":
main()
棋譜を読んでからでないと「移動先」を決定できないためtranslate関数内で格納している。
盤面上は動いてないが、「ピース」、「効果」、「移動先」の3つを達成できた。
盤面上のピースの移動、
想定外の棋譜の入力の防止、
やることはたくさんあるがこんなもんで
-----2024/1/8 追記-----
実装結果みたいにきれいに表示されないよって人は
ツール>オプション>テーマ&フォント>IOフォントを変更してみよう
俺はArial TURにしてるよ