Stage 6 勝敗を判定する
6-1 キングの位置を特定する
2-3 で確認しましたが、チェスにおいて勝敗のつき方は 4 通り、キングを取られる・チェックメイト・ステイルメイト・リザインのいずれかでしたね。
このうちリザイン以外の 3 つはどれもキングの存在がカギを握っています。またチェックもキングがいてこそです。
まあチェックって相手のキングのいるマスに駒を動かせる状態だもんな
そんなわけで、勝敗を扱うここ Stage 6 においてキングの位置というのはこれ以上ない重要事項です。ここではキングの位置を追うメソッドを実装します。
~~~~~~~~~~~~~~~
board.py の Board クラスの move メソッド直下に king_place といういかにもな名前のメソッドがありますね?
def king_place(self, searcher):
# searching for the searcher's king
for fil in range(SIZE):
if searcher * KING in self.board[fil]:
return [fil, self.board[fil].index(searcher * KING)]
# there is no king
return EMPTY
めっちゃ簡単そうじゃん。瞬殺だわ
めっちゃ簡単なので瞬殺します。
def king_place(self, searcher):
引数の searcher はキングを探してるプレーヤーの番号です。全部のマス調べ上げて searcher のキングがあればその座標を、キングがどこにもなければ EMPTY をリターンしています。
このマスの調べ方は少し独特かもしれませんが、リストの構造を考えれば大したことはないでしょう。外側のインデックスが file を、内側のインデックスが rank を表しますから、
というアルゴリズムで運用しています。まず全ての file を見て
def king_place(self, searcher):
# searching for the searcher's king
for fil in range(SIZE):
if searcher * KING in self.board[fil]:
もしリスト board[fil] に searcher のキングがいたら
for fil in range(SIZE):
if searcher * KING in self.board[fil]:
return [fil, self.board[fil].index(searcher * KING)]
file と board[fil] のキングがいるインデックス (=rank) をリターン
if searcher * KING in self.board[fil]:
return [fil, self.board[fil].index(searcher * KING)]
ループを抜けるまでリターンされなければ盤上に searcher のキングはいませんから、EMPTY をリターンさせます。
# there is no king
return EMPTY
ここは別に Flase とかでも構いません。