📝

Amazon Q Developer CLI でゲームを作ってみた

に公開

概要

業務でも普段から Amazon Q CLI にはとてもお世話になっており、こんなイベントがあるので参加してみることにしました。
https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

以前 Godot で簡単なゲーム作成をした経験があってイベントに興味を持ったのと、Amazon Q CLI を使うと簡単なSPAのアプリが数時間で作成できるのを実感していて、これが別分野のコードでも同じように作成できるのか確認したかったので参加してみました。

作業に要した時間を簡単に記録していこうと思います。執筆しながらの計測なので、文書作成の時間も加算されています。

最初にまとめ

最終的なゲームのコード

リポジトリはこちら
https://github.com/KennyTakaki/amazon-q-cli-game

プロンプトの回数

結果的にプロンプト5回でゲームが出力されました。

  1. プロジェクトの骨格作成
  2. ゲーム仕様の指示
  3. デバッグの指示
  4. 言語に関するデバッグの指示
  5. レイアウトの微修正、READMEのメンテナンス

作業時間

要した時間は約1時間

  1. (30分) Gitのリポ作成、ブログひな型作成などの下準備
  2. (30分) プロンプトによるゲーム開発

普段使っていての感想になりますが、指示を具体的にすれば作り込みも可能だと思います。

作業

下準備(30分)

  • Git リポ作成
  • 本ブログ記事のひな型作成
  • community.aws のユーザ名取得
  • 開発環境セットアップ(開発環境構築 w/ devcontainer、PyGameインストール)
  • Amazon Q CLI インストール

ここまで実施して約30分でした。ひとまずサンプルのゲームが以下のように表示されたので環境設定には問題がなさそうです。

alt text

プロジェクトの骨格作成(プロンプト1:10分)

ゲームを作るとなるとスプライトシートや音源などのアセットと、ゲームの論理を構築するコードやゲームエンティティを表現するコードなど様々なファイルが必要になります。これらのアセットの配置をどのようなディレクトリ構成にしたらよいかAmazon Q Developer CLIに依頼しました。

srcディレクトリがUI、ゲームロジック、ゲームエンティティ、utilなどの要素で分割されており、srcはassetと分割されていたため妥当だと感じてこのまま採用することにしました。

驚いたのは、このプロンプトの出力時点で動作するゲームが出てきてしまったことで、ちょっとやりすぎ感はあるものの、手軽さをとても感じました。
https://x.com/frommiddle1/status/1931151842794418416

PyGameでゲーム作成するときに推奨されるディレクトリ構成を提示してください。
~~~~
PyGameでゲームを作成する際の推奨ディレクトリ構成を提示します。
ゲームの規模や複雑さによって調整できますが、基本的な構成は以下のようになります:
game_project/
│
├── main.py              # ゲームのエントリーポイント
├── settings.py          # ゲーム設定(解像度、FPS、色など)
│
├── assets/              # ゲームのアセット
│   ├── images/          # スプライト、背景画像など
│   ├── sounds/          # 効果音
│   ├── music/           # BGM
│   └── fonts/           # フォント
│
├── src/                 # ソースコード
│   ├── entities/        # ゲームエンティティ(プレイヤー、敵など)
│   │   ├── player.py
│   │   ├── enemy.py
│   │   └── ...
│   │
│   ├── ui/              # ユーザーインターフェース関連
│   │   ├── menu.py
│   │   ├── hud.py
│   │   └── ...
│   │
│   ├── scenes/          # ゲームシーン
│   │   ├── main_menu.py
│   │   ├── game_level.py
│   │   ├── game_over.py
│   │   └── ...
│   │
│   ├── utils/           # ユーティリティ関数
│   │   ├── helpers.py
│   │   ├── physics.py
│   │   └── ...
~~~
├── data/                # ゲームデータ
│   ├── levels/          # レベルデータ
│   ├── save/            # セーブデータ
│   └── config/          # 設定ファイル
│
└── tests/               # テストコード
    ├── test_player.py
    ├── test_physics.py
    └── ...
~~~~

ゲーム仕様の指示(プロンプト2:5分)

