Amazon Q でゲームを作ってみる

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/
このイベントを見かけましたので、コードを書かずに Amazon Q でどこまでゲームを作成できるかを試してみました。

## Amazon Q CLI のセットアップ
自分は mac で実行しましたが基本的には下記に記載されている内容でOKでした。
https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-installing.html

ちなみに、上記ドキュメントに

>After installing Amazon Q for command line for macOS, you can enable SSH integration to be able to use autocomplete for over 500 command line tools. For more information, see Local macOS Integration .

という記載がありますが、このオートコンプリートが非常に便利です。

## pygame のセットアップ
今回はお手軽に 2D のゲームを作ってみたいと思いますので、pygame をセットアップします。
これも下記に記載されている内容でOKです。
https://www.pygame.org/wiki/GettingStarted

## Amazon Q の起動

適当なディレクトリを作成してから下記のように起動してみます

```shell
~/Documents/AmazonQ
❯ q chat

    ⢠⣶⣶⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣿⣿⣿⣶⣦⡀⠀
 ⠀⠀⠀⣾⡿⢻⣿⡆⠀⠀⠀⢀⣄⡄⢀⣠⣤⣤⡀⢀⣠⣤⣤⡀⠀⠀⢀⣠⣤⣤⣤⣄⠀⠀⢀⣤⣤⣤⣤⣤⣤⡀⠀⠀⣀⣤⣤⣤⣀⠀⠀⠀⢠⣤⡀⣀⣤⣤⣄⡀⠀⠀⠀⠀⠀⠀⢠⣿⣿⠋⠀⠀⠀⠙⣿⣿⡆
 ⠀⠀⣼⣿⠇⠀⣿⣿⡄⠀⠀⢸⣿⣿⠛⠉⠻⣿⣿⠛⠉⠛⣿⣿⠀⠀⠘⠛⠉⠉⠻⣿⣧⠀⠈⠛⠛⠛⣻⣿⡿⠀⢀⣾⣿⠛⠉⠻⣿⣷⡀⠀⢸⣿⡟⠛⠉⢻⣿⣷⠀⠀⠀⠀⠀⠀⣼⣿⡏⠀⠀⠀⠀⠀⢸⣿⣿
 ⠀⢰⣿⣿⣤⣤⣼⣿⣷⠀⠀⢸⣿⣿⠀⠀⠀⣿⣿⠀⠀⠀⣿⣿⠀⠀⢀⣴⣶⣶⣶⣿⣿⠀⠀⠀⣠⣾⡿⠋⠀⠀⢸⣿⣿⠀⠀⠀⣿⣿⡇⠀⢸⣿⡇⠀⠀⢸⣿⣿⠀⠀⠀⠀⠀⠀⢹⣿⣇⠀⠀⠀⠀⠀⢸⣿⡿
 ⢀⣿⣿⠋⠉⠉⠉⢻⣿⣇⠀⢸⣿⣿⠀⠀⠀⣿⣿⠀⠀⠀⣿⣿⠀⠀⣿⣿⡀⠀⣠⣿⣿⠀⢀⣴⣿⣋⣀⣀⣀⡀⠘⣿⣿⣄⣀⣠⣿⣿⠃⠀⢸⣿⡇⠀⠀⢸⣿⣿⠀⠀⠀⠀⠀⠀⠈⢿⣿⣦⣀⣀⣀⣴⣿⡿⠃
 ⠚⠛⠋⠀⠀⠀⠀⠘⠛⠛⠀⠘⠛⠛⠀⠀⠀⠛⠛⠀⠀⠀⠛⠛⠀⠀⠙⠻⠿⠟⠋⠛⠛⠀⠘⠛⠛⠛⠛⠛⠛⠃⠀⠈⠛⠿⠿⠿⠛⠁⠀⠀⠘⠛⠃⠀⠀⠘⠛⠛⠀⠀⠀⠀⠀⠀⠀⠀⠙⠛⠿⢿⣿⣿⣋⠀⠀
 ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠿⢿⡧

╭─────────────────────────────── Did you know? ────────────────────────────────╮
│                                                                              │
│    If you want to file an issue to the Q CLI team, just tell me, or run q    │
│                                    issue                                     │
│                                                                              │
╰──────────────────────────────────────────────────────────────────────────────╯

/help all commands  •  ctrl + j new lines  •  ctrl + s fuzzy search
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🤖 You are chatting with claude-4-sonnet

>
```

