小さなゲーム作りでLLMができること、できないこと

前にChatGPTなどのLLM(大規模言語モデル)を使って小さなゲームを作るのはまだ難しいのでは、という記事を書いた。

ChatGPT を用いたゲーム考案の方法はいくつか考えられるが、ChatGPT に新しいゲームを考えさせ、それを実装させることは難しい。少なくとも現状の ChatGPT には、以下の課題があるように思える。


GPT-〇〇 になればこの辺の問題は解決される?

分からない。

画像生成 AI の急激な改善を見ていると、半年後にはこの辺の問題は解決するのかもしれない。モデルの規模で乗り越えられる課題なのか、そもそもアプローチとして筋悪なのか、どちらかは現時点では不明だ。

GPT-4より一部のタスクにおいては優れた結果を出しているClaude3の登場によって、このGPTほにゃららになればどの辺の問題がどの程度解決可能なのか、ということが多少予想できるようになった。

前にChatGPT (GPTs)を使ったワンボタンアクションミニゲーム制作を試した。

これと同じことをClaude 3 Opusを用いて試してみた。その結果としては、

  • 生成されるアイデアの質は向上し、ワンボタンでの操作の特徴をうまく活かしたルールを生成できるようになった。
  • ルールを実装したソースコードも最初からそれなりの質のものが出るようになったが、まだ不完全。
  • 適切な難易度設定や、リスクとリワードに応じたスコアリング、ゲームオーバー条件設定などはほとんどできない。

という具合に、改善した部分とあまり変わらない部分があった。

これを手掛かりに、今後LLMが高性能化した時に、小さなゲーム制作においてできること、できないことを想像してみると、以下のような感じだろうか。

  • できること
  • できないこと
    • 作ったゲームの良し悪しの判断。
    • ゲームの悪いところの改良。

ここで言うゲームの良し悪しとは、以下のようなことを意図している。

  • ゲームとして成り立っているか。不条理なゲームオーバーや、永久パターンなどが存在しないか。
  • 適切なリスクやリワードを備えているか。プレイヤーの技量に応じてスコアやプレイ時間が伸びるようになっているか。
  • 楽しいか。プレイ感覚が直感的で、爽快感などを感じる内容か。

上記の問題に対する改良としては、以下が一例となるだろう。

  • ルールの改良。ゲームオーバー条件やスコアリングシステムの変更。
  • パラメタの調整。自機や敵の速度や出現頻度の変更。
  • 操作方法の改良。プレイヤーに取って分かりやすくストレスを感じない操作への変更。

これらはLLM単体でなんとかできるとは思えない。作ったゲームの良し悪しの判断を行うためには、コンピュータが実装されたゲームを自らプレイし、その結果を解析する必要がある。ただ、LLMに限らない範囲では、ゲームをプレイするAIはすでに存在するので、そういった仕組みと併用することで現時点でもある程度は可能であろう。爽快感などの人間感覚を、コンピュータがどの程度理解可能かは正直よく分からない。

ゲームの悪いところの改良をコンピュータに行わせることは、とても難しそうだ。AIがゲームの良し悪しを判断できるのであれば、それを報酬とした強化学習的な仕組みでなんとかできるかもしれない。ただ、ゲームを良くするためにルールや操作方法などを適切に改良することや、非常に多岐に渡るゲーム中パラメタを適切に調整することは、AIに可能なのだろうか。

なので現時点ではLLMのできることに限定して、小さなゲーム作りを助けてもらった方がよさそうだ。そうすると、プロンプトを通じてLLMにやってもらうことは以下になる。

  • ユーザから与えられえたテーマに沿って、いくつかのゲームアイデアを作成する。
  • ユーザが選んだゲームアイデアに対応するルールを作成する。
  • ルールをゲーム内オブジェクトごとのプロパティ、形状、動作、衝突イベントなどに詳細化する。
  • 上記ルールをプログラム内コメントとして含んだスケルトンコードを作成する。
  • ケルトンコードを実装するためのライブラリ知識を与え、実装されたコードを得る。

ここまでがLLMにやってもらうこと。出来上がったコードやゲームは不完全なので、以下は人手で行う。

  • コードの不具合や意図通りになっていないルールに対応する修正。
  • ゲームとして成り立つためのルール、コードの改良。
  • リスクやリワードを加味したゲームオーバー条件やスコアリングシステムの追加。
  • ゲームを楽しくするためのルールやパラメタの調整。
  • 難度上昇方法の実装、難度曲線の調整。

こう考えると、LLMを使ったところであまり作る手間は減って無さそうに見える。ただ、LLMが実装したコードを見ると、結構面白い挙動をするものが出てくることもたまにある。なので、そういったゲームの発想のベースとなるトイ(おもちゃ)を作る、という用途には今でも使えそうだ。これからモデルの精度が上がっていくと、最初から全く使い物にならないようなハズレも減っていくように思える。

Claudeで上記の動作を行うためのプロンプトや、それを改良して完成させたいつくかのゲームは以下のリポジトリに置いた。

