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

　趣味で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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668914/b9090144-b372-156e-e91c-22d6200bb814.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668914/e31e6eb4-d19f-bb65-9ce4-9325051a2aea.png)

＊＊＊実装結果2＊＊＊
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668914/2f7288e5-5321-687e-d1c2-a7a475b13077.png)

＊＊＊実装結果3＊＊＊
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668914/061937e0-58c0-3312-f920-3d58ed162ad7.png)

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

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