Amazon Q CLI を使って3時間でタワーディフェンスゲーム作成

## はじめに
### この記事の目的
- Amazon Q CLI を使ったゲーム自動生成とカスタマイズの流れを紹介
※カスタマイズの部分は個人的なポイント部分を抜粋
- 以下のキャンペーン参加


**Amazon Q CLI でゲームを作ろう Tシャツキャンペーン | Amazon Web Services ブログ**

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

所要時間：初回の指示から完成まで 3 時間程度
ゲーム素材の画像生成：Chat GPT に依頼


## 作成したゲーム
味方ユニットを配置して襲ってくる敵を撃破して制限時間まで拠点を守るタワーディフェンスゲーム

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">【Amazon Q CLI でゲームを作ろう Tシャツキャンペーン】<br><br>Amazon Q CLI を使って3時間でタワーディフェンスゲームを作成しました！<a href="https://twitter.com/hashtag/AmazonQCLI?src=hash&amp;ref_src=twsrc%5Etfw">#AmazonQCLI</a> <a href="https://t.co/vUY1NCVvjb">pic.twitter.com/vUY1NCVvjb</a></p>&mdash; n0mura (@TechInfra_study) <a href="https://twitter.com/TechInfra_study/status/1931387123216810449?ref_src=twsrc%5Etfw">June 7, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### スタート画面
「空から」とありますが、実際は空と地上のから敵が襲ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/89d85fcb-05ec-4433-a7ac-4a4c427dd5bf.png)

### 遊び方画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/ef26ae23-543d-420c-8158-611ef978d06b.png)

### プレイ画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/61d1f946-69e1-47ad-a2d4-d5d199091ed2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/2b8f3e0a-2bf2-420d-b36f-b1ef62f90220.png)

### ポーズ画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/2827fb0a-2d67-46d5-b692-c50b17e7f85e.png)


### ゲームオーバー画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/bcc49d0e-2206-47c9-923f-5b2bf2081c91.png)

### ゲームクリア画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/11365920-585a-4cb7-ac40-5d0fb789bb6c.png)


## ゲーム作成・実行環境

### ホスト OS（Windows）
- Microsoft Windows 11 Home
- WSL2（Ubuntu 22.04 LTS） 

::: note
WSL（Windows Subsystem for Linux）
 Windows の機能であり、別の仮想マシンやデュアル ブートを必要とせずに、Windows マシンで Linux 環境を実行できます。 
 [Windows Subsystem for Linux とは | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/wsl/about)
 
:::

```
$ wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

### WSL（Ubuntu）
ディストリビューション情報
```bash
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04.2 LTS
Release:        24.04
Codename:       noble
```

カーネル情報
```bash
$ uname -mrs
Linux 6.6.87.1-microsoft-standard-WSL2 x86_64
```

### 開発ツール・ライブラリバージョン

```bash
$ python3 --version
Python 3.12.3
```
```bash
$ q --version
q 1.11.0
```
```bash
$ aws --version
aws-cli/2.27.31 Python/3.13.3 Linux/6.6.87.1-microsoft-standard-WSL2 exe/x86_64.ubuntu.24
```
```bash
$ pip3 freeze | grep pygame
pygame==2.5.2
```

## 作成手順
### ０．事前準備
利用環境にAmazon Q CLI をインストールする。
※以下の記事を参考にさせていただいたため割愛

Amazon Q Developer for CLIを使って、AWSのリソースをAIで作成⇒調査⇒構成図作成までやってみて、構築作業を楽にしよう | コラム | クラウドソリューション｜サービス｜法人のお客さま｜NTT東日本

https://business.ntt-east.co.jp/content/cloudsolution/ih_column-191.html

### 1.Amazon Q CLIの起動
Amazon Q コマンドでプロンプトの起動
```
$ q chat
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/cee3764c-7d25-4075-b353-e949afdbeabc.png)

### ２．ベースとなるゲーム作成依頼
今回はまず以下のプロンプトで実行しました。

```
> /tmp/sky_defense に次の 4 ファイル構成でタワーディフェンスを生成してください。

 /tmp/sky_defense
├── main.py          # エントリーポイント。ゲームループ
├── core.py          # Tower / Enemy / Projectile / GameState クラス群
├── ui.py            # ボタン・エネルギーバー・ポーズ画面
└── config.py        # 定数・タワー／敵パラメータ・色定義

▼ ゲーム仕様
1. 画面 1280×720。地上レーン(Y=500) と空中レーン(Y=350) の 2 本ライン。
2. 拠点は左端・敵は右端。3 秒ごとに敵スポーン。空中敵は空中レーンのみ。
3. 画面下に 6 つのタワーボタン。クリック位置へタワー設置。エネルギー消費型。
4. 同列でタワーが 2 基以上並ぶとリンクバフ：攻撃力 +20%（重複なし）。
5. エネルギーは毎秒 +15、最大 300。バー表示。
6. 拠点 HP が 0 で敗北、ゲーム時間 180 秒耐えきれば勝利。
7. P でポーズ、R でリスタート。Esc で終了。
8. **キャラクター画像は後で差し替えるので、今は色付き長方形や円で仮描画** してください。
9. config.py にタワー dict と敵 dict を記述:
   {name, cost, hp, atk, range, cooldown, speed, lane}
10. 依存は pygame のみ（`python3-pygame`）。
11. 相互 import は相対パス、パッケージ不要。
12. TODO コメント：画像差し替え、効果音、難易度段階、パーティクル。
13. 回答は日本語で。

```

