将棋盤をプログラム上で表現する上でのアイデア

この記事の所要時間は約 2 分 です。

チェスのプログラムにおいて、チェス盤の各升目を配列の要素として扱い、その配列のオーバーフローの処理を省くために、盤外にもダミーの升目を設け、そこに番兵(壁)を設定しておく、という表現方法がある。

そして、将棋においても、これは同様であるが、歩、香、桂の強制成りのルールがあることを考えると、ダミーの升目の数はチェスよりは少なくてもよいはずだ。(チェスは、八方向に桂馬跳びするナイトの存在があるため、盤上のどの位置からでも八方に桂馬跳びする駒がいる可能性を考慮する必要がある)

一次配列で定義することの意味

過去の記事で書いた通り、JavaScriptで書いてみた将棋盤において、二次配列を採用していた。ただ、これは、駒移動する際の座標をx軸とy軸のそれぞれで引き渡さねばならず、すこしばかり手間がかかる。

これを単純化して、ロジックをすっきりさせるためには、以下のような一次配列で定義してみてはどうだろうか?というのが、盤の表現に関する1つのアイデアである。

board_array

上記の図を見ていただくとわかるが、盤外の定義については、右側にはみ出た場合の升目と左側にはみ出た場合の升目は共通化する。どの道、盤外の升目には、番兵が入っているため、ここには駒は移動できない。

そして、上記のような一次配列で扱うことにした場合の大きなメリットとして、例えば上に1マス移動する場合においては、10マイナスすることで実現できる。先手の桂馬跳びであれば、マイナス21かマイナス19だ。事が単純化されるのは、歓迎されるべきことだ。

また、1次配列化することで、sfen形式の局面データを入出力する際にも、ロジックがすっきりしそうだ。(“段”の区切りに使用される”/”を番兵に変換するようにしておけば、sfen形式を一気に取り込むことができる)

次回は、この1次配列化の実装と、1次配列化された駒に対する可動域判定と駒移動を実現したい。