モデルは claude-4-sonnet を使用しているみたいです。

## まずはシンプルに指示を出してみる

こんな感じで指示を出してみました。

> pygameを利用してゲームを作成して下さい。ローカルで実行できる形式にし、必要なファイルは全て1つのディレクトリで管理できるようにします。ディレクトリ名やファイル名は適宜作成して下さい。インベーダーゲームを作成します。キャラクターのグラフィックは8bit風にして下さい。

```shell
pygameを使ったインベーダーゲームを作成しましょう。8bit風のグラフィックで、全てのファイルを一つのフォルダにまとめて保存します。

まず、プロジェクト用のフォルダを作成します：


🛠️  Using tool: execute_bash
 ⋮ 
 ● I will run the following shell command: 
mkdir -p invader_game
 ⋮ 
 ↳ Purpose: インベーダーゲーム用のフォルダを作成

```
次に下記のパーミッションを求めてくるので、t (trust) を指定します。
```shell
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

> t
```

その後、各種ファイルを生成し書きのメッセージが出力されます。数分で作業が完了しました。

```shell
8bit風のスペースインベーダーゲームが完成しました！以下の特徴があります：

ゲームの特徴:
• 8bit風のピクセルアートグラフィック（プログラムで描画）
• 5種類の異なるデザインのインベーダー（UFO型、ロボット型、クラゲ型など）
• カラフルな8bitカラーパレット
• 爆発エフェクトアニメーション
• スコア、ライフ、ウェーブシステム

操作方法:
• 左右矢印キー：プレイヤー移動
• スペースキー：弾発射
• Rキー：ゲームオーバー時のリスタート

ファイル構成:
• main.py：メインゲームループ
• sprites.py：全スプライトクラス
• constants.py：ゲーム定数
• README.md：説明書

ゲームを実行するには、まずpygameをインストールしてから：

bash
cd invader_game
pip install pygame
python main.py


全てのファイルがinvader_gameフォルダにまとめられており、8bit風のレトロなグラフィックでクラシックなインベーダーゲームを楽しめます！
```

早速実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68453/8f108a83-4cef-4d8a-b79e-181827b0f5f1.png)

なかなかそれっぽいゲームができました。
この後、ブラッシュアップを試みてみます。

## 改良1

> こちらからの攻撃は、画面上1つのみ打てるようにして下さい。敵の攻撃は今の3倍にして下さい。ランダムなタイミングで、画面最上部に右から左にUFOを出現させて下さい。

```shell
ゲームの仕様を変更します。プレイヤーの弾を1発制限にし、敵の攻撃頻度を3倍にし、ボーナスUFOを追加します。
```

```shell
変更が完了しました！新しい仕様は以下の通りです：

主な変更点:

1. プレイヤーの弾制限: 画面上に1発まで。前の弾が消えるまで次を撃てません
2. 敵の攻撃頻度3倍: random.randint(1, 100)からrandom.randint(1, 33)に変更
3. ボーナスUFO追加: 
   • 10-20秒間隔でランダムに出現
   • 画面右から左へ移動
   • 撃つと100点獲得
   • マゼンタとシアンの8bit風デザイン

新しいゲーム体験:
• より戦略的な射撃が必要（1発制限のため）
• 敵の攻撃が激しくなり難易度アップ
• ボーナスUFOでハイスコアを狙える

ゲームを実行して新しい仕様を体験してください：

bash
cd invader_game
python main.py


より挑戦的で戦略性の高いゲームになりました！
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68453/61005d70-c29c-4e2d-bf77-603b51009bc6.png)

しっかりとUFOがダンダムに出現し、ゲームの難易度も高くなりました。

## 改良2

> 自機のグラフィックをモダンな宇宙戦闘機のように格好良くして下さい。敵を倒すとランダムにアイテムが出現し、そのアイテムを獲得する事で3方向に撃てるようにして下さい。敵の攻撃を受けたとき、この効果は無くなります。

```shell
プレイヤーの宇宙戦闘機をモダンなデザインに変更し、3方向射撃のパワーアップアイテムシステムを追加します。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68453/43fddf01-4085-4eea-a80b-bcc5cdce45d7.png)

