はじめに

※このエントリは、ゲーム制作用のPLANS.mdと他のエントリを読ませてAIに書かせたものです。

パズルゲーム「Hodoku」を作った。

Hodokuのタイトル画面

宝石を二つ選ぶと場所を交換できる。宝石の間にはボンドがあり、最初はそれがぐちゃぐちゃに絡まっている。すべてのボンドが格子の上下左右だけを結ぶように宝石を並べ替え、一本の輪にできたらクリアである。

Hodokuのプレイ画面

ブラウザ上で動作するので、PCでもスマートフォンでも遊ぶことができる。4x4のEASY、6x6のNORMAL、8x8のHARD、10x10のNIGHTMAREがあり、それぞれ10問ずつ、全部で40問ある。HARDとNIGHTMAREは、その前の難易度を10問すべて解くと遊べるようになる。

以下、このゲームを作った経緯や、AIをどのように使ったかを記録しておく。

ゲーム作りの思い出

僕は中学生の頃からゲームを作っている。当時はMS-DOSの時代で、友達とチームを作り、アセンブリでグラフィックを表示するルーチンやキー入力を取るルーチンを作ってゲームを開発していた。その後はWindowsのゲームを作り、さらに時代が進んでFlashでもいくつかゲームを作った。昔はゲームのプログラムだけでなく、絵を描いたり曲を作ったり、だいたい何でも自分たちでやっていた。

しかし、研究や仕事が忙しくなるにつれ、だんだんゲームを作らなくなった。それが最近、子供の夏休みの工作として一緒にホラーゲームを作った。その時に久しぶりに「ゲームを作るのは楽しいな」と思い、また何か一本作りたくなった。

Hodokuのアイデア

Hodokuの元ネタは、昔「Pya!」というサイトで見たゲームである。点が線で結ばれており、点をドラッグして動かし、線が一本も交差しないようにするゲームだった。点は平面上を連続的に動かすことができたと記憶している。単純なルールだが、絡まった線を少しずつほどいていく感覚がおもしろかった。

同じものをそのまま作るのも芸がないので、今回は点を正方格子上に置き、二つの点を交換するゲームにした。点を宝石にして、宝石同士を結ぶ線をボンドと呼ぶ。正解では、すべての宝石を一度ずつ通って元の場所に戻る一本の輪ができる。つまり、格子グラフ上のハミルトンサイクルを復元するパズルである。

さらに、それぞれの宝石に色を持たせた。問題を解く前は色もばらばらだが、正しい場所に並べると色のついた宝石がピクセルアートになり、絵が浮かび上がる。線をほどくだけでなく、「完成すると何が出てくるか」という楽しみを加えたかった。

ゲームの名前は、日本語の「ほどく」からHodokuとした。英語のタイトルなのに由来が日本語という、やや変な名前である。

ChatGPTとCodexによる開発

開発にはChatGPTとCodexを使った。以前、AIエージェントを使ってQRコード生成ページを作った時と同様に、まずChatGPTを壁打ち相手にして仕様を決めた。格子の大きさ、固定宝石の扱い、クリア条件、難易度の解放、セーブデータ、画面構成などを相談し、内容をPLANS.mdにまとめた。仕様が固まった後は、基本的にCodexに実装させた。

開発は「パズル生成」と「ゲームUI」の二つに分けた。問題を作るプログラムはC++、ゲーム本体はGodot 4で実装している。両者をJSONでつなぎ、問題生成側が出力したデータをゲーム側が読み込む構成にした。このように分けておくと、問題生成の重い計算と、画面の見た目や操作感の調整を独立に進めることができる。

パズルの自動生成

問題はすべて自動生成した。まず、偶数サイズの格子を2x2のブロックに分ける。その粗い格子上にランダムな全域木を作り、各2x2ブロックの小さな輪を、全域木の辺に沿ってつないでいく。こうすると、すべての格子点を一度ずつ通る一本の輪、すなわちハミルトンサイクルを必ず作ることができる。

正解の輪を作っただけではパズルにならない。宝石をシャッフルした時に、元の配置以外にもボンドがすべてつながる配置があると困る。そこで、一部の宝石を動かせない「固定宝石」にし、別解が存在しないかをバックトラックで調べる。別解が見つかったら、その解と正解で位置が異なる宝石を固定して、再び別解を探す。最後に不要な固定宝石を取り除く。これにより、正解が一つしかない問題を自動的に作ることができる。