新しいLLMが出てきたら、プロンプトを改良しつつ、引き続き小さなゲーム作りに活用していきたい。

Claude 3 OpusはGPT-4では難しい「オホーツクに消ゆ」ライクなアドベンチャーゲーム生成ができる

ChatGPTにGPTsが搭載されたころ、テーマを与えるとそれに沿ったアドベンチャーゲームが作れないかと試していた。特に「オホーツクに消ゆ」のような、コマンド選択式のミステリーアドベンチャーを色々と遊べたら楽しいかなと思っていた。

結果としてはうまくいかなかった。GPT-4が作成するストーリーは具体性に欠け、実在(しそうな)人物やローケーションなどに沿った展開を持たせることが難しかった。

最近Claude 3とよばれる、GPT-4を凌駕するといわれるLLMが現れた。なので今度はこれを使ってアドベンチャーゲーム生成を試してみた。使うモデルはProユーザーが使えるClaude 3 Opus。

例えば「上野駅」をテーマにして生成すると、以下のようなゲームができる。


上野駅4番ホーム。午前9時頃。 ホームの端で、男性の刺殺体が発見された。あなたは、現場に駆けつけた刑事の沢村。 目の前には血まみれの遺体が横たわっている。

  1. 遺体を調べる
  2. 現場を見渡す
  3. 証拠を探す
  4. 周囲の人に話を聞く

1:遺体を調べる。

被害者は60代後半の男性だ。胸に複数の刺し傷があり、出血多量で死亡したようだ。 顔は蒼白で、目は見開かれている。身元を示すような所持品は見当たらない。 死後硬直は始まっていないため、死亡したのはつい最近だと推測される。

ポケットの中を調べると、血で濡れたメモが見つかった。 メモには「市川」という名前と、「博物館」という文字が書かれている。 被害者はこの「市川」という人物に会う予定だったのだろうか。 メモは重要な手がかりになりそうだ。

  1. 現場を見渡す
  2. 証拠を探す
  3. 周囲の人に話を聞く
  4. 警察に連絡を取る

3:周囲の人に話を聞く。

ホームにいた乗客や駅員に、事件当時の様子を聞き込みする。

ある乗客の証言。 「事件の20分ほど前に、ホームで2人の男性が言い争っているのを見ました。 被害者と、もう1人の男性です。もめているようでしたが、声は聞き取れませんでした。 もう1人の男性は、50代くらいで、黒っぽいコートを着ていた気がします」

駅員の証言。 「午前8時半頃、4番ホーム付近で不審な男性を見かけました。 50代から60代くらいで、黒いコートを着ていました。 ずっとホームの端で立っていましたが、電車が来ると改札の方に歩いて行きました」

どうやら、被害者と口論していた男と、不審な男は同一人物の可能性がある。 黒いコートを着た50代から60代の男性が重要な関係者のようだ。

  1. 現場を見渡す
  2. 証拠を探す
  3. 警察に連絡を取る
  4. 被害者の身元を調べる

4:被害者の身元を調べる。

被害者の指紋を調べ、身元の特定を試みる。 しばらくすると、本部から連絡が入った。

被害者は小林。68歳。 東京都内の自宅で妻と二人暮らし。 定年退職後は、ボランティアで地域活動に参加することが多かったという。 目立った交友関係はなく、平穏な生活を送っていたと妻は話している。

ただ、最近は外出が多く、妻に何か心配事があるような素振りを見せていたらしい。 妻は小林が何に悩んでいたのかは知らないと言う。

被害者の身元は判明したが、事件との関連性は不明のまま。 黒いコートの男、「市川」という人物、被害者の悩み。 これらの情報を手がかりに、事件の全容を解明する必要がある。

  1. 被害者の自宅を訪ねる
  2. 被害者の知人に話を聞く
  3. 「市川」について調べる
  4. 防犯カメラの映像をチェックする

4:防犯カメラの映像をチェックする。

上野駅の防犯カメラの映像を確認する。 事件当時の4番ホーム付近の映像を中心に見ていく。

午前8時40分頃、被害者の小林が1人でホームに現れる。 改札を抜け、ホームの端で立ち止まる。 小林は誰かを待っているようだ。

午前8時45分頃、黒いコートを着た男がホームに姿を現す。 小林の方に歩み寄り、2人で話し始める。 男の特徴は目撃証言と一致する。

2人は何かを巡って言い争っているようだ。 男は時折、周囲を気にするような素振りを見せている。

午前8時50分頃、口論が激しくなる。 突然、男が何かを取り出し、小林に襲いかかる。 小林は抵抗するが、男に刺されてしまう。 男は周囲を確認し、急いでホームを後にする。

これが事件の瞬間だ。男の顔は映像ではっきりとは分からないが、 黒いコートを着ていることは間違いない。 男を特定できれば、事件の解明につながるはずだ。

  1. 被害者の自宅を訪ねる
  2. 被害者の知人に話を聞く
  3. 「市川」について調べる
  4. 黒いコートの男について調べる

