将棋ベーシックの手生成について仕様を書いてみるよ!

「コンピュータに将棋のルールを覚えさせる」ということがどういうことか。IBMがチェスソフトディープブルーを作った時にはルールを覚えさせるだけで1年近く研究したそうです。「ホントにそんなにかかる?」と疑問ですが。

まず表1を見てください。

f:id:karmen:20181121132711p:plain

まず将棋盤を0から80の81個の文字型配列で表現します。

なぜ文字型を使うかと言うと、先手の歩から1で香車が2桂馬が3と竜王まで数えると14までかかり、後手の歩が15で竜王まで数えると28までかかるので、6ビットあれば32まで数えられて充分なので、8ビット型の文字型を使います。

そんで、初手の良くある2六歩を指そうと思ったら、2七つまり61番地にある1の歩を2六つまり52番地に移動させるので、指し手に歩である1をメモリーして、61番地を0にして52番地を1にします。

もし、コンピュータにルールを教えなかったら、コンピュータは歩をどこに動かしたら良いか分かりません。61番地にある歩は52番地にしか動かせない。この「盤面で言うとマイナス9番地にだけ移動させられる」というテリトリーの判別プログラムが「手生成」と言われるプログラムです。

そして合法手とは「味方の駒には乗れない」「香車飛車角が駒を飛び越せない」「敵陣に入ったら成ることが出来る。敵陣以外では成れない」「盤の外にはいけない」などがあり、初心者プログラマーがうかうかしていると飛車が70番地から右に行くと71番地までしか進めないのですが、右にプラス2してしまって左下の72番地まで行ってしまうというようなプログラムミスで何件かの将棋プログラムは反則負けをしています。

そのため、駒の動かし方と盤の端でチェックを行い、バグなくどちらも自分で番地を入力して指す将棋盤のプログラムを完成させることがコンピュータ将棋の最初の課題で、取った駒をメモリーして盤に打つことも合わせると、それだけで数百行になります。

たとえば成香を取ったら手駒は香という当たり前のことでもコンピュータには成駒を取ったらひっくり返すということを逐一プログラムする必要があります。面倒です。

しかし、一歩ずつ行けばとりわけ天才でなくても出来る仕事だとは思っています。ただし「考えさせる」というレベルになると配列だけでなく木構造などのアルゴリズムの知識とプログラミングテクニックが必要になってきて、解説も仕様書レベルの図説だと書ききれないほど膨大になってしまいます。だから、ある程度は頭の中に文字配列の将棋盤が描けるくらいのコンピュータ的な想像力が無いと、厳しいかもしれません。

まあ、俺も人がどう思っているか想像がそんなに当たるわけではないのですが、簡単に噛み砕いてみたら分かる人も出てくるかなと思って書いてみました。