👾

Amazon Qに入門してみた ~簡単にゲームが作れるって本当ですか?~

に公開

この記事はなに?

よわよわエンジニアが、「Amazon Q CLI でゲームを作ろう Tシャツキャンペーン」をきっかけにほとんど初めてAmazon Q Developerに触れてみた話です。

キャンペーンページは以下。
https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

記事筆者のスペック

  • おそらくインフラエンジニア5年目(未だに全然自信がない)
  • AWSも4.5年目くらい(インフラ設計と構築が主)
  • でもAWSなんもわからん(資格としてはCLF,SAA,DVA,SOA保有でAIF勉強中)
  • AIはChatGPTやGeminiを触ったりローカルでイラスト生成する程度
  • Amazon Qはコンソールに表示されているものは使ったことがある
  • プログラムは本当に何もできません(いにしえのHTLM手打ちWebサイトやPython写経経験程度)

触るまでの流れ

前述の通りコンソールに表示されているAmazon Qの使用経験はあるので、一時期はAWS re:PostっぽいことをAIがやってくれるサービスがAmazon Qなのかな?という薄い認識でいました。
もちろんそれだけのはずもなく、「コンソールで質疑応答してくれるのはAmazon Q Business(の一部)」「今回ゲーム制作キャンペーンが始まったAmazon Q CLIはAmazon Q Developer(の一部)」といった感じのようです。
("一部"と付けている通り、それぞれもっといろいろなことができます)
Amazon Q CLIのインストール手順については前述のイベントページにもリンクが貼られていますが、今回はVSCode上の拡張機能で使用したかったのでそちらの手順を参考にしました。
https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/q-in-IDE-setup.html
無料枠で使用する場合、Builder ID(≠AWSアカウント)が必要になるのが少し分かりづらい点でしょうか。
Builder IDで利用できるAWS Training and Certification(AWSが提供する学習サイト)は勉強時に便利なので、この機会に持っておくのはアリだと思います。

早速作ってみる

(1) HTML+JavaScript編

さて、準備が整ったら何を作るのか考えなければなりません。
そんな折にふと、CLFの勉強をしている時にAI関連のサービスがあまりに覚えられなくて、キャラ付けをして記憶したことを思い出しました。
なので、その頃の自分がイメージしていたものをゲームにしてもらおう、と思い立ちました。

プロンプト

AWSのAIサービスの暗記のために、AWSのマネージドAI/MLをキャラクター化したものと会話できるゲームを作成してください。

  • Transcribe:音声→テキスト変換
    真面目で仕事熱心です。堅苦しいもののきちんと応対してくれます。
  • Polly:テキスト→音声変換
    明るく朗らかで誰とでもすぐ仲良くなれる性格です。こちらにも親しみやすく話しかけてきます。
  • Translate:テキスト翻訳
    英語を交えた日本語で喋ります。
  • Textract:ドキュメントからテキストを抽出
    文章が好きな空想家です。文章から人の心を読み取れると信じています。
  • Comprehend:テキストデータの分析や感情分析
    研究者気質です。テンションの高低が激しいです。
  • Lex:対話型チャットボット
    尊大な性格です。ただし、相手の話を聞こうとする優しさも併せ持ちます。
  • Rekognition:画像や動画の分析
    創作上のロボットのようなカタカナを交えた片言で喋ります。美しい景色が好きです。
  • SageMaker:機械学習環境の簡単な構築全般
    多くのことができ、自分に自信のある少年です。

彼らが一通り自己紹介した後、ランダムにサービスの特徴が表示されます。
ユーザーはそのサービス名を選択肢から選び、正解の場合キャラクターがほめてくれます。
これを5回繰り返し、最後に点数が表示されます。

※あくまでそれぞれのサービスのキャラクターは個人のイメージです

自分で入れておいてなにこれ?と思えるプロンプトでしたが、そこからしばらく待つだけで、こんなゲームが誕生しました。
https://github.com/mukashi-dori/AIMLGame

堅苦しく自己紹介してくれるTranscribe

正解すると朗らかに褒めてくれるPolly

