将棋ファン向け : 利きの逆算について
今回は、Bonanzaで使われている特殊な利きテーブルについて解説します。今回は、プログラマではなく将棋ファンの方にも読んでもらえる内容だと思うので、将棋ファン向けに少し丁寧に書きます。
解説が長いのでまず問題だけ書きます。
問1) 後手玉に対して、先手が銀打ちで王手になる範囲はどこでしょう?
問2) 後手玉に対して、先手が駒X打ち(X = 歩,香,桂,銀,金,角,飛)で王手になる範囲はどこでしょう?
問3) 先手の桂馬の移動によって後手玉に王手のかかる桂馬の"移動先"の範囲はどこでしょう?ただし、その桂馬の移動によって空き王手にはならないものとします。また桂馬は敵陣であれば不成ではなく成りも選択できるものとします。
問4) 先手の飛車を移動させて後手玉に王手になる飛車の移動先は?
問5) 先手の駒X(Xは成り駒ではない)を移動させて後手玉に王手になるXの移動先は?
問6) 先手の桂を移動させて後手玉に王手になる桂馬の"移動元"は?
問7) 72の後手玉に対して、先手が桂を控えて打った。後手玉が玉を移動させなければ、その桂馬を移動させて後手玉に王手することが出来ると言う。さて、その桂馬が打たれた可能性のある場所はどこか?
問8) 先手の角打ちによってsqの地点にいる後手玉に近接王手(玉から1マスだけ離れた地点からの王手)になる地点は、sqに先手の駒Xがあるときの利きとsqに後手の駒Yがあるときの利きの論理積である。さて、XとYは?
問9) 先手の飛打ちによってsqの地点にいる後手玉に近接王手(玉から1マスだけ離れた地点からの王手)になる地点は、sqに先手の駒Xがあるときの利きとsqに後手の駒Yがあるときの利きの論理積である。さて、XとYは?
問10) 後手玉が81に居る局面で先手が角を打った。後手が玉を移動させなければ、その角を移動させて後手玉に王手することが出来ると言う。さて、その角が打たれた可能性のある場所はどこか?
以下、解答と解説です。
問1) 後手玉に対して、先手が銀打ちで王手になる範囲はどこでしょう?
答1)
後手73玉に対して先手が銀打ちで後手玉に王手になる範囲を考えてみましょう。
98765 □□□□□ □■□■□ □□玉□□ □■■■□ □□□□□ □□□□□ □□□□□ □□□□□ □□□□□
■がそれですね。すなわち、これは後手玉の地点に後手の銀をおいたときの銀の利きの範囲と一致します。
問2) 後手玉に対して、先手が駒X打ち(X = 歩,香,桂,銀,金,角,飛)で王手になる範囲はどこでしょう?
答2) 問1)を一般化しただけなのでわかりますね。後手玉の地点にXをおいたときの後手側のXの利きの範囲です。
このように先手が後手玉に王手になる駒打ちの箇所を探すために後手側の駒の利きが必要になるところが面白いですね。これをここでは「逆利き」と呼ぶことにします。
駒打ちによる王手に関しては、これですべてです。次に駒の移動について考えてみましょう。
問3) 先手の桂馬の移動によって後手玉に王手のかかる桂馬の"移動先"の範囲はどこでしょう?ただし、その桂馬の移動によって空き王手にはならないものとします。また桂馬は敵陣であれば不成ではなく成りも選択できるものとします。
答3) 桂馬は敵陣ならば成りを選択して金になることができますから、成りを選択するなら、敵陣の範囲においては、金の逆利きの範囲になります。言うまでもなく、非敵陣においては、桂の逆利きになります。先手は成り/不成を選択できますから、これらを合成した(論理和をとった)場所が求める答えになります。
例えば、後手72玉に対しては次の範囲になります。
98765 □□■□□ □■玉■□ □■■■□ □■□■□ □□□□□ □□□□□ □□□□□ □□□□□ □□□□□
この■に桂馬を移動させる手であれば、成り/不成をうまく選択することによって王手にできるということですね。確かに72の地点に後手の金を置いた利きと、72の地点に後手の桂をおいた利きとが合成されたものだとわかります。
念のため後手73玉の場合も確認しておきましょう。
98765 □□□□□ □□■□□ □■玉■□ □□□□□ □■□■□ □□□□□ □□□□□ □□□□□ □□□□□
上のようになります。すなわち、73の地点に後手の金をおいた利きと、73の地点に後手の桂をおいた利きを合成したものです。ただし、金の利きは、敵陣の範囲に限ります。(敵陣との論理積) 論理和を "+"、論理積を"&"を用いて表現するなら、玉の地点をsqとして、次のように書けます。
sqの後手玉に先手の桂が移動して王手になる桂馬の移動先の範囲
= (sqの後手の金の利き & 敵陣 ) + sqの後手の桂の利き
問4) 先手の飛車を移動させて後手玉に王手になる飛車の移動先は?
答4) 問3)の内容を踏まえれば簡単だと思います。敵陣では成り/不成を選択できますので、敵陣に関しては龍の逆利き、非敵陣においては飛車の利きで、それらを合成したものが答えになります。
後手73玉の場合について考えてみましょう。
□□■□□ □■■■□ ■■玉■■ □■■■□ □□■□□ □□■□□ □□■□□ □□■□□ □□■□□
■がその範囲ですね。龍の逆利きになっています。
ところで、この飛車の移動元が非敵陣なのか敵陣なのかで場合わけをするとどうなるでしょうか。つまり、
A) 敵陣にいた飛車を移動させて73玉に王手になる移動先
B) 非敵陣にいた飛車を移動させて73玉に王手になる移動先
A)は、次のようになります。
□□■□□ □■■■□ ■■玉■■ □■□■□ □□□□□ □□□□□ □□□□□ □□□□□ □□□□□
B)は次のようになります。
□□□□□ □■□■□ ■■玉■■ □□■□□ □□■□□ □□■□□ □□■□□ □□■□□ □□■□□
A)とB)との論理和がさきほどの解答図ということになります。前者は龍の逆利きから、後手玉が邪魔していけなかった玉の前方(の半直線)を除外したものになります。後者は、
sqの後手玉に先手の非敵陣にいた飛車が移動して王手になる飛車の移動先の範囲
= (sqの後手の龍の利き & 敵陣 ) + sqの後手の飛車の利き
から、後手玉が邪魔して行けなかったところ(後手玉後方の半直線 = 玉の真後ろの2マス)を除外したものになります。
問5) 先手の駒X(Xは成り駒ではない)を移動させて後手玉に王手になるXの移動先は?
答5) 問3),4)を一般化してみましたが、式で書くと次のようになります。
sqの後手玉に先手のXが移動して王手になるXの移動先の範囲
= (sqの後手のXの成った利き & 敵陣 ) + sqの後手のXの利き
ここまでで、移動による王手の移動先に関する考察が終わりました。次に移動元に関して考えてみます。
問6) 先手の桂を移動させて後手玉に王手になる桂馬の"移動元"は?
答6) 前問までと異なり、移動先ではなく移動元を問われていることに注意してください。
例えば、後手72玉に対して先手の桂馬を移動させて王手になる"移動先"は問3)の答えです。
98765 □□■□□ □■玉■□ □■■■□ □■□■□ □□□□□ □□□□□ □□□□□ □□□□□ □□□□□
先手の桂馬の"移動元"は、この■に先手の桂馬を移動させることが出来る場所ですから、それぞれの■の逆利きになります。すなわち、次のようになります。
98765 □□□□□ □□玉□□ □■□■□ ■□■□■ ■■■■■ ■□■□■ □□□□□ □□□□□ □□□□□
この利きを求める手順をもう少し詳しく書くと次のようになります。まず、問3)の答えを求めます。
98765 □□■□□ □■玉■□ □■■■□ □■□■□ □□□□□ □□□□□ □□□□□ □□□□□ □□□□□
このとき■は8箇所あります。この8箇所それぞれに対して逆利き(後手の桂馬をそこにおいたときの利き)を求めます。そしてそれらを合成(論理和)します。式で書くと次のようになります。
ATK = (sqの後手の金の利き & 敵陣 ) + sqの後手の桂の利き
それぞれのATKのマス sq0 に対して、sq0 の後手の桂馬の利きを求め、その論理和をとる。
もう少しプログラマ向けに書けば、
ATK = (w_gold_attacks[sq] & 敵陣) | w_knight_attacks[sq];
foreach (sq0 in ATK) w_chk_tbl[sq].knight |= w_knight_attacks[sq];
となります。(wはwhite = 後手、chk_tblはcheck = 王手、tbl = テーブル、knight = 桂、attacks = 利き)
すなわち、ここで求まった w_chk_tbl[sq]は、sqの地点にいる後手玉に対して、先手の桂馬を移動させて王手にすることが出来る桂馬の移動元の集合を意味します。
Bonanzaでも実際に、このw_chk_tblが使われています。意味も上のものと同じです。
こんなものが求まって何が嬉しいのかというと、後手玉に王手がかかる駒を探すときに、対象をこのw_chk_tblの範囲に限定することが出来ます。すなわち盤上すべての駒に対して調べる必要がなくなるということです。
問7) 72の後手玉に対して、先手が桂を控えて打った。後手が玉を移動させなければ、その桂馬を移動させて後手玉に王手することが出来ると言う。さて、その桂馬が打たれた可能性のある場所はどこか?
答7) 簡単ですね。これは問6)の解答と一致します。
98765 □□□□□ □□玉□□ □■□■□ ■□■□■ ■■■■■ ■□■□■ □□□□□ □□□□□ □□□□□
ついでに71,73,74の後手玉の場合も調べておきましょう。
98765 □□玉□□ □□□□□ ■□■□■ ■■■■■ ■□■□■ □□□□□ □□□□□ □□□□□ □□□□□
98765 □□□□□ □□□□□ □□玉□□ □■□■□ ■□■□■ □□□□□ ■□■□■ □□□□□ □□□□□
98765 □□□□□ □□□□□ □□□□□ □□玉□□ □□□□□ □□□□□ □□□□□ ■□■□■ □□□□□
詰め将棋作家の人や、将棋の終盤の強い人は、敵玉に詰めろをかけることを考えるときに、この図が自然と頭に浮かぶかも知れませんね。また、逆利きという観点から解説した将棋の入門書は存在しないため、これは知らない人には斬新かも知れません。また、将棋の初心者の方は、この図を覚える(敵玉の位置にごとに上の図がイメージとしてすぐ浮かぶようにする)と終盤力が向上すると思います。桂だけではなくすべての駒について考えてみると良いでしょう。
問8) 先手の角打ちによってsqの地点にいる後手玉に近接王手(玉から1マスだけ離れた地点からの王手)になる地点は、sqに先手の駒Xがあるときの利きとsqに後手の駒Yがあるときの利きの論理積である。さて、XとYは?
答8) X = Y = 銀ですね。先手の銀の利きと後手の銀の利きを論理積で合成した場合、斜め4マスになります。これは角で近接王手できる場所ですね。
問9) 先手の飛打ちによってsqの地点にいる後手玉に近接王手(玉から1マスだけ離れた地点からの王手)になる地点は、sqに先手の駒Xがあるときの利きとsqに後手の駒Yがあるときの利きの論理積である。さて、XとYは?
答9) X = Y = 金ですね。先手の銀の利きと後手の銀の利きを論理積で合成した場合、上下左右4マスになります。これは飛車で近接王手できる場所ですね。
Bonanzaでは、1手詰みと3手詰みと判定ルーチンがわかれています。1手詰みは近接王手(ただし桂馬による王手も含む)による王手による詰みです。非近接王手の場合、合駒が発生するので実際に合駒を取り返すような変化を読まないと詰みが判定できないため、3手詰み(実際は3手で終わらない場合もありますが)と1手詰みとは区別されているのです。
よって、その1手詰み判定のためには近接王手になる地点を求める必要がありますが、角・飛による近接王手の地点は問8),9)のようにして利きを合成して求めてあります。なかなか興味深いですね。
問10) 後手玉が81に居る局面で先手が角を打った。後手が玉を移動させなければ、その角を移動させて後手玉に王手することが出来ると言う。さて、その角が打たれた可能性のある場所はどこか?
答10) 問7)と同じなので簡単だと思います。まず、角の移動先の集合を求めます。これは、81の地点の馬の利きに等しいです。(馬の利きは先後の区別がないので単に馬の利きと書きますが、もし区別があるなら、実際はここは馬の"逆利き"です。)
987654321 ■玉■□□□□□□ ■■■□□□□□□ □□□■□□□□□ □□□□■□□□□ □□□□□■□□□ □□□□□□■□□ □□□□□□□■□ □□□□□□□□■ □□□□□□□□□
この■の地点に移動できる角の移動元は、次のようになります。
987654321 ■玉■■□■□■□ □■□■■□■□■ ■■■□■■□■□ ■□■■□■■□■ □■□■■□■■□ ■□■□■■□■■ □■□■□■■□■ ■□■□■□■■□ □■□■□■□■■
上の図が求める答えです。将棋がめっぽう強い人なら、この81の玉を見てこの図が頭に浮かぶ…のかどうかは私は知りませんが、機会があればトッププロの人に尋ねてみたいと思います。