ちょっと3方向攻撃のイメージが違いましたが、ちゃんと実装されました。3つの弾丸はそれぞれに当たり判定を持っています。
また、自機のグラフィックも改善されました。

## UFOを撃墜した時に不具合発生

ここで1つ問題が発生しました。
UFO を撃墜すると次の Exception が発生しました。

```shell
❯ python main.py
pygame 2.6.1 (SDL 2.28.4, Python 3.13.5)
Hello from the pygame community. https://www.pygame.org/contribute.html
2025-06-20 18:41:14.635 python[32341:26802385] error messaging the mach port for IMKCFRunLoopWakeUpReliable
Traceback (most recent call last):
  File "/Users/manabubu/Documents/AmazonQ/invader_game/main.py", line 236, in <module>
    game.run()
    ~~~~~~~~^^
  File "/Users/manabubu/Documents/AmazonQ/invader_game/main.py", line 227, in run
    self.update()
    ~~~~~~~~~~~^^
  File "/Users/manabubu/Documents/AmazonQ/invader_game/main.py", line 112, in update
    self.score += ufo.points
                  ^^^^^^^^^^
AttributeError: 'Bullet' object has no attribute 'points'
```

この修正をお願いしてみます。

> UFOを撃墜した時に次のExceptionが発生しました。AttributeError: 'Bullet' object has no attribute 'points'

```shell
UFO撃墜時のエラーを修正します。問題はpygame.sprite.groupcollideの戻り値の処理方法にあります。
```
```shell
修正内容の説明：

問題の原因:
pygame.sprite.groupcollide()は辞書を返します。キーは最初のグループのスプライト（弾）で、値は衝突した2番目のグループのスプライトのリスト（UFOやインベーダー）です。

修正前:
python
for ufo in ufo_hits:  # ufoは実際にはBulletオブジェクト
    self.score += ufo.points  # Bulletにはpointsがないのでエラー


修正後:
python
for bullet, ufo_list in ufo_hits.items():  # 正しく辞書を展開
    for ufo in ufo_list:  # ufoは実際のUFOオブジェクト
        self.score += ufo.points  # UFOのpointsを正しく取得


これでUFOを撃墜してもエラーが発生しなくなります。ゲームを実行して確認してください：

bash
cd invader_game
python main.py


UFOとインベーダーの両方で正しく衝突判定が動作し、スコアも正常に加算されるはずです！
```

実際にプレイして確認しましたが、正しく修正されスコアも加算されていました。

![game.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68453/e28a6a4f-e643-4cff-851d-41c879013e97.gif)
(マウスカーソル邪魔でスミマセン…)

# 感想

実はこの記事を書く前に、ロケハンとして世の中に余り無さそうな独創的なゲームの指示を出して試行錯誤してみたのですが、こちらはうまく出来ませんでした。
恐らく、具体的なゲーム内容やルール (つまり仕様) をプロンプトに落とせなかった事が原因かと思います。
この記事では、インベーダーゲームのような という誰もが想像できやすいゲームをベースにした為、比較的うまく出来た印象です。
当然ながら作成されたソースにはバグが存在する事もありますので、この辺りを正しく理解でき、指示を出せるのであれば面白い使い方が出来るのでは無いかと思いました。