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
これで判定機能は実装完了です。お疲れ様でした。