英語交じりで喋ってくれるTranslate
こちらからはあくまでキャラクターイメージを与えただけで、セリフは一切考えていません。Amazon Qが考えてくれています。凄まじいですね…。
ChatGPTといったLLMにキャラクター性を与えて会話を繰り広げる、といったことは一部で流行しているのですが、それを発展させて好きなキャラクターが出てくるゲームをぱっと作成することができる時代もすぐそこまで来ていると分かりました。なんとも夢のある話です。

(2) pygame編

と、ここまで遊んだところで、

また、PyGame または他のゲームライブラリをラップトップにインストールしてください。

の一文に気付きました。
pygameとはPythonのライブラリで、ゲーム制作に特化している便利機能とのこと。そういったものもあるのか……。
確かに先ほど作成されたゲームは何を作れと細かい指示をしなかった結果、(Amazon Q側の判断で)HTML+JavaScriptで作成されました。
今回は明示的にpygameを使ってゲームを作るよう指示してみます。
まず、ChatGPTに以下のプロンプトを投げました。

プロンプト

Amazon Q CLIにプロンプトを打ち込んでゲームを作ってもらいたい。
なので、以下のアイデアをもとにまとまったプロンプトを整理してください。

  • pygameを使用
  • 洞窟の奥のお宝を入手するロールプレイングゲーム
  • イベントは通路の左右を選択する、敵と戦う(戦闘)、何も起きない、流れてくる水を飲む、といった洞窟で起きそうなイベント(イベント案もいくつか出してほしい)
  • 戦闘は10面サイコロを使用し、成功・失敗判定は目標値以下なら勝利、より大きいなら敗北でゲームオーバー
     (目標値が6なら1~6は成功、7~10は失敗)
  • 目標値は敵の強さで決まり、序盤は弱い(目標値が大きい)敵ばかりだが後半は強い(目標値が小さい)敵が多く出てくる
  • イベントは10回起こり、完全にランダム。後半にかけて戦闘を引きやすく、10回目のイベントは必ず戦闘

返ってきたプロンプトを更にAmazon Qに投げます。(修正なし)

プロンプト

ゴール
Python 3.11 + pygame で動作するシンプルな 2D ロールプレイングゲームを生成してください。
プレイヤーは洞窟の奥に隠された宝を探します。ゲームは 10 回のイベントで構成され、最終(10 回目)は必ず戦闘です。
クリア条件:10 回目の戦闘に勝利して宝を入手する。
ゲームオーバー条件:いずれかの戦闘に敗北する。

技術要件

  • ライブラリ:pygame (>=2.5) のみ。追加依存は不可。
  • ファイルは main.py 1 本で完結。
  • 640×480 ウィンドウ、固定 FPS = 60。
  • 画像・音声は不要。矩形やテキスト描画で OK。
  • Python 標準の random を使用。シード固定はしない。
  • クラス設計:Game, Player, Enemy, EventManager など適切に分割。
  • コメントは日本語、PEP8 準拠。

ゲームフロー

  1. タイトル画面で [スペース] を押すと開始。
  2. 各イベントを上から順に処理。イベント内容は乱数で決定。
  3. イベント発生後に簡単な結果テキストを 2 秒間表示。
  4. 戦闘イベントの場合はサイコロ判定後、勝敗を表示 → 勝利なら次へ、敗北ならゲームオーバー画面。
  5. 10 回目の戦闘に勝利するとエンディング画面で宝を獲得した旨を表示。

イベントシステム

  • 全10回。
  • 前半(1–5)は「戦闘」が出にくく、後半(6–9)は出やすい重み付けを実装。
  • 10 回目は必ず戦闘 (ボス扱い)。
  • 次のイベント候補を用意し、リストから weighted choice で選択してください。
ID 種別 説明 発生確率重み (前半 / 後半)
1 分岐 「通路が左右に分かれている。好きな方へ進む。」※特に効果なし 30 / 15
2 戦闘 「洞窟生物と遭遇した!」 10 / 40
3 休憩 「静かな空間で少し休んだ。何も起こらない。」 25 / 10
4 「壁の割れ目から水が流れている。飲む/飲まない?」
飲むと 50 % で HP+1、50 % で HP-1
20 / 10
5 宝箱 「古びた箱を発見。中身はランダムで空 or 回復 or 敵の罠(戦闘)」 15 / 25