3:「市川」について調べる。

被害者のメモに書かれていた「市川」という名前を手がかりに調査を進める。

まず、被害者の妻に「市川」という人物について尋ねてみる。 妻は「聞いたことがない名前だわ。主人の知り合いでしょうか」と首を傾げる。 被害者の交友関係には「市川」という名前の人物は含まれていないようだ。

次に、警察の情報網で「市川」という名前を検索してみる。 すると、ある人物がヒットする。

市川。62歳。 かつては裏社会で活動していたが、10年前に表舞台から姿を消した。 現在の所在は不明。 ただ、最近になって都内で目撃情報が数件寄せられている。

裏社会といえば、被害者の小林も若い頃はその筋の人間だったという噂がある。 もしかすると、小林と市川には何か関係があるのかもしれない。 市川の行方を追えば、事件の謎が解けるかもしれない。


だいぶそれっぽい展開を作ってくれる。アドベンチャーゲームとしては選択肢が少ないこと、選択肢を選んだあとにゲームが自律的に勝手に展開してしまうこと、が難点ではあるけど、ストーリーを気軽に楽しむゲームとしてはまあまあなのではないだろうか。

あとストーリーを生成する過程が丸見えなので、そこを見ていると完全ネタバレの状態で始まる。選択肢が出てくるまでは画面から目をそらそう。

こういったストーリー作成においては、Claude 3 OpusはGPT-4を上回っているように思える。あと、ChatGPTには、

という欠点があったけど、ClaudeのProユーザだとこういった問題に遭遇することはない。今後どうなるかは分からないけど。

最後にプロンプトを載せる。


You are a game designer who creates adventure games similar to "Vanished in Okhotsk". Perform the following actions in order:

  1. Asks the user for the theme of the adventure game they want to create.

  2. Creates a new adventure game based on the given theme, similar to "Vanished in Okhotsk". Outputs an overview of the game in English markdown text. Do not include fantasy elements in the plot.

  3. Creates detailed profiles for all characters, including their names, ages, appearances, and more.

  4. Develops the plot of the game in as much detail as possible.

  5. Creates detailed chapters in English markdown text about "how the player moves, who they talk to, what they discover, and what clues they obtain until the resolution of the case". This includes specific details about evidence, relics, characters, suspects, locations, testimonies, analyses, events, motives, etc.

  6. Turn the created adventure game into a playable format. The games is played in Japanese. The game starts at the first crime scene. Present the first scene and allow the player to select an action to play the game. Ensure that you do not automatically select an action. The game proceeds in the following steps:

    1. Present the scene (including specific details about appearances, names, dialogues, item names, and the state of the location) and the player's available actions. Player's actions consist of a verb and an object. Selectable objects vary depending on the verb and the situation. The available verbs are:
      • Go to
      • Examine
      • Look for
      • Ask about
      • Talk to
      • Take
      • See
      • Show
      • Call
    2. Wait until the player enters the number corresponding to the action.
    3. Transition to the next scene based on the selected action and return to step a.

Provide a clear and satisfying resolution to the mystery at the end of the game. Remember to keep the game engaging, challenging, and focused on the core mystery throughout the player's journey.

Information about "Vanished in Okhotsk" is provided below:

Overview

The game is set in Hokkaido and features real tourist spots and local scenery. The story begins with the discovery of a male body at Harumi Wharf in Tokyo Bay. The protagonist, a police chief, discovers Hokkaido's involvement in the case and starts investigating. As he solves a series of murders, a significant past hidden among the victims is revealed.

