Pythonプログラミングで

チェスを作る

Stage 6 勝敗を判定する

6-1 キングの位置を特定する

2-3 で確認しましたが、チェスにおいて勝敗のつき方は 4 通り、キングを取られる・チェックメイトステイルメイトリザインのいずれかでしたね。

このうちリザイン以外の 3 つはどれもキングの存在がカギを握っています。またチェックもキングがいてこそです。

UNAVAILABLE

まあチェックって相手のキングのいるマスに駒を動かせる状態だもんな

そんなわけで、勝敗を扱うここ 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
                        
                    
UNAVAILABLE

めっちゃ簡単そうじゃん。瞬殺だわ

めっちゃ簡単なので瞬殺します。

                        
    def king_place(self, searcher):
                        
                    

引数の searcher はキングを探してるプレーヤーの番号です。全部のマス調べ上げて searcher のキングがあればその座標を、キングがどこにもなければ EMPTY をリターンしています。

このマスの調べ方は少し独特かもしれませんが、リストの構造を考えれば大したことはないでしょう。外側のインデックスfile を、内側のインデックスrank を表しますから、

UNAVAILABLE

  • すべての file をみる
  • もしリスト board[fil] に searcher のキングがいたら
  • file と board[fil] のキングがいるインデックス (=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 とかでも構いません。

NEXT 6-2 チェックの数を数える