※発生確率は重みで制御して良い。罠戦闘は通常戦闘として扱う。

戦闘ルール

  • 判定は10面サイコロ (1–10)。
  • 敵ごとに「目標値 (target)」を設定。出目 ≤ target → 勝利、出目 > target → 敗北。
  • 敵の強さ表(例)
    名前 target 登場フェーズ
    コウモリ 7 1–3
    ゴブリン 6 2–5
    オーク 5 4–7
    トロール 4 6–9
    ボス「洞窟王」 3 10 (固定)
  • プレイヤー HP = 3。戦闘勝利時に 20 % で HP+1 (最大3)。
  • HP が 0 になるか、戦闘判定で敗北した時点でゲームオーバー。

UI 操作

  • 矢印キー <- ->:分岐イベントで左右選択。
  • Z キー:イベントメッセージ送り。
  • 戦闘時は自動でサイコロ判定を実行し、出目と結果を表示。

実装ガイド

  • EventManager にイベント候補と weight を持たせ、フェーズごとにリストを差し替える。
  • 戦闘は Enemy クラスの target を使い、random.randint(1,10) で判定。
  • モーダル的な「テキストのみ表示」状態を作り、一定時間またはキー入力で進行させる。
  • フェーズ番号 (1–10) を画面右上に表示しておくと進行が分かりやすい。
  • Game クラスに state マシン (TITLE, EVENT, BATTLE, ENDING, GAME_OVER) を実装すると管理が楽。

期待する成果物

  • main.py
  • 実行するとタイトル→イベント進行→クリア or ゲームオーバーまで遊べる。
  • コードに TODO や未完成部分がないこと。
  • コメントと関数名からおおまかなロジックが読み取れるクリーンな実装。


日本語は文字化け…
文字化けや特定場面でキーを押しても進まない等、諸々修正した結果がこちら。
https://github.com/mukashi-dori/miniRPG/

クリアはできていません
pygame.font モジュールを使うことでフォントを画像として表示するといったこともできるようですが、ソースコードをGitHubで公開するのに伴い、フォントの著作権等を考えて英語表記としておきました。
同様の理由で画像も表示させていません。

感想

想像よりずっときちんとしたものを作ってくれる

HTML+JavaScriptはともかくPythonはコードくらい読めた方が…とおっかなびっくり始めたのですが、CLIでの指示出しだけでそれらしきものを作ってくれて驚きました。
懐かしのゲームブックレベルであれば、頭の中にしまってあるシナリオさえ出していければどんどん作れそうですね!

人間も考え学び続けなければならない

pygameでゲームを作った際、予期せぬバグが発生しQ CLIにどのように指示出しするか考えたり、日本語表示に伴うフォントの著作権について思案する等、使う側の意識や知識が必要とされる場面について考えさせられました。
手元で軽く遊ぶだけならあまり考えなくていいのですが、広く公開するとなると人間には考える責任が付きまとってきます。
インフラも、自分だけ遊ぶゲームサーバーを立てる場合と仕事でサーバーを立てる場合とでは話が違いますからね…。

そういえば、つい自分でGitHubにpushしてしまいましたが、pushもAIがよしなにやってくれる時代なんですよね。
次回挑戦するときにはそこまで含めてAIにお任せしてみたいです。

2025/06/13 追記

Tシャツ配送連絡が来た後なのですが、(2) pygame編にアップデートをかけました。
英語版ゲームになってしまったのは日本語だと文字化けし、改善方法が不明だったからなのですが、

miniRPG内のminiRPG.pyを日本語に直してください。
フォントはWindows・Mac・Linuxのデフォルトの日本語フォントを使用するようにしてください。

と指示することで改善しました。
(幣環境がWindowsなので、他OSでいい感じになっているかは不明です…)
他、一部動作が微妙な箇所を改善しました。

こちらの更新もCLI入力で行って、更新履歴もほとんどAmazon Qに書いてもらいました。
実際に起動する → 修正してほしい箇所をバグフィックス的に記録 → CLI入力 → 修正を待つ の繰り返しです。
簡単ですねー。

加えて、AWSクレジットが余っていたので、Amazon Q Developer Proをサブスクライブしてみました。
しばらく色々と遊んでみます。

Discussion