コードを作成を開始してくれます。
完了すると以下の通り実行コマンドを教えてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/8a010c3b-2b57-42b1-a7fc-cba8f2c54e85.png)

```text:実行結果(最終部分のみ)
ゲームを実行するには、ターミナルで以下のコマンドを実行してください:
cd /tmp/sky_defense
python3 main.py
```

早速、ゲームを起動してみると確かにそれっぽいのが出来てる...!!
日本語表記が文字化けしているくらいで、確かに要件通り作成してくれていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/cb53016d-34a7-4b84-96f5-88075d2a7256.png)

### ３．ゲームのカスタマイズ
#### 日本語表示の対応
日本語フォントをインストール
```
$ sudo apt update
$ sudo apt install fonts-noto-cjk
```

あとはAmazon Q に文字化けを直すようにお願いしました。

```
> 日本語が文字化けして表示されているので、適切なフォントを適用して出力するようにしてください。
```

実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/ec4b57bd-95d3-40b6-b91a-0cfe0f480f49.png)



#### 味方ユニットの種類ごとに仕様を追加
```text:指示
以下の通り、味方ユニットごとに攻撃パターンを変更してください
ミサイル：追跡型の攻撃
レーザー：複数の敵を貫通するレーザー攻撃
ガトリング：一定時間おきに連射する攻撃
シールド：敵を足止めします攻撃は持っていません
プラズマ：複数の敵に伝染する攻撃
```

<details><summary>実行結果（抜粋）</summary>

```text:実行結果（抜粋）

 ● Completed in 80.344s
各タワーユニットに特徴的な攻撃パターンを実装しました！以下が実装した内容です：

### 1. 各タワーの特徴

1. キャノン
   • 標準的な砲台
   • 地上ユニットのみ攻撃
   • 通常の弾を発射

2. ミサイル
   • 追跡型の攻撃
   • 空中ユニットのみ攻撃
   • 敵を追尾する三角形の弾を発射
   • 通常より素早く敵を追跡

3. レーザー
   • 複数の敵を貫通するレーザー攻撃
   • 全ユニット攻撃可能
   • 直線状に高速で移動し、通過した敵全てにダメージ
   • 線で描画される視覚効果

4. ガトリング
   • 一定時間中に連射する攻撃
   • 地上ユニットのみ攻撃
   • 小さく高速な弾を発射
   • 攻撃間隔が短い（0.3秒）

5. シールド
   • 敵を足止めする
   • 攻撃は持っていない
   • 範囲内の敵の移動速度を50%低下させる

6. プラズマ
   • 複数の敵に伝染する攻撃
   • 全ユニット攻撃可能
   • 最大2体まで連鎖攻撃（ダメージは70%に減少）
   • 大きく発光する弾で表現

### 2. 実装した主な変更点

1. Projectileクラスを拡張
   • 弾の種類に応じた挙動を実装
   • 各弾種別の更新ロジックを追加
   • 視覚的な表現を弾種別に変更

2. Towerクラスの更新
   • タワータイプに応じた攻撃方法を実装
   • シールドタワーは攻撃せず、敵を減速させる機能を追加

3. Enemyクラスの更新
   • 減速状態を追加
   • 減速時の移動速度を調整

4. GameStateクラスの更新
   • 弾の更新メソッドに敵リストを渡すように変更（レーザーとプラズマ用）

5. config.pyの更新
   • 各タワーに説明文を追加

6. ui.pyの更新
   • タワーボタンに説明文を表示するよう変更

これらの変更により、各タワーが独自の攻撃パターンと特性を持つようになり、ゲー
ムの戦略性が向上しました。ゲームは正常に動作し、日本語表示も問題なく行われて
います。



 ● Completed in 43.682s
味方ユニット（タワー）の名前を配置した場所に表示するように実装しました。以下の変更を行いました：

### 1. タワー名の表示機能

1. Tower クラスの拡張:
   • タワーの初期化時に名前表示用のフォントとテキストサーフェスを作成
   • name_font と name_text 属性を追加
   • 名前の表示位置を name_rect として保存

2. Tower.draw メソッドの拡張:
   • タワー名を表示する機能を追加
   • 名前の背景に半透明の黒い背景を追加して視認性を向上
   • タワーの上部に名前を表示

### 2. タワー設置時のプレビュー機能の強化

1. 設置プレビューの改善:
   • タワー名のプレビュー表示を追加
   • 半透明の背景付きで名前を表示
   • タワーの上部に名前を表示

2. 設置可能性の表示:
   • 「設置可能」または「設置不可」のステータスを表示
   • 設置可能な場合は緑色、不可能な場合は赤色で表示
   • タワー同士が近すぎる場合は設置不可と表示

3. タワー設置ロジックの改善:
   • 他のタワーとの重なりをチェックする機能を追加
   • タワー同士が40ピクセル以内に近づくと設置できないように制限

これらの変更により、以下の機能が追加されました：

1. 配置済みのタワーには、その上部に名前が表示されるようになりました
2. タワーを設置する際に、カーソル位置にタワー名がプレビュー表示されます
3. 設置可能かどうかが視覚的に確認できるようになりました
4. タワー同士が近すぎる場合は設置できないようになり、「設置不可」と表示され
ます
```
</details>

