正解が複数できてしまう、「余詰」という不完全作品になってしまう。これは失敗とみなして最初から作り直すべき。「正解が1通りしか無いこと」をチェックするためのSolverが必要となる。Solverというほどのものじゃなくてもいいかも。3手詰への拡張さて、とりあえず1手詰は作れるようになったので、次は1段階ステップアップして3手詰の問題生成にチャレンジ。先手を巻き戻してNOT王手にと巻き戻しを増やすことに。1手詰の場合は先手の動きだけ考えれば良かったが、3手詰から先は後手側の動きも入ってくるので面倒になる。最初の巻き戻しだけど、1手詰の問題を生成する場合は詰み方が1通りしかないようにする関係ない駒は最終的に取り除くという処理をしていたけど、3手詰における最終手は複数通りあっても良いし、やはり周りの駒が問題に影響することもあるので完全には取り除かないでおく。「あと1手で詰む」という状態になっていれば良い(駒余りなどは避ける必要あるけど)。次の後手側の巻き戻し。有り得る状態を作り出す。今が1手詰の王手ではない状態、ということは玉が安全地帯に動いて逃げた後手側の駒(玉も含む)が王手をかけていた駒を取った飛車・角・香車などの道を塞ぐように持駒を打ったというパターンが考えられる。先手側の王手駒があった状態にする成駒でない駒を取り除くということを考えることになる。2番目のパターンが複雑で、まずその位置から王手をかけられる駒でないといけないし、それを取れる位置に後手の駒が居ないといけない。この図でいう3一の歩は、持駒から打った状態しか有り得ないので、この位置から先手側の駒で王手していた、ということは有り得ない。桂馬と角以外すべてが有り得る。生成され得るパターンも膨れ上がることになる。それらの中からランダムで選択して生成したものが偶然にでも良い形になっていれば良いのだけど。して後手側の巻き戻しで王手状態が作れたら、1手詰のときと同様にまた先手側を「王手ではない」状態に巻き戻す。こちら側のロジックは同じで問題ないけど、唯一違う部分としては最終手ではないので打ち歩が許される、くらいかな。王の目の前に歩がいる状態が、持駒から打ったものとして処理しても許される。巻き戻したことでなんとなく3手で詰む問題になりそうだけど、「後手は最善手で逃げる」ということを考慮せずに巻き戻しているので、実際には全然意図通りにならないことが多い。そもそも解けない問題になってしまうこともある。いうわけで1手詰の場合と同様に、3手で詰める問題である駒余りなどもない少なくとも1手目は一通りの解しかない3手目は複数あっても良いといったことを検証し、そうでない場合はもう一度作り直し、という方針でいきたい。...が、1手詰と違って3手詰以上の問題を解く解答プログラムはなかなか奥が深く、簡単ではなかった。続いて7手になってしまう、などといったことが起こる。無駄合駒を判定してそれは打てないよう考慮して判定、と思っても「どういう条件なら無駄合駒なのか」という明確なルールが存在しない(!)という難しい問題...。「無駄合駒」でググって調べるだけでもだいぶ面白かった。それを上手く判定できないとどんどん探索が深くなり無限に時間がかかる。だいたいの3手詰くらいなら解けるようになったけど、パターンによっては数百msかかってしまい、厳しい。数秒〜十数秒かかってしまう。ここは今後の課題として早く確実に解けるSolverを実装しておきたい。このチェックのためのSolverがボトルネックになってしまうので、ここが解決されないと厳しいな、という感じ。1手詰の問題と同様に不要な駒を取り除いたり後処理をして、こんな感じの問題が出来上がる。