AOYAMA Koji's プログラミングブログ - プログラミングを楽しく体験

【技術解説】ゲーム仕様に学ぶ:UXから逆算した非対称の最適化【自動生成☆詰将棋】プログラマー向け実装解説

2025/08/24
【技術解説】ゲーム仕様に学ぶ:UXから逆算した非対称の最適化【自動生成☆詰将棋】

 自動生成☆詰将棋Webアプリでは、全パターン探索でメモリー不足などの技術的課題が生じ、それに対してゲーム仕様の調整で解決しています。 本記事では、具体的な例を交えて、その解決方法について解説します。 UXを考慮した一律ではない非対称の最適化をしています。
 なお自動生成☆詰将棋Webアプリは、この記事などでお楽しみください。

プログラミングブログ記事一覧



[PR]

全パターン探索と保持


 まずは一般的な、当初考えていたアプローチについて解説します。

全パターン探索


【技術解説】ゲーム仕様に学ぶ:UXから逆算した非対称の最適化【自動生成☆詰将棋】 全パターン探索
 今回用いているアルゴリズムでは、全パターン探索します。
 例えば先手番では、この図のように、先手の駒の動きをすべて調べます。

全パターン保持


 そして調べた結果をすべて保存します。 例えば前図の1手詰は以下の10パターンになります。
▲1二金 ─ ▽3二玉 [詰まず]
▲2二金 ┬ ▽同玉  [詰まず]
     └ ▽同銀  [詰まず]
▲3二金 ┬ ▽同玉  [詰まず]
     ├ ▽同銀  [詰まず]
     └ ▽1二玉 [詰まず]
▲3三金   [王手ではない]
▲2四金   [王手ではない]
▲1二歩成  [詰み]
▲1二歩不成 [王手ではない]

全パターン探索&保持の問題


 この図の1手詰なら、全パターン探索&保持で、特に問題はありません。
 しかし、詰み手数が多い場合や、複雑な場合に、パターン数が多すぎてメモリー不足になる場合があります。
 特に、持ち駒は、盤上のすべての空きマスに打てるため、パターン数が爆発的に増え、問題が発生しやすくなります。

状況に対応した非対称の最適化


 前記問題を解決するためには、技術的な工夫のみでは限界があります。
 そのため自動生成☆詰将棋シリーズでは、ゲーム仕様を調整しながら、技術的問題を解決しました。
 その仕様調整は、状況に応じて、一律ではなく、特性に応じた非対称の最適化をしています。 順次解説します。

先手番では王手に限定


【技術解説】ゲーム仕様に学ぶ:UXから逆算した非対称の最適化【自動生成☆詰将棋】 王手に限定
 まず、先手番では、この図のように王手のかかる手順に限定しました。
 探索対象を王手に限定すると、ゲームをプレイするときに、好きな場所に移動したり、持ち駒を打つことができなくなります。
 しかし、詰将棋を解くゲームとしては、王手がかかる手しか選べない仕様でも特に問題ないと考えます。 そのため、この仕様調整を行いました。
 結果として、前述の10パターンから以下の7パターンに減少し、探索時間とメモリー削減が実現できています。
▲1二金 ─ ▽3二玉 [詰まず]
▲2二金 ┬ ▽同玉  [詰まず]
     └ ▽同銀  [詰まず]
▲3二金 ┬ ▽同玉  [詰まず]
     ├ ▽同銀  [詰まず]
     └ ▽1二玉 [詰まず]
▲1二歩成  [詰み]

後手番では詰まない手順を発見次第探索打ち切り


【技術解説】ゲーム仕様に学ぶ:UXから逆算した非対称の最適化【自動生成☆詰将棋】 全王手解除探索
 先程の図から、例えば▲3二金を選択した場合、後手の王手解除方法は、この図の矢印の3通りあります。 そして、すべて最終的に詰みません。


【技術解説】ゲーム仕様に学ぶ:UXから逆算した非対称の最適化【自動生成☆詰将棋】 王手解除は1種類
 自動生成☆詰将棋シリーズでは、後手番で詰まない手順が1つ発見されたら探索を終了します。
 そしてゲーム仕様として、先手番はプレイヤーが操作、後手番は自動操作としました。
 その場合、詰まない手順をすべて確認する必要はないため、後手番の自動操作で選ぶための1種類があれば十分です。
 これにより、保存メモリーおよび、探索時間を大幅に削減できます。 結果として、前述パターンは以下の4つに減少します。
▲1二金 ─ ▽3二玉 [詰まず]
▲2二金 ─ ▽同玉  [詰まず]
▲3二金 ─ ▽同玉  [詰まず]
▲1二歩成 [詰み]

後手番で詰む場合は全手順


