Stage 8 ゲームを進行する
8-2 ゲームセットを判定する
それでは while ループに入りましょう。
while True:
基本的に決着がつくまでずっとループしますので、条件は True でいいかと。
まず最初にゲームが終了しているか確認します。
えー、まだ始めたばっかでしょ
じゃないんですよ。ここ while ループの中ですよ。何度も何度もこの場所には訪れるんです。ゲームが進んでいって何回もここを訪ねたあと、
これまだ while の中にいていいのかな。決着ついてたら次のターンとかねーじゃん
とシラフになって考え直すには、この位置がちょうどいいんじゃないですかね。
~~~~~~~~~~~~~~~
2-3 をはじめ、何度も確認していますが、チェスにおいてゲームセットの条件は 4 つ、キングを取られる・チェックメイト(詰み)・ステイルメイト・リザイン(投了)です。リザインはあとでやるとして、他の 3 つはここで済ませましょう。
まずはキングが取られた場合。
### GAME SET JUDGE
# king captured
if main_board.king_place(main_board.player) == False:
winner = -main_board.player
break
キングが盤上になければ 6-1 で作った king_place は False を返します。winner はループを抜けた後に勝者を判別するために、キングをとったプレーヤーを入れます。
なんで main_board.player のキングがいない場合しかみてないの?
簡単なことです。ここに来る前のターンが -main_board.player だったからです。「自分の駒を動かした時点で自分のキングが取られた」って、何言ってるかわかりませんよ。
~~~~~~~~~~~~~~~
次いでチェックメイト。
# checkmate
if main_board.checkmatejudge(main_board.player):
print('CHECKMATE')
winner = -main_board.player
break
先ほどと違って自分からチェックメイトになるように駒を動かすことはできますが、それって結局相手がキングを取ればいいだけの話じゃないですか。なのでこちらも片方しかみていません。
加えて、必ず「チェックメイトですよ」ということを教えてあげてください。
if main_board.checkmatejudge(main_board.player):
print('CHECKMATE')
winner = -main_board.player
break
これがないと
は?なんで勝手に負けになってんの?訳わかんねーわクソゲーだわ
って言われてしまいますよ。
~~~~~~~~~~~~~~~
最後にステイルメイト。
# stalemate
if main_board.stalematejudge(main_board.player):
print('STALEMATE')
winner = EMPTY # stalemate is draw
break
片方しか見ない理屈は同じです。ただしステイルメイトだと一般に引き分けになることに注意してください。
こちらも同じように「ステイルメイトですよ」ということを一言言っておくこと。
は?なんで勝手に引き分けになってんの?訳わかんねーわクソゲーだわ
とならないように。