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

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

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

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

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

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

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

制約がアイデアを生み、ゲームを完成させる

イデアを思いつくためのテクニックとして、なんらかの制約をあらかじめ自らに課してしまう、という方法がある。その制約の中でゲームを面白くするにはどうすれば良いかを考えることで、今までとは違った発想が生まれることが期待できる。また、その制約を逆に活かす方法を考えることで、アイデアの独自性を高めることができる。

制約とはどのようなものが考えられるだろうか。例として考えられるのは、ゲーム制作コンテストであるゲームジャムでのフォーマット、ルール、テーマだ。多くのゲームジャムでは、投稿できるゲームになんらかの制約を設けることで、参加者がその制約内にフォーカスしてゲームを作れるようにしている。

'Different Game Jam Formats' 1 というビデオの中では、その制約のタイプとして以下を挙げている。

  • ツール:利用できるゲームエンジンなどを規定する
  • アセット:ゲーム内で利用可能な画像などをあらかじめ与える
  • ビジュアル:解像度や色数を制限する
  • ゴール:「より多くのものを集める」などゲームの目的を規定する
  • インタラクト:「2つのボタンしか利用できない」などプレイヤーがゲームとインタラクトする手段を制約する
  • ジャンル:「プラットフォーマー」「ローグライク」などのジャンルを規定する
  • イムリミット:一定時間内にゲームを完成させる

イデアを生み出すために役立つ制約としては、インタラクト、ビジュアル、ゴールあたりだろうか。

インタラクトに関する制約としては、利用可能なボタン数を限定する、マウスだけを使う、キーボード全体を使う、ツインスティックなど、入力に用いるデバイスに制約を加えるのが一般的である。使えるボタンが限られていると、そのボタンにどのようなアクションを割り当てるかを熟慮する必要がでてくる。既存の方向キー+2ボタンを使っているゲームをワンボタンゲームにしなければいけない、などの無理難題をふっかけることで、強引な解決策を生み出す過程で、新たなアイデアが生み出せる可能性がある。

ワンボタンゲームについては、個人的に大量に作った経験があるので、ワンボタンにどれだけ多様なアクションを入れ込めるかについての記事 2 を書いた。動作のバリエーションだけでなく、地形やアイテムとの組み合わせなどを工夫することで、一つのボタンが生み出すインタラクションに対して、かなりのバリエーションを持たせることができる。

ビジュアルに関する制約は、基本見た目に影響があるだけでゲームのルールなどに影響を与えたりしない。だが、16x16ピクセルなどの非常に少ない画素数であったり、縦1ラインしか許容しない実質1次元のフィールドだったり、という極端な制約が与えられた場合、それを打破するためのアイデアが求められることもある。過去には、出力として1x1ピクセル2色のディスプレイしか許さないゲームジャム 3 もあった。

1次元のフィールドのゲームは、古くは1行しか表示できないポケコンなどのハードウェア制約のために強制的に生み出されていたこともあった。1次元という制約が、どのようなプリミティブなゲームを生み出すことができるかについての記事 4 も前に書いた。

ゴールについては、ありきたりのゴールを設定するだけではアイデア発掘にはつながらない。「自身を破壊せよ」「犠牲を払え」「勝つために敵を利用しろ」のような特殊なゴールを持つゲームを考えることで、あらたなゲームが発想できる。ちなみにこれら特殊なゴールはGame Jam Theme Generator 5 から出てきたものだ。このジェネレーターはゴールに限らずいろんなゲームジャムのテーマを出してくれるので、アイデアジェネレーター同様に発想の手助けに使える。

ツール、アセット、ジャンル、タイムリミットなどは、アイデア発想のためというよりは、限られた時間でゲームを完成させるためのものだ。ツールやアセットの選定に時間をかけることなく、決まったジャンルのゲームを、タイムリミット内に作る。このように作り方を定式化することで、ゲーム本体の制作にフォーカスして素早くゲームを作ることができる。

もしあなたがゲームをたくさん作ることを目指すのであれば、自分なりの作り方の定式、レギュレーションを決めるのも良い手だ。作るもの、作り方をパターン化して、開発にかかる手間をなるべく減らすのだ 6

上記のビデオには含まれていないが、ゲームのバイナリやソースコードのサイズに制約を加えることも多い。13キロバイト以内のWebゲームを作るjs13kGamesなどが有名である。ゲームジャムではないが、古くマイコンの時代には、1画面に収まるソースコードでゲームを作る 7 という投稿プログラムもあった。

限られたサイズでゲームができているということは、その中のルールやメカニクスもかなり絞られているわけで、そのような制約の元できている面白いゲームは良質なアイデアの宝庫である。ただ、自分で作る際のサイズ制約はどちらかというと単なる足かせにしかならず、早期の完成には寄与しない。なので純粋にサイズの制約を乗り越えるのが楽しい、という人にしかおススメはしない。サイズ圧縮のためのライブラリやテクニックは大量にあるので 8 、これらを覗いてみて面白いと思えるか、あなたの適性を測ろう。

ゲーム制作に対していくつかの制約を課すことは、新たなアイデアを発想したり、素早くゲームを完成させることに役立つ。あまりにきつい制約を加えると、今度はそれを乗り越えるのが苦しくなるので、自分の感性に合う制約を見つけて、うまく活用しよう。

1.

2.

3.

4.

5.

6.

7.

8.