Published on: 2022-01-21
Updated on: 2022-02-10
序盤で待ったを行うと、同じ手順で進めてもCOMの指し手が変わることがある。
これは、待ったを行った際に戦型や進行度関連データを巻き戻していないため。
例えば以下のようなことが可能:
最序盤で待ったを繰り返して定跡を抜けた後、プレイヤーが特定の手を指すと、COMは直前の指し手を繰り返す。違法手でも構わずに着手するため、場合によっては駒が消えるなどの不具合が起こる。
なお、駒が消える手を待ったしても消えた駒は復活しない。
具体的には、以下の条件を全て満たすときCOMは直前の指し手を繰り返す:
これは、6 手目以内のプレイヤーの指し手の移動先に応じて定跡処理を強制的に行うコード内で進行度が 1 のケースを適切に処理できていないのが原因。
通常は 6 手目以内で進行度が 1 になることはないので問題にはならないが、待ったが絡むと進行度が 1 になることがありうる。
このバグは色々な応用が考えられる。いくつかの例を示す。
平手プレイヤー先手で初手から 76歩, 34歩, (66角同角待った)*5, (86歩72飛待った), 22角不成, 72飛, (56歩72飛待った), (31角成同金待った), 56歩, 31金, 同角不成, 62銀, 42金 で 9 手勝利できる。
飛車落ち上手でも全く同じ手順が可能。
(56歩72飛待った) の部分で72飛が消える。これは、COMの違法手72飛により移動元の82の空白が移動先の72に上書きされたため。
(31角成同金待った), 56歩, 31金 の部分でCOMの違法手31金により31銀が消える。
初手から 34歩, 76歩, 44歩, (44角同角待った)*5, (56歩44角待った), 22角不成, 44角, (31角成同金待った), 56歩, 31金, 同角不成, 62銀, 42金 で 10 手勝利できる。
(56歩44角待った) の部分でCOMの違法手44角により44歩が消える。
22角不成に対する44角は違法手で、実際にはパスになる。これは、COM側の22角が既に取られており、移動元の22の空白を移動先(空白)の44に上書きするという動作になるため。
(31角成同金待った), 56歩, 31金 の部分でCOMの違法手31金により31銀が消える。
初手から 32金, 76歩, 62銀, (44角同歩待った)*4, (33角成同桂待った), (56歩33桂待った), 22角成, 33桂, (31馬同金待った), (56歩31金待った), 32馬, 45桂, 42金 で 8 手勝利できる。
(56歩33桂待った) の部分でCOMの違法手33桂により33歩が消える。
(31馬同金待った), (56歩31金待った) の部分でCOMの違法手31金により31銀が消える。このように、プレイヤーが駒を取ってCOMがすぐ取り返す、という手順ではゼロ手で駒を消すことができる。
二枚落ち下手で初手から 32金, 76歩, 62銀, (44角同歩待った)*5, 77角, 52玉, 56歩 とするとCOMが違法手52玉を指し、その結果COM玉が消える。
(44角同歩待った)*5 は定跡を抜けるために必要。これにより、77角の局面でCOMは定跡を使わず自力で52玉を指す。
COM玉が消えても対局は続行できる。なお、COMは候補手が駒捨てのみになると投了してしまうため、チートなしではこの状態から全駒することはできないと思われる(最後の1駒がどうやっても取れない。チートで全駒するとCOMは投了する模様)。
平手プレイヤー先手で初手から 76歩, 34歩, (77角同角成待った)*5, 22角成 とするとCOMは違法手77角成を指し、77の地点にプレイヤー側の香が現れる。次にプレイヤーが何か指すとNESのCPUが暴走し、最終的に $2004
を実行する。
このときの挙動は本体に依存すると思われる(PPUレジスタ領域を実行することになるため):
COMの違法手77角成は、移動元22の空白を「成って」移動先77に上書きする動作になる。成ると駒の内部値が +7 されるため、上書きされる値はプレイヤー側の香(7)になる。
この不正な駒をCOM側の駒として扱い、ルーチンテーブルから対応するルーチンを呼ぼうとして上記の挙動となる。
なお、77に発生した不正な駒を取ることはできない。プレイヤー側の駒取りのコードで不正な駒は弾かれる(何も取らなかったことにされる)ため。
COM玉が詰んでいないのにCOMが投了することがある。これの原因は 2 通りある:
後者のケースは取り返しフラグ補正があっても稀にしか起こらない(具体例は 平手 13 手勝利 などを参照)。自殺手は一般に総駒損価値が大きく、最善手として採用されにくいため。
自殺手が総駒損価値の不利を覆して最善手となるためには、以下の条件を満たす必要がある:
(総駒得価値の差分) > (総駒損価値の差分)
であるなお、ルート局面での COM power が 20 以上ならば自殺手は最善手にならない。末端局面評価 第 2 段階 において、COM power が 20 以上かつ捕獲する駒の価値が 2 未満ならば総駒得価値に応じて捕獲する駒の価値を増やす補正がかかり、上記の 2 番目の条件を満たさなくなるため。
序盤(定跡内)では玉で王手できることがある。駒得マス を参照。
二枚落ち上手ではプレイヤー側が王手放置できる手順がある。定跡処理と最終的な指し手決定 を参照。
取り返しフラグ補正 が大量にかかると、COM玉の詰み判定に失敗してCOM玉が取れてしまうことがある。定跡処理と最終的な指し手決定 を参照。
取り返しフラグ補正 が大量にかかると、プレイヤー玉の詰み判定を行う際に自殺手を弾き損ねて、自殺手によってプレイヤー玉が詰まされて負けになることがある。末端局面評価 第 1 段階 を参照。
時間切れ負け時のスタックポインタ設定コード($C32F
)は ldx $7F
となっているが、正しくは ldx #$7F
と思われる。
しかし、この後スタックから値を取り出すことはないのでたまたま壊れていない。