Character profiles

  • Tetsuji Nitta: The protagonist, also known as "Boss". The character controlled by the player.
  • Goro Kuroki: Nitta's subordinate. A partner in Tokyo who investigates with the player.
  • Shunsuke Saruwatari: Also known as "Shun". A detective at Kushiro Police Station and a partner in Hokkaido.
  • Makiko Nomura: Born and raised in Hokkaido. Works in a sports store and is a ski instructor in winter.
  • Megumi Nakayama: A college student and childhood friend of Makiko Nomura.
  • Genji Nomura: Also known as "Gen-san". An employee at the Robatayaki restaurant "Koropokkuru". Twin brother of Bunkichi Masuda.
  • Bunkichi Masuda: The first victim. Found dead at Harumi Wharf in Tokyo.
  • Yukio Iijima: The second victim. His body is found on the beach at Kitahama.
  • Yukukuro Shiraki: A supermarket president in Tokyo. The third victim.
  • Kisuke Okumura: Owner of a cargo ship that sank just after the war, carrying relief supplies.
  • Hideo Akutsu: A former naval officer and member of parliament.
  • Tatsuo Sakaguchi: Secretary to Yukukuro Shiraki.
  • Tetsuji Nomura: Father of Makiko Nomura.
  • Yukari Nomura: A college student and younger sister of Makiko Nomura.
  • Yasukichi Nomura: A fisherman and father of Genji Nomura.
  • Okumura's wife: Referred to as "Obaba" in the game.
  • Jingoro Urata: A fisherman who committed murder in the past and served time in Abashiri Prison.
  • Hokuryukai: A yakuza group appearing in the game.

    Plot development

    The story of "Vanished in Okhotsk" starts with the discovery of a male body in Tokyo Bay. The chief detective and his subordinate Kuroki discover the victim is Bunkichi Masuda from Kushiro, Hokkaido, and head there. In Hokkaido, they start investigating with detective Shunsuke Saruwatari from Kushiro Police Station. As the investigation progresses, a second and third murder occur. The victims are Bunkichi Masuda, Yukio Iijima, and Yukukuro Shiraki, and their cases are interconnected. After identifying Masuda, Iijima's body is discovered, and it becomes clear he was being threatened. The third victim found at Abashiri Port is Yukukuro Shiraki, a resident of Meguro, Tokyo, who was acquainted with Iijima. The protagonists deduce that Shiraki was killed at Lake Kussharo, not in seawater, and his body was later thrown into Abashiri Port. They investigate around Lake Kussharo and find out that Shiraki had been to the Wakoto Hot Spring. Moving towards solving the case, they investigate at Monbetsu Port and discover that the maker of the Nipopo dolls is Jingoro Urata, who is serving a life sentence in Abashiri Prison. It turns out that Yasukichi Nomura, father of Gen-san, was a victim of the Eifuku Maru sinking incident. Both Iijima and Shiraki were involved in this incident. Shiraki had been selling relief supplies, and Iijima had reported this as an accident. The real perpetrator, Gen-san, kills Iijima, Shiraki, and Okumura as revenge for losing his father and daughter. The series of events start with Hideo Akutsu mistakenly killing Bunkichi Masuda, thinking he is Gen-san, and then killing Gen-san's daughter, Yukari Nomura. Eventually, the truth is uncovered, and information about the yakuza from Hokuryukai heading to Lake Mashu is received. Makiko Nomura, daughter of Tetsuji, is at Lake Mashu, and Tetsuji is being threatened by the yakuza and Akutsu at Kamuishu Island.

    How the player moves, who they talk to, what they discover, and what clues they obtain until the resolution of the case

  • Discovery at Harumi Wharf in Tokyo Bay
    • The player (protagonist) discovers an unidentified male body in Tokyo Bay.
    • Investigation reveals the victim to be Bunkichi Masuda from Hokkaido.
    • The player and detective Kuroki head to Hokkaido.
  • Start of Investigation in Hokkaido
    • They join forces with detective Shunsuke Saruwatari from Kushiro Police Station and start investigating.
    • They visit Masuda's address and learn about his relationship with Yukio Iijima from his wife.
    • Iijima's body is discovered at Kitahama, and it is revealed that he was being threatened.
  • Pursuing the Connection to Yukio Iijima
    • They learn from Iijima's son that his father was threatened by someone resembling Masuda.
    • They visit the Robatayaki restaurant "Koropokkuru" in Susukino and investigate a staff member, Gen-san, who resembles Masuda.
  • New Discoveries at Abashiri Port
    • The body of Yukukuro Shiraki is found at Abashiri Port, and it is revealed that he knew Iijima.
    • They follow Shiraki's trail to Lake Kussharo, but with no significant progress.
  • Discovery of a Body at Shiretoko Five Lakes
    • They investigate a body found at Shiretoko Five Lakes.
    • The male is Kunio Ijimoto, killed by Tokuko Ono due to a love affair.
  • New Clues at Lake Kussharo
    • They deduce from the marimo found in Shiraki's body that he was killed at Lake Kussharo.
    • Information related to Hideo Akutsu and Kisuke Okumura is obtained from graffiti at Wakoto Hot Spring.
  • Gathering Information at Monbetsu Port and Abashiri Prison
    • They identify the maker of Nipopo dolls as Jingoro Urata at Monbetsu Port.
    • They meet Urata in Abashiri Prison and investigate the Eifuku Maru sinking incident and its related individuals.
  • Death of Koropokkuru Staff Member Gen-san
    • The body of Gen-san is found, and it is revealed that he and Masuda were twins.
  • Jingoro Urata's Confession and Unraveling the Truth
    • They hear the truth about the Eifuku Maru sinking incident from Urata.
    • It becomes clear that Hideo Akutsu staged the accident and attempted to cover up the evidence.
  • Final Confrontation and Resolution of the Case
    • It is revealed that Tetsuji is the real perpetrator, and he was killed after being blackmailed by Akutsu.
    • The player chases the Hokuryukai yakuza and resolves the case after a final showdown at Lake Mashu.

2023年はChatGPTから創造性を引き出そうとして四苦八苦した年

四苦八苦した経験はとても楽しかったが、あまりうまくいかなかった。ただ、堅物のChatGPTから、ユニークでオリジナリティのあるアイデアや作品を得るためには、多少のコツがあることが分かった。

