Pythonプログラミングで

チェスを作る

Stage 9 ゲーム進行を記録する

9-3 記録ファイルに棋譜を書き込む

ファイルへの記述フォーマットはこんな感じになります。

1       e4          c5          
2       Qg4         Qa5         
3       e5          d5          
4       exd6        exd6        
5       Qe4+        Be6         
6       Nf3         Nc6         
7       d3          O-O-O       
8       0-1
                    

もう一つ例を見てみましょう。

1       e4          c5          
2       Qh5         f5          
3       Qxe8        1-0  
                    

お分かりいただけたでしょうか。要は

  • ターン毎に数字をふる
  • 白は左、黒は右
  • 縦長の列の左端をそろえる

ということに注意しろってわけです。簡単でしょ。

~~~~~~~~~~~~~~~

まずはファイルを開きましょうか。record メソッドの引数で入れた address を使って

                        
        ### RECORDING
        # open the recording file
        f = open(address, 'a')
                        
                    

とします。playmode では駒を動かすたびにこの record メソッドを発動させることを想定していますから、モードは追記 "a" です。

UNAVAILABLE

だから 8-1 の playmode の最初で中身全部消さんとあかんかったのか

そう、これでもし全部消えてなかったら、こんな棋譜が出来上がってしまいます。

1       e4          c5          
2       Qh5         f5          
3       Qxe8        1       e4          c5          
2       Qg4         Qa5         
3       e5          d5          
4       exd6        exd6        
5       Qe4+        Be6         
6       Nf3         Nc6         
7       d3          O-O-O       
8       0-1
                    

~~~~~~~~~~~~~~~

ここからは書き込む内容によってフォーマット調整が入ります。まずは勝敗がついたときです。

白が勝ったとき、冒頭の例でも確認しましたが、1-0 と書くのは黒側ですから、f.write でそのまま追記すれば問題ありません。

                        
        # WHITE WINS (BLACK DIDN'T MOVE)
        if s_record == '1-0':
            f.write('1-0')
                        
                    

一方黒が勝った時は新しくターン番号を入れて白側に書き入れます。self.turn は 1 スタートですから、self.turn をそのままファイルに書いてしまって結構です。。

                        
        # BLACK WINS (WHITE DIDN'T MOVE)
        elif s_record == '0-1':
            f.write('{}\t0-1'.format(self.turn))
                        
                    
UNAVAILABLE

-1 とかしなくてええのか

インデックスじゃありませんからね。

~~~~~~~~~~~~~~~

その下にいきましょう。白の動きを記入する場合は「ターン番号 + タブ文字\t + s_record (12 字揃え)」を、

                        
        # writing on WHITE side
        elif self.player == WHITE:
            f.write('{}\t'.format(self.turn) + s_record.ljust(12))
                        
                    

黒のときは「s_record (12 字揃え) + 改行」を書き込みます。

                        
        # writing on BLACK side
        elif self.player == BLACK:
            f.write(s_record.ljust(12) + '\n')
                        
                    

s_record は空白合わせて 12 文字に揃えて左寄せします。設定は ljust() メソッドでできます。これで冒頭にあげたようなフォーマットになりますので確認してください。

ファイルへの書き込みが終わったらファイルを閉じるのを忘れないでください。f.close() です。

                        
        else:
            logger.error('UNEXPECTED VALUE of PLAYER in record')
            print('SYSTEM ERROR')
            sys.exit('SYSTEM ERROR')
        
        f.close()
                        
                    

最後に「記録成功」True をリターンして

                        
        # return as succeeded
        return True
                        
                    

record メソッド終了です。

NEXT 9-4 ゲームで記録機能を運用する