Pythonプログラミングで

リバーシを作る

Stage 6 パスと勝敗を判定する

6-1 パスを判定する機能を実装する

さて、前回までで石を操る機能は整いましたから、ここからはゲーム進行に入っていきます。今回はその中でも特に重要な、パスの判定を扱っていきます。

例えばこういう場合を考えましょう。

UNAVAILABLE

この時白はどこにも石を置くことができませんよね。ということで白はこの盤面では

絶対にパス

しないといけません。逆にどこかにでも石を置ける場所があれば、パスはできません。したがって、「パスしないといけないのか、パスしてはいけないのか」を判定する機能が必要になってきます。

とりあえずコードをご覧いただきましょうか。

                        
    def passjudge(self, player, logger=None):
        logger = logger or self.logger
        
        # searching all EMPTY squares that can turn
        for row in range(SIZE):
            for col in range(SIZE):
                if self.board[row][col] == EMPTY:
                    for direction in WHOLE_DIRECTION:
                        focused = [row + direction[ROW], col + direction[COL]]
                        if not (InBoard(focused[ROW]) and InBoard(focused[COL])):
                            continue
                        if self.board[focused[ROW]][focused[COL]] == -player and self.turnjudge(player, focused[ROW], focused[COL], direction):
                            logger.info('THERE IS {}, {}'.format(row, col))
                            return False
        
        # completing all the loop, there is no square that you can put a piece
        return True
                        
                    

では早速解説していきますよ。

~~~~~~~~~~~~~~~

初めの2行は言うまでもないですね。

いや、説明せぇよ

                        
    def passjudge(self, player, logger=None):
        logger = logger or self.logger
                        
                    

仕方ないですね。

引数は「player がパスしないといけないのかを判定する」ということを表しています。そしてメソッド中身の先頭はいつも通りロガーの設定です。

~~~~~~~~~~~~~~~

どうでもいい話はここらへんにして、本題に入りましょう。

なんだよどーでもいーって

パスする条件っていうのは

  • 空いてるマスで
  • どの方向を見ても
  • turnjudge が False

ですよね。

どこのマスにも置けないってそういうことだもんな

ですからそれを実装するだけです。

~~~~~~~~~~~~~~~

まずは空いてるマスを探します。

                        
        # searching all EMPTY squares that can turn
        for row in range(SIZE):
            for col in range(SIZE):
                if self.board[row][col] == EMPTY:
                    for direction in WHOLE_DIRECTION:
                        
                    

for ループで盤上くまなく [row, col] を動かして、空いてるマスに当たったら中に入れてあげましょう。

条件文の中では for ループを使って direction に各方向を入れてあげます。

                        
                if self.board[row][col] == EMPTY:
                    for direction in WHOLE_DIRECTION:
                        focused = [row + direction[ROW], col + direction[COL]]
                        
                    

あとは 5-2 でやったことと大差ありません。まずは focused という名前で隣のマスを設定してあげて、盤面の中にあるか確認します。

                        
                    for direction in WHOLE_DIRECTION:
                        focused = [row + direction[ROW], col + direction[COL]]
                        if not (InBoard(focused[ROW]) and InBoard(focused[COL])):
                            continue
                        if self.board[focused[ROW]][focused[COL]] == -player and self.turnjudge(player, focused[ROW], focused[COL], direction):
                        
                    

もし focused に置かれているのは -player の石で、しかも turnjudge が True であれば、player はそのマスに石を置けますから「パスできない」False をリターンです。

                        
                        if self.board[focused[ROW]][focused[COL]] == -player and self.turnjudge(player, focused[ROW], focused[COL], direction):
                            logger.info('THERE IS {}, {}'.format(row, col))
                            return False
                        
                    

ループを完全に抜け切ったものは石を置ける場所がどこにもなかったということになるので、この場合は「パスしなければならない」True をリターンしましょう。

                        
        # completing all the loop, there is no square that you can put a piece
        return True
                        
                    

NEXT 6-2 勝敗を判定する機能を実装する