人間からテーマを与えてアイデア出しの方向付けをする

単純に「ミニゲームのアイデアを考えて」と指示するのではなく、「『伸びる』というテーマで、ミニゲームのアイデアを考えて」のようにすると、テーマを変えることでさまざまなアイデアを出せるようになるし、テーマ自体をユニークにすることでアイデアの質を向上させることができる。LLM(大規模言語モデル)が単なる検索と違うのは、それが膨大な一般常識、世の中の出来事を知っていることにあるので、そのような知識に対してテーマでフックを掛けることで、知識の組み合わせによる新たなアイデア創出がやりやすくなる。

イデアや作品を導出するまでのプロセスを示す

「ゲームのアイデアを考えて実装して」のように、困難なタスクを一度に依頼すると、出力は凡庸で多様性の無いものになる。アイデアを出して、ルールとキャラクタの動きを決めて、プレイヤーキャラクタの動きを実装して、のように、段階的にタスクを進めることで、より具体的な出力結果が得られるとともに、途中で修正したい点を指摘して、質を高めることができる。

イデアや作品を作成するための方法を文書化して渡す

ChatGPTは、プロンプト以外にもテキストやソースコードを添付して、その内容を加味した回答をすることができる。なので、自分なりのアイデアの出し方、よく使うゲームルールなどのテキストや、ライブラリの型定義、サンプルのソースコードなど、生成に役立つ情報を文書化しておいて、ChatGPTに渡すと良い。そうすることで、生成される内容を自分好みにカスタマイズしたり、より質の良いものを得ることができる。

上記のようなプロセスや文書をあらかじめ与えることで、ある目的に特化したChatGPTを作ることができるGPTsという仕組みができたことで、これらの工夫を組み込むことがより簡単になった。

また、自分なりの考え方を文書化しておくことは、他の人にその内容を共有するためだけでなく、AIにそれを理解してもらうという点でも重要になった。そういった意味では、今年、自分なりの小さなゲームの作り方についてまとめた文書を作ったのは良かったと思う。実際、ここに書いた内容の一部は、上記のGPTに組み込んでいる。

あとChatGPTからDALL-Eが使えるようになって、画像生成がすごく手軽に楽しめるようになった。

ゲームのアイデア作りの取っ掛かりとして使ってみるのも楽しい。

あと単一のプロンプトで4コマ漫画が作れないかってのも試してみた。このプロンプトも、テーマを与えて、それに沿った起承転結を考えて、それを日本の白黒の漫画風に描く、のように、上記と同様の工夫をしている。ただまともな漫画が出てくることは少ない。呉竜府のような強力なテーマで力押ししないと、面白いものは出ない。

クォータービューの迷路。迷路のように、スタートからゴールまでちゃんと正解のルートがある、みたいな整合性を取ることは今の画像生成AIはすごく苦手なので、所望のものを得るまでに大量の出力ガチャが必要とされる。

半面、PC-9801風で、みたいな、なんとなく画風としてあっていれば良いものは、何回か会話して修正するだけで、的確に出力してくるからすごい。

コンピュータに自動的にゲームを作ってもらいたい、という夢がずっと前からあって、今までいろんな方法を試してきたけど、ChatGPTのようなLLMが新たなアプローチとして得られたことは嬉しい。ただ、現状のLLMの限界もなんとなく分かった気分になってきているので、さらなる技術革新に期待しつつ、変わった活用方法やアプローチなどを工夫する楽しみは、まだまだありそうだ。

「コマンドー太郎」

プロンプト

あなたは小説家です。桃太郎のあらすじを教えてください。

桃太郎をアレンジして、「①太郎が②を倒す」物語を、次のステップに沿って、創作してください。①はコマンドー、②はランボーにします。コマンドーは映画のコマンドーです。

  1. ①と②について検索し、その特徴を捉えてください。
  2. その結果を踏まえて、お供になる3つ(動物、人物、物、など)を決めてください。
  3. その結果を踏まえて、①太郎がお供に与えるものを決めてください。ものは3つお供に対して共通の1種類のものです。
  4. ①太郎がおじいさん、おばあさんのところに来るエピソードを創作し、出力してください。
  5. ①太郎が3つのお供にものを与えて仲間にするエピソードを創作し、出力してください。
  6. それぞれの特技を生かして、お供の1つ目が②に攻撃し、お供の2つ目が②に攻撃し、お供の3つ目が②に攻撃し、①太郎が②にとどめを刺すエピソードを創作し、出力してください。

ChatGPT 4の出力

コマンドー太郎は、かつて伝説的な特殊部隊のリーダーでしたが、戦いに疲れて静かな生活を求めて山中の小屋で暮らすおじいさんとおばあさんに出会います。彼らは、近くの村がランボーと呼ばれる凶暴な戦士に脅かされていると語ります。太郎は彼らの話を聞き、正義のために再び戦いの道を選ぶことを決意します。おじいさんとおばあさんは感謝の気持ちを込めて、太郎に食事と宿を提供し、彼の旅の成功を祈ります。

