パズルゲームのレベル生成
ここでは、レベル、つまり面のパターンの自動生成について考えてみよう。ゲーム&ウォッチのような単一の画面で遊ぶゲームはともかく、多くのゲームは複数の面があったり、スクロールに応じて出てくる地形があったりするので、レベルの生成が必要となる。
どれだけ質の良いレベルを作れるかがゲームの出来にダイレクトに効くのは、何と言ってもパズルゲームだ。特に倉庫番 1 のようなアクション性が無いパズルゲームにおいては、いかに解くのが楽しいレベルが作れるかがとても重要である。
倉庫番のレベルジェネレータはすでにいろいろある。作り方としては、
- 箱が配置されていない空の部屋を作る。
- 箱を正解位置に置く。
- ゲームを逆にシミュレートして箱を適当な位置に散らす。
というのが一般的だ。3.は要するにプレイヤーで箱を「引いて」ずらしていけば、その結果移動される箱はちゃんと正解位置へ移動可能であるということを保証できるという意味だ。
上述の方法に基づくジェネレータ実装の一例 2 を見ると、プレイヤーが動けなくなったらバックトラックして他の置き方を探している。生成方法を記した論文 3では、プレイヤーが箱を直線方向に押す回数や、別の箱を押しに行く回数などのメトリクスを導入し、正解位置からなるべく離れた、つまりプレイヤーが行うべきことが多くなるレベルを作っている。
汎用のパズルゲーム作成用言語 PuzzleScript 4 で作られた、任意のパズルのレベルを生成することを目標とした論文 5 もある。PuzzleScript ルールのアナライザから、ゲーム内オブジェクトの特性をレベルのジェネレータとレベルのエバリュエータに渡してレベルを生成させる。これは、後段のエバリュエータが生成されたレベルが解けるか、解いて楽しいか、などを判定するアプローチなので、先述の逆方向のシミュレーションを行う方法とは異なる。
既存アプローチは多岐にわたるが、ここでは自作パズルゲームに対してレベル生成を試みてみよう。
倉庫番とペンゴをつまみ食いしたようなパズルゲーム、slickslack 6を作ってみた。青い四角で表示される箱をフリックでスリップさせて、黄色の正解位置へ置くのが目的のゲームである(画像クリックでプレイ)。
レベル自動生成方法は他の倉庫番ジェネレータと同様の正解から逆方向にゲームをシミュレートする方式とした。ただし、空の部屋を最初に作るのではなくて、全て壁の部屋を作ってから箱を逆方向にスリップさせつつ壁を掘っている。
- 適当な大きさの全て壁(正確には壁か空白どちらでもいい状態)からなる部屋を作る。
- 正解位置に箱を置く。
- 箱を適当な方向に適当な距離スリップさせる。
- スリップ開始時にスリップ方向と逆方向に壁を置いてそこで止まるようにする。
- スリップした場所は空白で確定する(壁を掘る)。
上記スリップ動作を適当な回数行ってレベルを作る。ただこれで闇雲に作ってもあまり楽しいレベルが出来るとは限らないので、ちょっとだけ細工をしている。
このパズルではプレイヤーキャラがいないため、かなり自由に箱をスリップさせることが出来てしまう。そのため、パズルっぽさを出すには箱をスリップさせる順番や、別の箱にぶつけて箱を適切な場所で止めるにはどうするかを考えるような、箱と箱の間のインタラクションが多いものにしないといけない。また、壁が多すぎるとより制約が減ってしまってパズルっぽさが減る。それらを踏まえて、
- スリップさせる時はなるべく壁を作らないで、すでにある壁や箱で止められる方向を優先する。
- スリップさせた後になるべく他の箱に隣接させるようにする。
という工夫を加えた。
また別のレベル自動生成パズル HAKOSAN 7 というゲームも作った。上下左右キーで 3 つのキャラクタを同時にスライドさせて、赤い目的地まで同時に到達させるのが目的だ(画像クリックでプレイ)。
これも同様に、目的地に配置したキャラクタを逆方向にスライドすることでレベルを生成している。
このように、正解から逆方向にパズルを進行させることで問題を自動生成する方法は、多くの場面で応用可能だ。あとは PuzzleScript 論文にあるようなエバリュエータを加えてレベルの楽しさを判定し、生成したレベルを選別できるとより良い。この論文では正解位置と箱の距離や、プレイヤーの操作数、適用されたルール数などを使って評価を行っている。これらのメトリクスがレベルを解く際の楽しさをちゃんと反映しているかは確証が無いが、明らかに楽しくないレベルを弾くには使えそうである。余力があれば、このような工夫も盛り込むとより良い。
1. 倉庫番 ↩
2. sokoban ↩
3. Procedural Generation of Sokoban Levels (pdf) ↩
4. PuzzleScript ↩
5. Automatic Puzzle Level Generation: A General Approach using a Description Language (pdf) ↩
6. slickslack ↩
7. hakosan ↩