Pythonプログラミングで

チェスを作る

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

7-9 キャスリングの棋譜を処理する

キャスリングの解読機能を実装します。

                        
            # check whether s represents castling
            # rank setting
            if self.player == WHITE:
                rank = 1 - 1
            elif self.player == BLACK:
                rank = 8 - 1
            else:
                logger.error('UNEXPECTED PLAYER VALUE in s_analyze')
                print('SYSTEM ERROR')
                sys.exit('SYSTEM ERROR')
            # Q-side
            if self.s in ['O-O-O', 'o-o-o', '0-0-0'] and self.board[e - 1][rank] == self.player * KING:
                logger.info('format is {}, castl is {}'.format(self.s, self.castl_q))
                return [e - 1, rank, c - 1, rank, EMPTY]
            # K-side
            elif self.s in ['O-O', 'o-o', '0-0'] and self.board[e - 1][rank] == self.player * KING:
                logger.info('format is {}, castl is {}'.format(self.s, self.castl_k))
                return [e - 1, rank, g - 1, rank, EMPTY]
            
            # invalid format
            else:
                logger.debug('INVALID FORMAT')
                return False
                        
                    

motionjudge でやったのと同じように、最初にプレーヤーから rank を設定し、あとでキングサイドクイーンサイドの条件分岐を行います。見た目ほど難しくはないですよ。

UNAVAILABLE

見覚えあるぞ

ええ。4-4 で似たようなことやってますから。

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

まずはプレーヤーごとに rank を設定します。

                        
            # check whether s represents castling
            # rank setting
            if self.player == WHITE:
                rank = 1 - 1
            elif self.player == BLACK:
                rank = 8 - 1
            else:
                logger.error('UNEXPECTED PLAYER VALUE in s_analyze')
                print('SYSTEM ERROR')
                sys.exit('SYSTEM ERROR')
                        
                    
UNAVAILABLE

最後の else やらなくてええやろ

ええ、もちろんです。白でも黒でもないプレーヤーなんていたら困りますから。

キャスリングは一般的に大文字の O で

O-Oキングサイド
O-O-Oクイーンサイド

というふうに表しますが、別に間違えて小文字の o 使ったって、間違えて 0 使ったっていいじゃないですか。なので

                        
            # Q-side
            if self.s in ['O-O-O', 'o-o-o', '0-0-0'] and self.board[e - 1][rank] == self.player * KING:
                logger.info('format is {}, castl is {}'.format(self.s, self.castl_q))
                return [e - 1, rank, c - 1, rank, EMPTY]
            # K-side
            elif self.s in ['O-O', 'o-o', '0-0'] and self.board[e - 1][rank] == self.player * KING:
                logger.info('format is {}, castl is {}'.format(self.s, self.castl_k))
                return [e - 1, rank, g - 1, rank, EMPTY]
                        
                    

としてある程度解読対象に幅を持たせておきましょう。

リターンは普通の動きと同じにします。motionjudge にしろ move にしろ、引数の時点でキャスリングを特別扱いするようなことはしていませんよね。

ついにここまでに引っかからなかったものは手の施しようがありませんから「実行不可」False をリターンしてください。

                        
            # invalid format
            else:
                logger.debug('INVALID FORMAT')
                return False
                        
                    

これにて s_analyze は終了です。お疲れ様でした。

NEXT Stage 8 ゲームを進行する