無限ミニゲーム生成器を今度は遺伝的プログラミングで作ろうかと

思っていたのだけどやはりうまくいかん。

game-combinator

前回の無限ランダムひどいアクションゲーム生成器への道ではボタンを押した時にゲームに与える影響をランダムに変化させてゲームを生成しようとしていたけど、いまいちゲームにバリエーションが出ないのが欠点だった。

もうちょっとドラスティックにゲームの構成を変えないとバリエーションが得られないかなと思って、今度は遺伝的プログラミングっぽくゲームのコードを組み合わせて新しいゲームを作るアプローチを試してみた。

例えば、

game-combinator-helmet

のような上から降ってくる物を避けるゲームを

(game helmet
  (actor stage
    (if initial (spawn player))
    (if (random frequently) (spawn enemy))
  )
  (actor player
    (if initial (place bottom_left))
    (if (key left) (move left))
    (if (key right) (move right))
    (if (touch out_of_screen_right) (
      score
      (place bottom_left)
    ))
    (if (touch out_of_screen) (move step_back))
  )
  (actor enemy
    (if initial (place top))
    (accelerate down normal)
    (if (touch player) miss)
    (if (touch out_of_screen) remove)
  )
)

のようなDSLで書く。同様にこの手のゲームを10個ほど作り、それらの構文木を適当に混ぜ合わせる、と以下のようにゲーム、か?みたいなものがいくつができる。

game-combinator-generated

上記の謎のDSLは、ゲームを混ぜ合わせたときでもそれほど破綻のないよう、

  • 構文が簡単
  • 数値を使わない
  • ゲーム中のアクターは自機とショットと敵と敵弾、あとステージに限定

という方針で作ったもの。お陰で一応混ぜたものはだいたい実行できる。実行はできるのだが……

問題は、できたものがかろうじてゲームと呼べるものになることが極めてまれということだ。ゲームと呼べるとは、

  • キー入力すると何かが起こる
  • プレイヤーが意図してスコアを得る手段がある
  • プレイヤーが何かを失敗してミスすることができる

という極めて意識の低い設定によるものだが、このハードルすら越えられないひどいものがほとんどである。

ごくまれにハードルを越えてゲームと呼んでやってもいいものもできる。

rainy day

game-combinator-rainy-day

これは上から降ってくる雨をよけるゲームだと思われる。この青いキャラは本来はプレイヤーのショットなのだがそれが降ってくる障害物っぽい挙動に変わった上でプレイヤーに当たるとミス扱いになるようにもコードがたまたま変わったのでゲームとして成り立っているっぽい。上端にあるキャラは謎。

racket fire

racket_fire

最初の10個のゲームの中にゲーム&ウォッチのファイアっぽいゲームがあったのだが、それはプレイヤーの幅が1キャラ分しかなかったので同時に複数の人が落ちてくるとさばききれないという問題があった。この生成されたバージョンはプレイヤーを横に長くしてちゃんと受け取れるようにしてくれている。ありがとうございます。でもなんでプレイヤーを画面中央に置き直しているんですかね。元のゲームの通り画面下でよかったんですけど。

とまあ、ぎりぎりゲームと呼べるものがたまにできるが、それもベースの10個のゲームがそれほど混ぜられてなくて遊べる状態で残っている、みたいなものが多く、全く新しいものができてしかもそれがゲームになっている、みたいな感じはあまりしない。

今回のデモでは100個のゲームを生成した上でそれから有望そうなのを10個表示して、それが同時に遊べるようにした。

有望そうってのを判定するためにいわゆるゲームとしての適応度みたいのを一応算出しようとしている。対象のゲームを複数同時に動かして、それぞれに操作をランダムに与えた時の

の差分を算出して、それが最初の10個のゲームと似たような傾向にあればゲームっぽいという判定をしてそれを適応度とした。ゲームなんだから違う操作をした時にはゲーム展開になんらかの差分が出るべきだろうという基準。

また[GENERATE FROM LIKED]ボタンを押すと表示した10個のうちLikeチェックボックスがオンのものから次のゲームを生成するという、Interactive Genetic Algorithmっぽいこともできるようにした。

現時点の問題点としては、

  • ゲームのバリエーションがまだまだ確保できてない
  • できたものからゲームっぽいものが正しく選別できてない

あたり。

バリエーションについては種になる10個のゲームをもっと増やしたり、DSLの命令セットを増やすことで少しはましになるかと思われる。

ゲームの選別基準は、難しいね。今回使った適応度は操作しても何もおこらないみたいな明らかにダメなものを弾くには使えるけど、ちゃんと遊べるゲームを選ぶという点ではあまり期待できない。DQNみたいなゲームAIに遊んでもらってAIがちゃんと上達するかを見る、みたいなアプローチもありそうだけど、ちょっと計算コストが高すぎて気軽に試すのは難しそう。

とりあえずもう少し種ゲーム増やしてみて様子見してみることにします。