### 画像ファイルの適用
味方や敵を図形から指定する画像に変更してもらいます。

```text:指示
ユニットを指定した画像にしてほしいです。
コードを修正し、指定する画像を配置する場所を教えてください。
```

<details><summary>実行結果（抜粋）</summary>

```text:実行結果（抜粋）

### 画像ファイルのパス
すべての画像ファイルは /tmp/sky_defense/images/ ディレクトリに配置する必要が
あります。

### 必要な画像ファイル一覧

1. タワー（味方ユニット）の画像:
   • tower_cannon.png - キャノンタワー (推奨サイズ: 40x60)
   • tower_missile.png - ミサイルタワー (推奨サイズ: 40x60)
   • tower_laser.png - レーザータワー (推奨サイズ: 40x60)
   • tower_gatling.png - ガトリングタワー (推奨サイズ: 40x60)
   • tower_shield.png - シールドタワー (推奨サイズ: 40x60)
   • tower_plasma.png - プラズマタワー (推奨サイズ: 40x60)

2. 敵ユニットの画像:
   • enemy_soldier.png - 兵士 (推奨サイズ: 40x40)
   • enemy_tank.png - 戦車 (推奨サイズ: 40x40)
   • enemy_drone.png - ドローン (推奨サイズ: 40x40)
   • enemy_bomber.png - 爆撃機 (推奨サイズ: 40x40)
   • enemy_elite.png - エリート (推奨サイズ: 40x40)

3. 弾の画像:
   • projectile_normal.png - 通常弾 (推奨サイズ: 10x10 または 16x16)
   • projectile_missile.png - ミサイル弾 (推奨サイズ: 12x16)
   • projectile_laser.png - レーザー弾 (推奨サイズ: 20x8)
   • projectile_gatling.png - ガトリング弾 (推奨サイズ: 6x6)
   • projectile_plasma.png - プラズマ弾 (推奨サイズ: 16x16)

4. 拠点の画像:
   • base.png - プレイヤーの拠点 (推奨サイズ: 80x100)

```

</details>

上記で指定されたディレクトリに指定のファイル名で配置します。
※Chat GPT で生成した画像を利用

**味方ユニット**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/a4da38ae-d43a-4536-b3df-11a17e482e6d.png)

**敵ユニット**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/af7300e5-3e2b-41c1-8c88-fa2817865584.png)

**弾**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/a8923559-d5c7-4f2a-bfe9-c7cf870044f4.png)

**防衛拠点**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/d06d27d9-c5ff-4ce9-a4a8-38b004335ef0.png)

**実行後のゲーム画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/4c8b4f2d-0eaf-4bb1-be04-f8f554e2136f.png)

### その他修正と要素の追加依頼
- ボタンや文字の位置調整
- エフェクトと弾道などの調整
- ゲームの難易度調整
- スタート画面と遊び方の追加
- README.md作成

完成したものについては冒頭の **「作成したゲーム」の項** を参照ください。

## おわりに
今回はAmazonQのキャンペーンをきっかけにゲームを作成してみました！
Amazon Q CLI を活用してわずか数時間でタワーディフェンスゲームを自動生成し、Pygame 上で動作させるまでの一連の流れを紹介しました。

実際に手を動かした部分は CLI へのプロンプト入力のみで、生成されたコードは一切手書きせずに動作することを確認できたのは大きな発見です。

もちろん、文字配置や UI デザインの細かな調整はまだ完璧とは言えませんが、プロンプトの書き方次第でより美しく・見やすく仕上げることも可能です。
ぜひ皆さんも自分なりのプロンプトを試し、コード生成ツールの可能性を体験してみてください！