Pythonプログラミングで

チェスを作る

Stage 7 入力の棋譜を駒の動きに変換する

7-3 動かす駒の判定

ここから先はざっとこんな形になっています。なんとなくでいいので頭の片隅にでも入れておいてください。

UNAVAILABLE

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

ではこれを踏まえて、まずは動かす駒が何か判読する機能をコーディングしましょうか。棋譜には動かした駒の種類が書かれています。ポーンの場合は省略ですが、逆に言えば省略されていればポーンです。

Qf4クイーン
Bxf5ビショップ
Re8+ルーク
d7ポーン

文字で場合分けして、新しく piece というパラメーターに駒の番号を入れます。2-4 で、この時のために ToggleType に str → int の変換機能をつけていますから、ぜひ有効活用しましょう。

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

ではコーディングします。まず 7-3 で考えた正規表現にのっとらないものを排除します。こいつらはそもそも棋譜の体をなしているかすら怪しいところですから。

                        
        ### NORMAL FORMAT
        if match:
            line = match.group()
            logger.info('line = {}'.format(line))

            # what piece is moving
            if line[0] in ['P', 'R', 'N', 'B', 'Q', 'K']:
                piece = IO.ToggleType(line[0])
                # deleting the info of piece because we do not use it any more
                line = line.lstrip(line[0]) 
            else:
                # if not written the piece, it is PAWN's motion
                piece = PAWN
            logger.info('PIECE == {}'.format(piece))
                        
                    

ここでの 3 行目、line は正規表現にのっとる文字列ですね。line の先頭文字が動かす駒を表すはずですから、if で場合わけしましょう。

                        
            # what piece is moving
            if line[0] in ['P', 'R', 'N', 'B', 'Q', 'K']: 
                piece = IO.ToggleType(line[0])
                # deleting the info of piece because we do not use it any more
                line = line.lstrip(line[0]) 
                        
                    

別に P は入れなくていいですよ。ここではただの親切で入れてますが、棋譜の書き方からすれば不要ですから。

piece という変数には ToggleType で得られた駒番号を格納します。

                        
            # what piece is moving
            if line[0] in ['P', 'R', 'N', 'B', 'Q', 'K']:
                piece = IO.ToggleType(line[0]) 
                # deleting the info of piece because we do not use it any more
                line = line.lstrip(line[0]) 
                        
                    

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

さらに後々の作業を簡単にするため先頭の大文字を消しておきます。不要な情報を大量に残しておくのは、かえって錯乱するもとです。

                        
            # what piece is moving
            if line[0] in ['P', 'R', 'N', 'B', 'Q', 'K']:
                piece = IO.ToggleType(line[0])
                # deleting the info of piece because we do not use it any more
                    line = line.lstrip(line[0])  
                        
                    

一方、line[0] が小文字の場合動かす駒はポーンですから、piece = PAWN としたらあとはこのブロックでやることはありません。ログでもとっておきましょうか。

                        
            else:
                # if not written the piece, it is PAWN's motion
                piece = PAWN
            logger.info('PIECE == {}'.format(piece))
                        
                    

NEXT Stage 4 移動元のマスのヒントを整理する