ただし、大きな格子では一意解判定の計算がかなり重い。枝刈りをいろいろ実装したが、それでも10x10の問題探しには時間がかかった。幸い、一つの乱数シードから問題を作る計算は、別のシードの計算と完全に独立している。そこでMPIで多数のプロセスを立ち上げ、それぞれに異なるシードを与える自明並列で大量に候補を探した。まさか趣味のパズルゲーム作りでMPIを使うとは思わなかった。

画像生成とピクセルアート

タイトル画面、背景、宝石など、ほとんどの画像アセットはAIに生成させた。細かい違和感を直したり、ゲーム画面に合わせて加工したりする必要はあったが、このあたりはかなり楽になった。以前ならゲームを作ろうと思った時点で、プログラム以外にも大量の絵をどうするか考えなければならなかった。

以下は、今回のゲーム作成にあたってChatGPTに生成させた「ROBOTA GAMES」のロゴである。昔このロゴを使ってゲームを作っていたわけではない。

ChatGPTに生成させたROBOTA GAMESのロゴ

一方、完成時に表示するピクセルアートはうまくいかなかった。4x4から10x10という極端に低い解像度、かつ固定された6色だけで、見てすぐわかる絵を40枚作ってほしい、とAIに頼んだが、どうにも微妙なものが出てくる。画像生成AIは美麗な絵を作るのは得意なのに、こういう強い制約のある小さな絵は苦手らしい。

仕方がないので、今度はCodexにピクセルアートエディタを作らせた。

Hodoku用ピクセルアートエディタ

サイズと6色のパレットが最初から固定され、ゲームがそのまま読めるJSONを出力する専用エディタである。このエディタを使い、最終的なピクセルアートは人力でぽちぽち描いた。AIに絵を描かせようとしてうまくいかず、絵を描く道具をAIに作らせて人間が描く、という妙な分業になった。

音楽

昔ゲームを作っていた時は、BGMも自分で作曲していた。今回もできれば自分で曲を作りたかったのだが、さすがにそこまでやっている時間はなかったため、SunoのProプランを契約して作曲させた。

「暗く幻想的なパズルゲーム用のループ曲」といった簡単なプロンプトを与えるだけで、すぐにそれらしい曲が出てきた。しかも、一曲できるまでが非常に速い。ゲーム中のループ曲を2曲とクリア曲を1曲用意したが、音楽生成AIをまともに使ったのは今回が初めてだったので、これほど簡単に曲ができることに驚いた。

2日で完成、しかしその後が長い

Hodokuは、作り始めてから2日で、ひととおり遊べるところまで完成した。仕様を考え、問題生成器を書き、ゲームのUIを作り、画像と音楽を入れ、ブラウザで遊べる形にするところまでが2日である。昔の自分に言っても絶対に信じないと思う。

ただし、「遊べる」と「完成した」の間にはかなり距離があった。スマートフォンで表示がずれる、ボタンが押しづらい、説明がわかりにくい、演出のタイミングが気になる、音量がおかしい、セーブや難易度解放の細かい挙動を直したい、といった修正が次々に出てきた。大枠を作るのは驚くほど速かった一方で、作ってからの細かい調整には意外に苦労した。

AIエージェントは、明確な仕様があるものを形にする速度がとにかく速い。しかし、実際に触って「なんとなく気持ち悪い」と感じる部分を見つけ、何をどう直すか決めるのは、まだ人間の仕事なのだろう。ピクセルアートも含め、最後の品質を決めるところではかなり人間が手を動かした。

それでも、思いついたゲームが2日で実際に遊べるようになるというのは、かなり衝撃的な体験だった。子供の夏休みの工作をきっかけに戻ってきたゲーム作りだが、MS-DOSの頃とは道具も作り方もすっかり変わった。変わっていないのは、動かなかったものが動き、頭の中にしかなかったルールを誰かが遊べる形にするのは、やはり楽しいということである。

なお、本エントリは、ユーザーが指定した内容と「他のブログの内容を参照して、僕のエントリっぽく書いてください」というプロンプトに基づき、Codexが生成したものである。