LoginSignup
0
2

Thonnyを使ってPythonでChessを作ってみる#00

Last updated at Posted at 2024-01-05

 趣味で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)は重複するためナンバーを付けている。

image.png

盤のマスを指定するための配列を作っておく

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関数内で格納している。

***実装結果1***
image.png

***実装結果2***
image.png

***実装結果3***
image.png

盤面上は動いてないが、「ピース」、「効果」、「移動先」の3つを達成できた。
盤面上のピースの移動、
想定外の棋譜の入力の防止、
やることはたくさんあるがこんなもんで

-----2024/1/8 追記-----
実装結果みたいにきれいに表示されないよって人は
ツール>オプション>テーマ&フォント>IOフォントを変更してみよう
俺はArial TURにしてるよ

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2