将棋UI実装への道

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

棋力向上に役立つアプリを作りたいと思い、いくつかのアイデアがあるのだが、これを実現するためには、将棋盤UIの実装を避けては通れず、これがかなり難しい代物だ。

Shogi20160822

ココナラで「JavaScriptでのボードゲームの作り方を教えます」という出品を見かけたので、早速、注文してみたのだけれども、サンプルコードが送られてきた他、ドットインストールの講座の案内だったりしたので、自分にとっては、あまり役には立たなかった。

ただ、「自分はお金を払っててでも、これを実現したいのだ」という思いが明確になったことはよかった。

ウェブ上に公開されているJavaScript将棋盤や将棋プログラムのデータ構造に関する情報を参照しながら、最終的なゴールを目指して、地道にやっていきたい。

先の見通しをつけるために読んでいたのは、こちらのサイトだ。

http://usapyon.game.coocan.jp/ComShogi/index.html

将棋盤UIの実装に向けて必要なことをイメージする

まずは、データ構造については、駒をオブジェクトにして、それぞれの効きをプロパティとして保持する。だけでなく、先手と後手の駒台も実装する必要がある。成判定をするためには、陣地の概念も必要だ。

駒の初期配置についても、一般的な将棋の初期配置だけでなく、自由に配置できるように実装したい。これをすることで、応用範囲が広がるのではないか、と思う。

また、駒オブジェクトにはイベントを付加する必要があり、例えば、駒クリック時のイベント駒クリック後に他の升目をクリックした際のイベント(移動可能な升目の場合、移動付加の升目の場合、移動先に他の駒が存在した場合など)、駒台クリック時のイベントなどが思いつく。

将棋学習用の用途を考えているため、棋譜の入出力にも対応したく、駒の移動の記録は配列に格納する形になるのだろうか。

……と、ここまでが、将棋盤のUIとしての実装で、この他に、将棋のルールに基づいた合法手の判定も考えていく必要がありそうだ。

合法手の判定としては、自玉が取られるような移動の禁止の実装も単純なものではなく、効きの概念(チェスでいうピンの概念)も含めると、かなり複雑なロジックになりそうだ。

その他、強制成りの判定や、連続王手の千日手禁止(棋譜の記録の実装が必須だと思う)など、さらには、打ち歩詰めの禁止までを取り込もうとすると、駒を進めるたびに、詰み判定が必要になりそうだ。

というわけで、かなり先が長そうなので、ある程度、チャレンジしてみたところで、外注するか利益シェアで協力してくれる技術者を探してくる感じになるかもしれないが、まずは、少しずつでも進めてみたい。 

今後の計画

  1. 将棋よりも駒の数が少なく、ルールも単純なオセロを作ってみる
  2. 成りと駒移動の実装の練習のため、どうぶつ将棋のようなミニ将棋盤を作ってみる
  3. いよいよ将棋盤の実装にチャレンジする(京都将棋などの特殊ルールの将棋盤も実装したい)

そして、将棋盤が実装できたら、冒頭で述べた「棋力向上に役立つアプリのアイデア」を試すことができるようになるわけだ。こうやって考えると、スピーディーに進めるためには、誰か技術者の協力は必須かもしれない。悩ましい。