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 を設定し、あとでキングサイドとクイーンサイドの条件分岐を行います。見た目ほど難しくはないですよ。
見覚えあるぞ
ええ。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')
                        
                    
                最後の 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 は終了です。お疲れ様でした。