Pythonプログラミングで

チェスを作る

Stage 4 駒の動きを判定する

4-1 全ての駒で不可能な動きを除外する

引き続き board.py を見ていきます。print メソッド直下に motionjudge というメソッドがありますよね。これで「駒が正しい動きをしているか」を判定しています。正しければ True を、間違っていれば False を返します。引数は

を表しています。移動元と移動先の座標およびプロモーションの組み合わせは、motionjudge 関数だけでなくありとあらゆる場面でこの形をガンガン使いますので、今のうちに慣れてください。

UNAVAILABLE

要は 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 を返します。

UNAVAILABLE

アホくさ。自分の駒置いてるところに動かすわけないじゃん

でもお前言われなかったらコーディング忘れてたろ。

UNAVAILABLE

今度は移動元のマス ([frFILE, frRANK]) に何も置いていない EMPTY の場合です。当然動かすものがないんですから、 False を返さなければいけません。

                        
        # there is no piece at Fr
        if piece == EMPTY:
            logger.debug('MOVING EMPTY')
            return False
                        
                    

ここまででとりあえず「駒の種類を分けるまでもなく」アウトな動かし方をひととおり排除できました。次からは 1 種類ずつ駒の動きを確認していきます。

NEXT 4-2 ポーンの動きを判定する