Pythonプログラミングで

リバーシを作る

Stage 4 石をおけるか判別する機能を実装する

4-2 石をおけるか判別する機能を実装する

ここから先は board.py ファイルの turnjudge メソッドに入ります。

                        
    def turnjudge(self, player, row, col, direction: list, logger=None):
        logger = logger or self.logger
        
        # out of the board
        if not (InBoard(row) and InBoard(col)):
            logger.debug('{}, {}\tOUT OF THE BOARD'.format(row, col))
            return False

        # BLACK, WHITE or EMPTY
        piece = self.board[row][col]
        
        # EMPTY
        if piece == EMPTY:
            logger.debug('{}, {}\tREACHED TO EMPTY'.format(row, col))
            return False
        # OWN
        elif piece == player:
            logger.debug('{}, {}\tREACHED TO OWN PIEE'.format(row, col))
            return True
        # OPPONENT'S
        elif piece == -player:
            return self.turnjudge(player, row + direction[ROW], col + direction[COL], direction, logger)
        # ERROR
        else:
            logger.error('UNEXPECTED VALUE of PLAYER in putjudge')
            return False
                        
                    

思ったよりも簡単そうだな

if で条件分岐してるだけですから、まあまあ簡単でしょう。

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

まず引数から確認しましょう。このメソッドでは

player石をおいたプレーヤー番号
row石をおいたマスの row 番号
col石をおいたマスの column 番号
direction裏返せるか確認する方向
loggerロガー

の5つの引数を使います。

                        
    def turnjudge(self, player, row, col, direction: list, logger=None):
                        
                    

しっかり引数を入れてあげて、条件が揃っていれば、[row, col] の位置から direction の方向に石を裏返すことができるか判定してくれます。

早速中身をみていきましょう。まずはロガーの設定です。3-2 でやったことと同じです。

                        
        logger = logger or self.logger
                        
                    

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

その次に来るのが盤面外に出たときの処理です。もし参照している [row, col] が盤面の外に出てしまっていたら、裏返すことができないのはもちろん、いろいろな機能で支障が出ますので、真っ先に処理してあげないといけません。

                        
        # out of the board
        if not (InBoard(row) and InBoard(col)):
            logger.debug('{}, {}\tOUT OF THE BOARD'.format(row, col))
            return False
                        
                    

row と col どっちかでも出たらアウトなんだな。

そのあと piece という変数に [row, col] の駒の種類を入れてあげます。後ろの条件分岐で何度も self.board[row][col] って書くのめんどくさいですからね。

                        
        # BLACK, WHITE or EMPTY
        piece = self.board[row][col]
                        
                    

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

では問題の条件分岐に入ります。まずは [row, col] に何もなかった場合、つまり direction の方向に石を裏返すことができない場合です。このときは「裏返せない」ということで False をリターンしてあげましょう。

                        
        # EMPTY
        if piece == EMPTY:
            logger.debug('{}, {}\tREACHED TO EMPTY'.format(row, col))
            return False
                        
                    

[row, col] に自分の石がある場合は石を置いたところから direction の方向に裏返すことができますから、True をリターンしてください。

                        
        # OWN
        elif piece == player:
            logger.debug('{}, {}\tREACHED TO OWN PIEE'.format(row, col))
            return True
                        
                    

相手の石である場合は、もう一つ隣のマスをみてあげますが、direction の方向の「となり」ってどうやって表しますか?

direction にはどんなリストが入るんでしたっけ?

config.py でなんか8方向全部まとめたリスト作った気がするな

そうですね。2-2 でやりましたね。よく覚えておいででした。そこでどうやって方向を決めたかというと、row, col それぞれに direction[ROW], direction[COL] を足してあげることで移動するようにしたんでした。これを使います。

                        
        # OPPONENT'S
        elif piece == -player:
            return self.turnjudge(player, row + direction[ROW], col + direction[COL], direction, logger)
                        
                    

player と direction, logger は変えないでくださいね。あくまで一連の操作ですから。

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

ここまで条件分岐されなかったものは非常に危険です。「自分の石でも相手の石でもないのに、石がないわけでもない」って、恐ろしすぎるでしょ。ということでしっかりエラー出してあげてください。

                        
        # ERROR
        else:
            logger.error('UNEXPECTED VALUE of PLAYER in putjudge')
            return False
                        
                    

これで判定機能は実装完了です。お疲れ様でした。

NEXT Stage 5 石を裏返す機能を実装する