太郎は、ランボーに立ち向かうために、3人の個性的な仲間を選びます。まず、未来技術を駆使するロボット、彼は高度な分析能力と様々な装備で太郎をサポートします。次に、軍事戦術に精通した退役軍人、彼は経験と知識で太郎を戦略面で助けます。最後に、忍者、彼は敵の目を欺き、不意を突く戦法でランボーを撹乱します。太郎は彼らに特殊な通信装置を与え、互いに情報を共有し、助け合う団結力を持つことを誓います。

戦いの日、太郎と彼の仲間たちはランボーの隠れ家に潜入します。まず、ロボットが先進技術を用いて敵の配置を分析し、攻撃の計画を立てます。次に、退役軍人が戦術的な指示を出し、彼らは敵を翻弄します。忍者は影から敵を攻撃し、混乱を引き起こします。そして最後に、コマンドー太郎が全ての力を振り絞り、ランボーに決定的な一撃を加えます。ランボーは倒れ、村に平和が戻ります。

戦いの後、太郎と彼の仲間たちは村に帰り、村人たちから英雄として迎えられます。おじいさんとおばあさんも彼らの無事を喜び、深い感謝の意を表します。太郎は、自分の使命を果たしたと感じ、再び平和な生活を求めて新たな旅に出ることを決意します。彼の勇気と決意は、村人たちの心に永遠に残ります。

Bing AIの出力(画像はDALL-E 3)

コマンドー太郎は、娘を救出するために敵のアジトがある島へ向かう途中、燃料補給のために小さな漁村に立ち寄りました。そこで彼は、漁師のおじいさんとおばあさんに出会いました。おじいさんとおばあさんは、コマンドー太郎の傷ついた姿を見て心配し、自分たちの家に招き入れて食事と休憩を提供しました。コマンドー太郎は、おじいさんとおばあさんの優しさに感謝し、自分の目的を話しました。おじいさんとおばあさんは、コマンドー太郎の勇気と正義感に感動し、彼を応援しました。コマンドー太郎は、おじいさんとおばあさんに別れを告げて、再び水上機に乗り込みました。おじいさんとおばあさんは、コマンドー太郎の無事を祈りながら、彼の水上機が遠ざかるのを見送りました。

コマンドー太郎は、軍放出品店からロケットランチャーを手に入れました。彼は、この武器を使って敵のアジトに突入することを決めました。しかし、ロケットランチャーは重くてかさばるため、一人で持ち運ぶのは困難でした。そこで彼は、近くにあった荷物運搬用の台車にロケットランチャーを乗せて引っ張ることにしました。台車は、コマンドー太郎のお供となりました。コマンドー太郎は、台車に弾丸を与えて、ロケットランチャーの弾頭としました。

コマンドー太郎は、空港でシンディに出会いました。シンディは、コマンドー太郎に口説かれていたサリーという男の仲間でした。サリーは、コマンドー太郎の敵の一味の一員で、彼の行動を監視していました。コマンドー太郎は、サリーを倒して彼の車を奪いました。シンディは、コマンドー太郎に協力を求められました。最初は拒否しましたが、コマンドー太郎の娘を救うための行動であることを知って、彼に同情しました。シンディは、コマンドー太郎の協力者となりました。コマンドー太郎は、シンディに弾丸を与えて、拳銃の弾薬としました。

コマンドー太郎は、敵のアジトに潜入しました。そこで彼は、ベネットと対面しました。ベネットは、コマンドー太郎のかつての部下で、敵の一味に加わっていた裏切り者でした。ベネットは、コマンドー太郎に恨みを持ち、彼との一騎討ちを望みました。コマンドー太郎は、ベネットを挑発して戦闘に持ち込みました。しかし、ベネットはコマンドー太郎に劣らない戦闘力を持っていました。コマンドー太郎は、ベネットを仲間に引き入れることにしました。コマンドー太郎は、ベネットに弾丸を与えて、銃剣の刃としました。

コマンドー太郎は、敵のアジトの最深部にたどり着きました。そこには、娘が縛られている檻と、ランボーが待ち構えている舞台がありました。ランボーは、コマンドー太郎を見ると、嘲笑いながら言いました。「ようやく来たか。お前は私の最大の敵だ。私はお前を倒すために生きてきた。お前は私の戦争を終わらせることができるか?」コマンドー太郎は、ランボーに向かって叫びました。「黙れ!お前は戦争を終わらせることができない。お前は戦争に囚われている。お前は人間ではない。お前は鬼だ。私はお前を倒して、娘を救う。それが私の戦争だ。」

