Stage 4 駒の動きを判定する
4-1 全ての駒で不可能な動きを除外する
引き続き board.py を見ていきます。print メソッド直下に motionjudge というメソッドがありますよね。これで「駒が正しい動きをしているか」を判定しています。正しければ True を、間違っていれば False を返します。引数は
frFILE
→ 移動元の file 番号frRANK
→ 移動元の rank 番号toFILE
→ 移動先の file 番号toRANK
→ 移動先の rank 番号promote
→ プロモーションで成り上がる駒の番号logger
→ メソッド内部で使うロガー
を表しています。移動元と移動先の座標およびプロモーションの組み合わせは、motionjudge 関数だけでなくありとあらゆる場面でこの形をガンガン使いますので、今のうちに慣れてください。
要は from と to やな
~~~~~~~~~~~~~~~
最初にロガーを設定します。
def motionjudge(self, frFILE, frRANK, toFILE, toRANK, promote=EMPTY, logger=None):
### LOGGER SETTING
logger = logger or self.logger
引数にロガーが入っていればそれをそのまま使い、入っていなければ self.logger を使います。
その次の if 文は「座標がちゃんと盤面の中におさまっているか」を判定しています。2-3 で作った InSize を使いましょう。
### RETURNING FALSE IN CASE UNAVAILABLE MOVE IN ANY PIECES
# if the piece is out of the board
if not (fundam.InSize(frFILE) and fundam.InSize(frRANK) and fundam.InSize(toFILE) and fundam.InSize(toRANK)):
logger.debug('OUT OF THE BOARD')
return False
8 マス × 8 マスの盤面のインデックスに 15 とか入ったらマズいでしょ。エラー出しますよ。ここで引っかかったらどう考えても間違った動きなので False をリターンします。
次に、動かそうとしているプレーヤーはだれか、その駒の種類は何かを取得しておきます。
player = fundam.PosNeg(self.board[frFILE][frRANK])
piece = abs(self.board[frFILE][frRANK]) # the kind of piece (cf. config.py)
そのあとの if は「自分の駒が置いてる場所に動かそうとした」場合です。
# moving to the square where there is own piece
if fundam.PosNeg(self.board[toFILE][toRANK]) == player:
logger.debug('MOVING TO OWN SQUARE')
return False
当然アウトですから、False を返します。
アホくさ。自分の駒置いてるところに動かすわけないじゃん
でもお前言われなかったらコーディング忘れてたろ。
今度は移動元のマス ([frFILE, frRANK]) に何も置いていない EMPTY の場合です。当然動かすものがないんですから、 False を返さなければいけません。
# there is no piece at Fr
if piece == EMPTY:
logger.debug('MOVING EMPTY')
return False
ここまででとりあえず「駒の種類を分けるまでもなく」アウトな動かし方をひととおり排除できました。次からは 1 種類ずつ駒の動きを確認していきます。