Stage 7 入力の棋譜を駒の動きに変換する
7-8 勝敗の棋譜を処理する
7-2 の最後で「正規表現に適合する場合」という if の条件分岐を始めてから今まで、全て適合する場合についての操作しかしてきませんでした。さあ、ここからは正規表現から漏れた可哀想な子たちを対処します。
いねーよそんなやつ。俺が許さん
いますよ、それでもしっかり意味を持って役に立てる人たちが。キャスリングの書き方とか "O-O-O" ですよ。どうすんですか。
~~~~~~~~~~~~~~~
今回は勝敗を表す場合です。キャスリングは次回にお預け。
チェスの棋譜で勝敗は
- 白勝:1-0
- 黒勝:0-1
- 引分:1/2-1/2
と表します。これでリザインを判断しますので、ぜひ実装しておいてください。
# NOT IN NORMAL FORMAT
else:
# game set; take note that player themselves cannot win by inputting these codes
if self.s == '1/2-1/2':
logger.info('DRAW GAME')
return EMPTY
elif self.s == '1-0' and self.player == BLACK:
logger.info('WHITE WINS')
return WHITE
elif self.s == '0-1' and self.player == WHITE:
logger.info('BLACK WINS')
return BLACK
正規表現に適合する if 分岐の外側では line を定義していませんので、文字列はすべて self.s を扱います。
先頭の else は 7-2 の最後で「正規表現で分岐した if 文
### NORMAL FORMAT
if match:
line = match.group()
logger.info('line = {}'.format(line))
...
から外れたものという意味で設けています。ぶっちゃけ 7-7 の最後で正規表現の if 文の中身は全てリターンされていますから、else とする必要すらありません。
リターンはそれぞれの勝者、つまり WHITE, BLACK, EMPTY です。int で返します。
# NOT IN NORMAL FORMAT
else:
# game set; take note that player themselves cannot win by inputting these codes
if self.s == '1/2-1/2':
logger.info('DRAW GAME')
return EMPTY
elif self.s == '1-0' and self.player == BLACK:
logger.info('WHITE WINS')
return WHITE
elif self.s == '0-1' and self.player == WHITE:
logger.info('BLACK WINS')
return BLACK
また、白か黒が勝つときは必ず負ける側が投了する形でのみ許容されるようにしてください。これないと早い者勝ちで勝利宣言の奪い合いになりますからね。
1 手目:勝利宣言
ってされたら最悪でしょ?