Stage 7 入力の棋譜を駒の動きに変換する
7-6 移動元の候補を列挙する
我々の駒を動かすシステムは、移動元 (frFILE, frRANK)・移動先 (toFILE, toRANK)・プロモーション (promote) の 3 種類 5 つの引数を要求します。
なになに?どうしたのいきなり訳わからんこと言い出して
motionjudge や move といったメソッドの引数の話ですよ。4-1 で詳しく確認しましたよね。
こうした引数のうち、移動先とプロモーションの 2 種類はどんな場合でも 7-5 を実行することで手に入っています。ところが移動元の情報はまずありませんから、これからは「どこの駒を動かすか」つまり移動元に全神経を集中させてコーディングします。
お得意のシラミつぶしか
さすが、感が鋭いですね。
~~~~~~~~~~~~~~~
移動元の候補を格納するリストとして 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))