PIN絡みのステイルメイトはレアケース?
以前の記事で販売中のチェスアプリが、自分の駒がPINされた状態でのステイルメイト問題を解くことが出来なかったという話を書きましたが、一つのケースしか試せなかったので他にも似たようなテストケースは無いものかと探していてKindleで「Mate Threats and Defense - 1000 Tactical Examples」という本を購入しました。将棋で言えば「次の一手問題集」みたいなものだと思いますが、問題がテーマ毎に分類されていてステイルメイトだけを取り扱った章もあるので、これなら自分が探している問題もあるだろうと期待して購入しました。
探しているのはPINされたステイルメイト問題
自分が探しているテストケースは前回の記事で紹介したような「味方の駒がPINされた状態に持ち込むステイルメイト」問題です。「Mate Threats and Defense」では、問題がテーマ毎に分類されていると言っても流石に「PINされたステイルメイト」というテーマはなかったので、第7章(「STALEMATE IDEAS」)の中から探してみるとNo.91からNo.106までの16問の問題の内2問だけ目的のものが見つかりました。第13章(「PINNING」)も中も探しましたが、そこでは主に相手の駒をPINして動けないようにして自玉(King)を守る問題が紹介されていて、特にステイルメイトとは関係無い問題のようです。自分が確認したのは第7章とそれに続く第8章と第13章だけなのでもしかしたら他の問題の中にも自分が探しているケースがあるかもしれませんが、意外と少ないようです。
チェスプレイヤーがステイルメイトで勝負を引き分けに持ち込むときに、自分の駒がPINされてるかどうかなんて二の次であまり意識しないでしょうからこの本の著者がそういう分類をしていないのは当然でしょう。でも、以前の記事で書いたように、開発者にとってはそこが大きな問題だったりします。ユーザーのニーズを実現するための苦労が、ユーザーがまったく気が付かないところにあったなんてことは業務ソフトの開発現場でもよくあることですね。
それと、有用なテストケースに出会えるかどうかがソフト開発に大事だったりしますが、以前の記事のケースは本当に助かりました。今回購入した本のステイルメイト問題は、自分のようなチェス初心者から見ると「ステイルメイトを狙わないと絶対負ける」とも言えないような曖昧なものが多かったので少し物足りませんでした。もっと分かりやすいテストケースが欲しかったです。
ステイルメイト=千日手?
チェスに詳しくない自分の認識ではステイルメイト(Stalemate、合法手が無い手詰まり状態)と千日手(Threefold Repetition、同一局面の3回繰り返し)は全く別物だと思っていたのですが、「Mate Threats and Defense」の第7章(「STALEMATE IDEAS」)に続く第8章(「COMBINATIONS」)ではステイルメイトと千日手が絡み合う問題が紹介されてます。形勢不利な白番(先手)がステイルメイトに持ち込もうとして黒番(後手)がそれを避けようとすると千日手になってしまうという感じです。
Grokでチェスの千日手について調べていると以下のように指南されました。
日本では、将棋の千日手(同じ局面が繰り返される場合)と混同されがちですが、チェスの千日手は「合法な手がない状態」を指すため、局面の繰り返し(三回繰り返しによる引き分け)とは異なることに注意してください。
Grokは千日手とステイルメイトは別物だよと念を押してるわけですが、Grokはステイルメイトの日本語訳が千日手だと思ってるのでしょうか?日本の将棋プレイヤーにとっては将棋のルールにないステイルメイトは、Grokに言われるまでもなく千日手とはまったく違う特殊なものと認識しているので、むしろステイルメイトと千日手が似ていることに驚きました。ステイルメイトを日本語に訳す時に膠着状態と訳す場合もあるみたいですが、たしかに千日手も膠着状態には違いないですね。ステイルメイトも千日手も引き分けの一種という認識が正しいようです。
あまり深く考えたことがなかったのですが、将棋の棋書で千日手だけを取り扱った棋書なんて見たことない(かなり昔の角換わり腰掛け銀の千日手定跡の解説は見たことが有ります)ので、戦術や戦略の分析・分類という点では将棋よりチェスの方が進んでいるのかもしれません。そして「こうこうこういう理由でこの局面では千日手が避けられないんだよ」と解説している将棋の棋書があれば読んでみたい気もしますが、そういう棋書を書くのはチェスよりも難しそうですね。
PINが絡むステイルメイトの問題例
「Mate Threats and Defense」の中から一つ例を取り上げてみます。
Chapter 7 No.105
白(先手)劣勢?ですが、ここからステイルメイトに持ち込みます。
解答手順:1.♘g6+ ♜xg6 2.♖xh7+ ♚xh7 3.♕xg7+ ♚xg7
g3の♗(ビショップ)がPINされていて白番(先手)は指す手が無くなりステイルメイト完成です。
なぜこの局面がステイルメイトだと判断するのが難しかったのかというと、駒の利きだけを見て判断するとg6の黒(後手)の♜(ルーク)の利きはg5,g4,g3と下方に伸びているのですが、g3に白(先手)の♗(ビショップ)が存在するのでそこで駒の利きが遮られるのでその先のg1にある白(先手)の♔(キング)までg6の♜(ルーク)が利いていると判断出来ないからです。そのためStockfishではPIN用のフラグを持たせて制御しているようですが、自分のアプリではそのようなデータは持たせていないので苦労しました。でも、今回購入した本に収録されている問題をいくつか解けたので、とりあえずこれでPINされたステイルメイトのケースも問題なくなったと思ってます(打ち歩詰めチェックの記事に書いたような、先読みをして-1を掛けるという方法が取れないのが辛いところです)。どのように解決したかアルゴリズムを解説すると長くなるのですが、簡単に言うと♔(キング)側から8方向に敵の駒にぶつかるまでチェックしていくという方法です。いつか別の記事で書くかもしれませんが、気になる方はソースファイルを見ていただきたいと思います。
あと、この問題を開始局面から解くには5手読みが必要で、実際のアプリでは3手読みしかしていないので正解出来ません。あくまでも読みを深くすれば正解出来るのかどうかのテストです。ちなみに開始局面から2手進めた局面(♘g6+ ♜xg6)から自分のPC環境で3手読みすると6.93秒で解答できるのですが、開始局面から5手読みすると解答までに1987.61秒(約33分)掛かってしまいます。
チェスはCUIでも試しやすい
「Mate Threats and Defense」に収められている問題は一つのテストファイル(test/tactical.coffee)にまとめています。チェスは将棋と違って駒をキャラクター表示できるのでCUI環境でも遊べると思います。ただ、等幅フォントを使っても表示がズレる環境(特にWindows)は多いと思いますが、自分はUbuntu + guake + Monospace 10フォントでうまく表示出来てます。
テスト(test/tactical.coffee)を実行するには
NODE_OPTIONS="--max-old-space-size=24576" mocha --require coffeescript/register --require test/setup.coffee "test/tactical.coffee"
テスト(test/tactical.coffee)ファイル内の上記の例だけを実行するには
NODE_OPTIONS="--max-old-space-size=24576" mocha --require coffeescript/register --require test/setup.coffee -g "stalemate_105-1" "test/tactical.coffee"
です。


