将棋ソフト開発(仮)

将棋のソフトを作るのです。趣味で。

電王戦Final - 第二局

PCメイン機が壊れました。

現在ほとんどのことが何もできません。

いつ直るのか、本当に直るのかも見通しが付きません。

 

そっくりそのまま直したいのですが、深刻なマザーボードの故障のようで、

同一のマザーボード、しかも内部のチップセットBIOSまでもが同一のマザーボードを発見してこないと直りそうにありません。

しかも製造中止になってるマザーなので、日本中の中古屋に在庫を確認中です。

マザーの内部シリアル番号まで合わせての問い合わせなので、嫌な顔されまくっております。

あぁ、もうほんと最悪。

 

 

さて、電王戦は第二局が終了しました。バグが発生して終局となりましたが、

対局自体、結果、過程、ルールなどに関しては書かないようにします。

(良い印象を受けなかったので)。

 

 

私のソフトではこのようなバグは (仕組み的に) 起きないので、

実際の所、なぜそうゆうバグが発生したのかは分かりません。

加えて、私は人 (他人) が作った物を参考にせず作ってるので、

人のソフトがどうなってるのか、想像すら付かないことがあります。

 

なので予想ですが、

USIから送られてきた「現在盤面」までの生成過程で、

Selene側でも「合法手」であるかどうかのチェックがおこなわれていたのではないでしょうか?

 

ちなみに私のソフトでは、私はそれは無意味だと思っているので、やったことがないのです。

Selene側の処理は分かりませんのが、私のソフトの仕組みを少しだけ書いてみようと思います。

 

まず、USI (GUIとエンジンを結ぶ通信名) は、

エンジンに対して対局の「初期局面」を送ってきます。

加えて、現在局面に至るまでの指し手が添付されています。

これを組み立てることにより、「初期局面」「現在の局面」「そこまでの手の流れ」 の三点が分かるわけです。

 

私のソフトの場合、この時点では深いことは考えずに、

USIの言うとおりにガチャガチャガチャと現在局面を言われたとおりに組み立てて行きます。

この時点で、エンジン側は、合法手であるかどうかの判断は付きません。

将棋のルールさえ把握してませんし、駒の動き方も知りません。

私のエンジンが知ってるのは、初期局面から現在局面に対しての組み立て方のみです。

 

知っていても意味がないのです。

なぜなら、エンジンはGUI側の命令に立て付くことは出来ないので。

なので、言われたとおりに駒の位置を動かすのみです。

 

 

少し話はそれますが、もし、相手が非合法手を指していたとしても、勝ちを宣言することはおろか、

エンジンはGUIに対し、抗議することさえ許されません。

したがって、現在局面を作るまでの地図が、非合法であるか、合法であるかのチェックをするのは、エンジンにとって無駄な作業です。

(もっとも私のソフトの場合、他の所で無駄なことをいっぱいやってます)。

 

初手で52飛車(王手)の移動が記載されていた場合、

28にある飛車を、52の位置に移動せねばなりません。

それは将棋のルールでもなんでもなく、そう書いてあるからエンジンはそうしなければならないのです。

 

とは言っても「普通は」バグがない限り、GUI側が将棋のルールを把握し、ジャッジするものなので、変な命令は送られて来ません。

普通の将棋で言うところの、記録係や審判みたいな役目をすべてGUIが引き受けます。

GUIがそうしろと言ってくるからには、GUIが正しいのです。抗議をする権利もないレベルで。

 

(※現実上の問題では、GUIが変なことをやってくるなら、「エンジン作者の私自身」が「GUIの作者」に対して抗議します。「おたくのGUI、将棋のルール間違ってますよ」、と。)。

 

 

話を戻して、それが終わると、現在の局面が完成します。

 たぶん、おそらくですが、Seleneは、

 このただの局面組み立ての時点で、駒の動き方をすでに知っていて、

しかもそれを照合していたのでしょう。たぶんですが。

 

その時「角成らず」は、不必要との考えから、

Salene側には合法手の一覧には加えられていなかったのでしょう。

その結果、情報の辻褄が合わず、なんらかのバグが出てしまった・・・。

 

 と言うことなのではないでしょうか。

 

 

 さて、私のソフトは、この状態から将棋のルールの把握に入ります。

駒の動きを教える際、若干厄介なのが、飛車と角、香車です。

なぜならこれ、駒単体では動ける位置を決めれないからです。

金や桂馬などは、「ここに動ける、味方の駒があったら動けない」と言う単純な命令で済みますが、

飛角香に関してはそれはダメで、先に盤面全体の把握が必要で、

それに沿って動ける位置が決まります。

 

そんなわけで、私のプログラムでは、

「合法手全部出しますよルーチン」に対して盤面を送りつけると、

その盤面内の、全ての駒のその動ける位置がリストになって一気に返ってきます。

ちなみに、成ると成らずは別の動きとして算出されますが、

無駄っぽい動きに関しては、盤面検索ルーチンで一括削除しています。

 

私のプログラムでは、この時に合法手と、非合法手の切り分けがおこなわれます。

と言うことでこの段階 (合法手全部出しますよルーチン) では、

飛車成りと、飛車成らずの両方の動きは認めますが、

42桂成らずのような非合法手は削除されます。

(削除と言うか、その手の存在を最初から発生させません)。

 

ちなみに飛角歩などの成らずに関しては、一撃で検索ルーチンから削除されますが、

検索の途中で打ち歩詰めが発見された際は、成らずの動きが解禁されます。

 

 

なんで、記事でここまで書いたかと言うと、

以前、飛車を正しく動けないソフトが予選にエントリーされていて、

しょうがないから、飛車は1マスずつしか動けない、と言う応急処置(?)を取っていたソフトがあるんですよね。

 

世の中にはそうゆうバグ(?)もあるんだな、と言うお話でした。