【技術解説】ゲーム仕様に学ぶ:UXから逆算した非対称の最適化【自動生成☆詰将棋】 詰み手順の王手解除は全パターン探索
 ただし、後手番で詰む場合は、全手順を探索し保持します。 詰将棋の解を確認する場合は、すべての王手解除に対する確認をしたいからです。 これはゲーム仕様として担保すべき部分と考えてのことです。
 技術的に困難だからという理由でも、面白さの芯というべき、妥協せず守るべき仕様は存在します。

長手数では詰み手順に限定


【技術解説】ゲーム仕様に学ぶ:UXから逆算した非対称の最適化【自動生成☆詰将棋】 詰み手順に限定
 さらに長手数の詰手順探索を行うと、やはりメモリー不足に陥りました。 そこで、詰まない王手は保存しないよう仕様変更をしています。
 ただし、自動生成☆詰将棋の通常のゲームには影響しないように、5手詰以下では、全王手を保持しています。
 7手詰以上は詰将棋ソルバー向けになり、そちらは詰み手順だけを保存しています。 プレイ時にも選べません。 詰将棋ソルバーは、それで十分要件を満たしていると考えます。
 これにより、大幅にメモリー不足を解消しています。
 前記パターンは1手詰なので本来は対象外ですが、もしこの限定を当てはめると1パターンになります。 当初から 10 → 7 → 4 → 1 とパターン数を減少させられています。
▲1二歩成 [詰み]

超長手数では詰み手順を発見次第探索打ち切り


 さらに超手数の詰手順探索処理では、時間とメモリーの両方が問題になりました。
 そこで、13手詰以上については、詰み手順を発見したら、探索は打ち切り、他の王手は調査しません。 こうすることで、探索時間とメモリーの両方を削減できています。
 ただし、この方式は、意図しない解答になってしまうことがあります。
 そのため、世間でよく見る11手詰までは、意図しない解答にはならないよう全王手を探索しています。 13手詰以上の詰将棋は多くはないので、技術要件を優先して、詰み手順を発見次第、探索を打ち切るようにしました。
 これにより、超長手数の詰将棋では大きく効果を発揮しています。

他ゲームやアプリでの応用


 技術要件に合わせたゲーム仕様の調整は、色々なゲームやアプリ製作において、実施すべきと考えます。

ゲーム業界のプランナーとプログラマー


 ゲーム業界は業務が細分化されています。 例えばゲーム仕様を担当するゲームプランナーと、プログラム実装を担当するゲームプログラマーという分類があります。

ゲームプログラマーの役割


 ゲームプランナーがいる場合、ゲームプログラマーはゲーム仕様に口を出してはいけないと考える方もいるかもしれません。 しかし筆者の持論はそうではありません。 ゲームプログラマーはプログラミングだけが仕事では無いと考えます。
 単に仕様書の通りに実装するのではなく、 その面白さや魅力を実現するために、 仕様変更の提案もすべきです。
 実現困難な仕様書でも、そこからほんの少し変更するだけで、例えば実装期間の短縮に繋がることはよくあります。 そうなれば、ゲームプランナーが目指す仕様が、予定期間内で実現できる可能性がグンと上がります。
 ゲームプログラマーの皆さんは、実装について最も熟知しています。 目指す面白さを理解できたなら、それを達成する範囲内での仕様調整を含めて、実現方法に責任をもつべきです。

ゲームプランナーの役割


 ゲームプランナーの皆さんは、ゲームプログラマーに「できません」と言われたら、 それは面白くなかったと理解すると良いでしょう。 なぜなら、面白いと感じたなら、期間が足りないとか、ここの実装が難しいなど、理由を明確にし、場合によっては仕様調整や実現方法の提案もしてくれるはずだからです。
 ゲームプランナーは面白さや魅力に責任を持つべきで、実装はゲームプログラマーに頼るのが良いでしょう。
 注意点として、仕様調整の提案を受けたり、実装が不十分な場合に、実現したいことの芯が崩れるのであれば譲らないべきです。 安易な妥協をしてできあがったものが面白くなくなってしまったら、本末転倒です。

まずは信頼関係を


 より重要なのは、そうした意見交換ができる信頼関係の構築だと考えます。 チーム製作ですので、お互いの強みを活かして進められるとベストでしょう。
[PR]

まとめ


 本記事では、ゲームの仕様調整を伴う、UXに基づいた非対称の最適化について解説をしました。
 また、他ゲームへの応用について、筆者が考えるゲームプログラマーの役割と共に記載しました。
 本記事の事例が、少しでも、実装都合で仕様調整する意義の参考になりましたら幸いです。

補足

  • 記事の校正/添削に生成AIの Anthropic Claude を利用しております。
  • 記事内の画像の作成に生成AIの OpenAI ChatGPT を利用しております。
  • 画像内のラスタライズ文字フォントにOpen Font LicenseNoto Sans Japaneseを使用しております。

カテゴリー:自動生成☆詰将棋,プログラミング解説
[PR]