Q CLI にプログラムを作成してもらうために、ゲームの仕様を決める必要があります。
すでにターミナルから画像を扱えるようになっているはずなので、ゲーム画面をイメージとして表現してやり取りしてもよいですが、ここではテキストベースで仕様を考えて入力することにしました。なんだかんだ言って、現時点ではプログラムを動作させる論理はテキストで指示したほうがよいと感じているためです。

ゲームは簡単な仕様で、AWSサービスのPrefix(Amazon or AWS)を当てるゲームにしました。ゲームの画面遷移と、各画面で可能な仕様を適当に文書にしてプロンプトにインプットしてみます。

ゲームの仕様を伝えるので、ゲームを構築してください。
AWSには名前がAmazonもしくはAWSから始まるサービスが存在します。
この二択を選択するゲームを作ります。

このゲームは以下の3つの画面を持ちます。
スタート画面
メイン画面
終了画面

画面遷移は以下です。
スタート画面→メイン画面
メイン画面→終了画面
終了画面→スタート画面


ゲームが起動されると最初にスタート画面が表示されます。
スタート画面にはこのゲームの説明が記述されます。
スタート画面にはメイン画面に遷移するためのボタンを備えます。ボタンには"Let's Play"と記述されています。

メイン画面では以下をループします
1.AWSのサービスアイコンとサービス名が表示されます。ただし、サービス名の先頭のAmazon もしくは AWSの部分は表示されません。
2.AWSとAmazonのボタンを表示します。
3.ユーザはAWSもしくはAmazonのいずれかのボタンを押します。
4.正解の場合は〇を表示して、正解数をカウントアップして、正解数の表示を1プラスします。
5.不正解の場合は×を表示して、不正回数をカウントアップして正解数の表示を1プラスします。

終了条件は以下です。
ユーザは2回まで間違うことができて、3回目に間違うと終了です。
もしくは、リスト用意したサービス名すべてが消化されると終了です。

終了条件に到達すると、終了画面に遷移します。
終了画面では合計の正解数と不正回数を表示します。
"Play Again"のボタンを表示し、押されるとすべてのカウンタを初期値に戻して、スタート画面に遷移します。

デバッグの指示(プロンプト3:5分)

ところが、先ほどのプロンプトで出力したゲームは実行するとうまく起動しませんでした。
alt text

そこで、以下のように簡潔にデバッグを求めるプロンプトを実行しました。

起動すると黒い画面が表示されるだけで、意図した挙動になっていないのでデバッグしてください。

そうすると、ゲームの論理自体は表示されるようになりました。簡潔なプロンプトなのに、意図通り修正してくれて驚きました。
alt text

言語に関するデバッグの指示(プロンプト4:5分)

ただ、日本語関連の文字化けが生じており、これの修正依頼を実施しました。

どうやら日本語で記述された部分が化けているようです。修正できますか?

そうすると以下のような回答があり、ゲーム全体の言語が英語に変換されました。なかなか思い切った対応をしてきました。
正直、これは意図していなかったですが、今回はゲームの論理が完成していればよいとして黙認することにしました。

これで日本語の表示問題を回避するために、すべてのテキストを英語に変更しました。
これにより、文字化けの問題が解決されるはずです。

最後に、ゲームのタイトルも英語に変更しておきましょう:

レイアウトの微修正、READMEのメンテナンス (プロンプト5:5分)

最後に少しだけレイアウト修正と、README.mdの修正依頼を行ってこのゲームが完成しました。

終了画面で評価メッセージが出てくる位置を白い表示のバックグラウンドに収めたいです。

また、いまのゲーム仕様に合わせてReadmeを編集してください。

alt text

所感

Q Developer で作業していて思うのは(これはモデルの特色ですが)、プロンプトに対して過剰に作業してくれることが多いということです。最初のプロジェクトの骨格作成でもいきなり動作するゲームが出力されたし、言語のデバッグでは勝手に英語に修正されました。

コードの出力をコントロールするには丁寧な指示を出すか、コンテキストをうまく利用する必要があると感じる一方で、何も考えずにちょっと触っただけでモノが出来上がっていく様は爽快感があっていいです。

本職でも年次が上がってきて、コーディングとの距離ができてしまっているので、こういったツールのサポートが欠かせなくなっています。というか、AIツールなしでコーディングすることがおっくうになりつつあります。素晴らしいサービスとツールだ。

GitHubで編集を提案

Discussion