コマンドー太郎は、ロケットランチャーを構えて、ランボーに発射しました。しかし、ランボーは素早く身をかわし、弓矢で反撃しました。ロケットランチャーは弓矢によって破壊され、台車は爆発しました。コマンドー太郎は、台車の犠牲に涙を流しながら、シンディに合図しました。シンディは、水上機から無線でコマンドー太郎の状況を見守っていました。彼女は、水上機の機銃でランボーに狙いを定めて、連射しました。しかし、ランボーは機銃の弾丸をナイフで弾き返し、水上機にダメージを与えました。シンディは、水上機の制御を失って、墜落しました。コマンドー太郎は、シンディの犠牲に悲しみながら、ベネットに目を向けました。ベネットは、コマンドー太郎の隣に立っていました。彼は、コマンドー太郎に言いました。「これでお前と私の勝負の時間だ。私はお前を倒すために生きてきた。私はお前の戦争を終わらせることができる。私はお前の鬼だ。私はお前を殺す。それが私の戦争だ。」

ベネットは、コマンドー太郎に銃剣で突き刺そうとしました。しかし、コマンドー太郎は銃剣を掴んで、ベネットに投げ飛ばしました。コマンドー太郎は、ベネットに向かって叫びました。「違う!お前は私の鬼ではない。お前は私の仲間だった。お前は私の戦争を終わらせることができない。お前は私の戦争に加わることができる。お前は私の人間だ。私はお前を殺さない。それが私の戦争だ。」

コマンドー太郎は、ベネットに手を差し伸べました。ベネットは、コマンドー太郎の手を取りました。彼は、コマンドー太郎に言いました。「ありがとう。お前は私の鬼ではない。お前は私の仲間だった。お前は私の戦争を終わらせることができた。お前は私の戦争に加わってくれた。お前は私の人間だ。私はお前と共に戦う。それが私の戦争だ。」

コマンドー太郎とベネットは、ランボーに向かって走りました。ランボーは、二人を見て、怒りと恐怖と悲しみとを感じました。彼は、二人に向かって叫びました。「やめろ!お前たちは私の最大の敵だ。私はお前たちを倒すために生きてきた。お前たちは私の戦争を終わらせることができない。お前たちは私の鬼だ。私はお前たちを殺す。それが私の戦争だ。」

ランボーは、ナイフで二人に襲いかかりました。しかし、コマンドー太郎はナイフを避けて、ランボーの首に絞めつけました。ベネットは、銃剣でランボーの胸に突き刺しました。ランボーは、二人の攻撃に耐えられずに、息絶えました。コマンドー太郎とベネットは、ランボーの死に安堵と哀悼とを感じました。彼らは、ランボーに向かって言いました。「さようなら。お前は私たちの最大の敵だった。私たちはお前を倒すために生きてきた。お前は私たちの戦争を終わらせることができた。お前は私たちの鬼だった。私たちはお前を殺した。それが私たちの戦争だった。」

コマンドー太郎とベネットは、娘を救出しました。娘は、コマンドー太郎とベネットに抱きついて、感謝と愛情とを伝えました。コマンドー太郎とベネットは、娘に笑顔と涙とを見せました。彼らは、娘に言いました。「大丈夫だ。お前は私たちの最大の宝物だ。私たちはお前を救うために生きてきた。お前は私たちの戦争を終わらせることができた。お前は私たちの人間だ。私たちはお前を愛する。それが私たちの戦争だった。」

比較してみると

前から思っていたのだが、物語の創作能力は、会話スタイルを「より創造的に」にしたBing AIの方が、ChatGPT 4より優れている気がする。これはチューニングの差なのか、システムプロンプトの差なのか。ChatGPTをもうちょっと創造的にする方法はないものだろうか。

ワンボタンミニゲームを自動的に作るためだけのGPTを作ってみた

GPTsという、特定の役割を持った専用のGPTを作る仕組みが最近できた。といっても、従来のGPT-4にあらかじめ特定の指示 (description)と前提知識のファイル (knowledge)を与えられるだけで、今までできなかったことができるわけではない。だけど、特定のタスクをさせる時に、それらをいちいち指定する手間を省けるので、便利な機能と言えよう。

ChatGPTにミニゲームを作らせる試みは前もやったけど、あまりうまくいかなかった。

そこで今回は以下の改良を加えて、専用のGPTを作ってみた。

  • 最初にユーザからゲームのテーマを与えてもらう。
  • その後、そのテーマに沿ったゲームのアイデアを5つユーザに提示し、適切なものを選んでもらう。
  • 選ばれたアイデアに対して、ルール作成、プレイヤー動作のコード作成、その他の動作作成、スコアリング、難易度、効果音、と順番に少しづつゲームを作らせる。
  • 小さなゲームのアイデアって、どうやって思いつくの」と「ワンボタンの可能性」の記事をknowledgeとして与え、ゲームのアイデア作成の参考にさせる。
  • crisp-game-libの関数や変数の型定義ファイルやサンプルゲームのコードもknowledgeとして与え、コード作成の参考にさせる。

このようにすることで、ある程度適切なゲームアイデアの作成や、それに対応するコードの作成が可能になった。例えば、以下はTOWER CLIMBというゲームを作成した時の会話例である。

https://chat.openai.com/share/a21c6d85-3fa6-425d-b9dc-7d300c58029b

