Pythonプログラミングで

チェスを作る

Stage 7 入力の棋譜を駒の動きに変換する

7-6 移動元の候補を列挙する

我々の駒を動かすシステムは、移動元 (frFILE, frRANK)・移動先 (toFILE, toRANK)・プロモーション (promote) の 3 種類 5 つの引数を要求します。

UNAVAILABLE

なになに?どうしたのいきなり訳わからんこと言い出して

motionjudge や move といったメソッドの引数の話ですよ。4-1 で詳しく確認しましたよね。

こうした引数のうち、移動先とプロモーションの 2 種類はどんな場合でも 7-5 を実行することで手に入っています。ところが移動元の情報はまずありませんから、これからは「どこの駒を動かすか」つまり移動元に全神経を集中させてコーディングします。

UNAVAILABLE

お得意のシラミつぶしか

さすが、感が鋭いですね。

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

移動元の候補を格納するリストとして candidates を考えます。棋譜の情報に適合するものを発見次第突っ込みますので、最初宣言する時は中身は空っぽですよ。

                        
            # counting up all the available candidates searching all the squares
            candidates = []
            for fil in range(SIZE):
                        
                    

file を表す fil を for 文にかけます。

                        
            # counting up all the available candidates searching all the squares
            candidates = []
            for fil in range(SIZE):
                # when frFILE is written
                if fundam.InSize(frFILE) and frFILE != fil:
                    continue
                        
                    

運よく frFILE が指定されていれば、if 文によって候補外れの file を外すことができます。

                        
            # counting up all the available candidates searching all the squares
            candidates = []
            for fil in range(SIZE):
                # when frFILE is written
                if fundam.InSize(frFILE) and frFILE != fil:
                continue
                        
                    

同様に、次のループの rank を表す ran も frRANK にそぐわないもののみを外します。

                        
                if fundam.InSize(frFILE) and frFILE != fil:
                    continue

                for ran in range(SIZE):
                    # when frRANK is written
                    if fundam.InSize(frRANK) and frRANK != ran:
                        continue 
                        
                    

2 重の for ループ内部でさらに候補を絞り込みます。まずマスに置かれた駒が自分ので、駒の種類も合致しているか。

                        
                    # when frRANK is written
                    if fundam.InSize(frRANK) and frRANK != ran:
                        continue

                    # if the piece is not own, you cannot move it
                    if self.board[fil][ran] != self.player * piece:
                        continue 

                    # in case of unavailable motion
                    if self.motionjudge(fil, ran, toFILE, toRANK, promote) == False:
                        continue
                        
                    

次にその駒の移動が可能か、確認します。

                        
                    # if the piece is not own, you cannot move it
                    if self.board[fil][ran] != self.player * piece:
                        continue

                    # in case of unavailable motion
                    if self.motionjudge(fil, ran, toFILE, toRANK, promote) == False:
                        continue 
                        
                    

とりあえずここまでクリアしたものを candidates というリストに [fil, ran] の形で格納して、7-7 以降のふるいにかけます。2 重のループを脱出した後に candidates の中身をログにとるのがいいでしょう。

                        
                    # in case of unavailable motion
                    if self.motionjudge(fil, ran, toFILE, toRANK, promote) == False:
                        continue

                    candidates.append([fil, ran])
            logger.info('candidates = {}'.format(candidates))
                        
                    

NEXT 7-7 移動元の候補を絞り込む