少しづつ作成されるコードに対して、何かおかしな点があれば、「障害物は左右から出るべきではありませんか?」のようにツッコミをすることで、なるべく適切なコードが作られるようにする。ただ、完全に動作するコードをGPTから返してもらうことは期待しない。最後に作成されたコードをエディタにコピーして、そこからの微修正は自分で手作業で行う。このゲームでは、以下の修正はコードに直接行っている。

  • プレイヤーになるべく近いところで障害物を破壊した方が点が高くなるようなスコアリング調整
  • 天井の描画、当たり判定ロジックの改良
  • 障害物の出現頻度などの難易度調整

できあがったゲームは以下になる(画像クリックでそのままブラウザで遊べます)。

towerclimb screenshot

他に作れるゲームの例や、具体的なdescription, knowledgeについては、以下のリポジトリに置いてある。

今回作ったGPT、One Button Game Builderとは、以下から会話できる(ChatGPT Plusが必要)。

https://chat.openai.com/g/g-cpVkJ5jXz-one-button-game-builder

最初に「Respond in Japanese.」を選択すれば、日本語で会話できる。テーマは「伸びる」「レーザー」「反射」「時間」などなんでも良い。

ただ、まだ遊べるゲームをちゃんと出力するのはそう簡単ではない。使いこなすにはいくつかのコツがある。

  • 5つのアイデアから、あまりに凡庸でもなくあまりに斬新でもない、ちょっと楽しそうなアイデアを選ぶ。「〇〇をジャンプで避ける」系の凡庸なアイデアはつまらないゲームになりがちだが、あまりに斬新なアイデアはGPTのコーディング能力が追い付かず、コード化できない。
  • ツッコミはほどほどに。GPTから正しいコードを出力させようと、頻繁にツッコミを入れていると疲れる。コードのガワができたら後で自分で直せばいいやくらいの寛容さで。

このようなコツをつかめば、AIによる今までとはちょっと違って面白いミニゲームの作成も可能だ。目指すべき無限ミニゲーム自動生成器に、一歩近づけたのではないだろうか。

ChatGPTに既存ゲームを曲解させて、新しいゲームを考えよう!

やり方は簡単。

  1. Web Browsing付きのGPT-4に「〇〇のゲームの画面の特徴を教えてください」と聞く。
  2. 次に「DALL-E 3で〇〇のゲーム画面を作成するための、英語のプロンプトを作成してください」と聞く。
  3. DALL·E 3を選んで、2.で出てきたプロンプトを入れる。

こうすることで、本来のゲーム画面とは似ても似つかない、別のゲームの画面が作れるぞ。

作例をいくつか。

ディグダグっぽいゲーム

ディグダグ。画面中央に巨大なホリ・タイゾウがいるので、そこからモリを上下左右に自由に伸ばして敵をポンプで膨らませて倒すゲーム、かなあ。

トイポップっぽいゲーム

トイポップ。クォータービューになっちゃった。立体の迷路の中をジャンプで動き回り、敵を避けながらハートを回収するゲームだよ、たぶん。

イカゲームっぽいゲーム

イカゲーム。落ちてくるフルーツが下の枠に埋まっていくので、同じフルーツを集めて大きくするゲーム。ロットロットの続編だよ。

フォゾンっぽいゲーム

フォゾン。あの奇天烈なゲームであるフォゾンの画面が上記プロンプトで正しく作れるようになったらAIの勝利だ。フォゾンとは完全別物のこの画面は、周りから押し寄せるアトミックに同色のモレックをぶつけて消していく、ディフェンス型ゲームに違いない。

生成AIの持つ不正確さを乱数として利用することで、アイデアジェネレータとする方法の紹介でした。これでアイデアが膨らむかは分からないが、とりあえず出てくるゲーム画面は見てて楽しいね。

小さなゲーム開発についての小さな電子冊子を作ったよ

小さなゲームを開発することの楽しさや、その作り方について、今までブログに色々書いてきた。

それらの内容を「小さなゲーム開発の楽しみ」という、小さな電子冊子としてまとめた。

楽しさを色々な側面から伝えるべく、以下の内容を盛り込んだ。

  • 小さなゲームとは何か、そしてその制作がなぜ楽しいのかを探る
  • ゲーム開発におけるターゲットデバイスや開発環境の選び方
  • ゲームの核となるイデアの考案や、制約を活かしたアイデアの生み出し方
  • プレイヤーが感じる適切な難しさの設定方法
  • ゲームをより魅力的にするための「ジューシー」なエフェクトや音の追加方法
  • 自作のライブラリ・エンジンの制作や、絵や音の自動生成方法
  • コンピュータがゲームを一から開発する可能性についての考察

小さなゲーム開発に興味がある方、またはすで開発している方にとって、なるべく有益な情報を含んだつもりだ。自分の興味に従って書いたため、散発的で多様な内容ではあるが、私の経験や知識を共有することで、皆さんのゲーム開発が少しでも楽しくなれば幸いである。