Amazon Q Developer CLI でロールプレイングゲームを作ってみたけど無料利用枠を使い切りました

# はじめに
面白そうなキャンペーンをやっていたので、景品のTシャツほしさにゲームを作ってみました。

https://dev.classmethod.jp/articles/q-developer-cli-game-cbs/

### 成果物
今回、Amazon Q Developer CLIを使って、AWSをテーマにした異世界転生RPGを作りました。
作ったと言いつつ、Amazon Q Developer の無料利用枠を使い切ってしまい、中途半端な状態です... 
(無料枠が回復したら、続くを作る予定です...)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560123/723ad62a-61d2-4d35-bb23-172489cc48ad.gif">

https://github.com/KMiya84377/aws-isekai-rpg-game

# Amazon Q Developer CLIについて
### そもそもAmazon Qとは
Amazon Qは、AWSが提供する生成AIを活用した対話型のアシスタントになります。
さらに、Amazon Q 自体は、ユースケースによって下記の2種類に分かれます。
- Amazon Q Business：エンタープライズ向け
- Amazon Q Developer：開発者向け

Amazon Q Developer CLIは、Amazon Q Developerの１機能となります。(ややこしい...)

```mermaid
graph TD
    A[Amazon Q] --> B[Amazon Q Business]
    A --> C[Amazon Q Developer]
    C --> D[Amazon Q Developer CLI]

    style A fill:#f9f,stroke:#333
    style B fill:#bbf,stroke:#333
    style C fill:#bbf,stroke:#333
    style D fill:#dfd,stroke:#333
```

生成AIと聞くとAmazon Bedrockなどをイメージしますが、Bedrockは生成AI用の基盤モデル（Claude、Llama2など）を API経由で利用できるサービスです。

一方、Amazon Qは、裏でBedrockを使用しており、生成AIと対話形式でやり取りできるアプリケーションとして提供するサービスです。

### Amazon Q Developerとは
Amazon Q Developer は、開発者向けに特化しており、コードの生成や解析、デバッグのサポートなど、開発に関する支援を生成AIが行ってくれます。

またAmazon Q Developerには、2種類の料金プランがあります。
1. 無料利用枠 ($0)
1. Pro枠 (1ユーザーあたり$19/月)

### Amazon Q Develper CLIとは
Amazon Q Develper CLIは、Amazon Q Developerをコマンドラインから利用するためのツールです。


# 結論：無料枠のご利用は計画的に
冒頭でお話しした通り、今回のゲーム作りではAmazon Q Developerの無料利用枠を使い切ってしまい、中途半場な結果となってしまいました。

もしキャンペーンにチャレンジしてみようという方がいましたら、無料利用枠のご利用は計画的にすることをお勧めします。

### Amazon Q Developerの無料枠ってどのくらい？
AWSの公式サイトに書いてある無料利用枠の料金を見てみます。
以下にCLIでChatを使用した場合「50回/月」とあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560123/456b0a03-a1e1-4f90-85f3-0c84969a2df9.png)
参考：https://aws.amazon.com/q/developer/pricing/

なので、下記のようなイメージで会話を50回まで繰り返すことができます。
- 「Pythonでファイルを読み込む方法を教えて」→ Q Developer：「回答」（これで1回）
- 「そのコードを改良して」→ Q Developer：「改良版を提示」（これで2回）

# 実際にゲームを作ってみる
### 環境
- Windows11
- WSL2
- Ubunts
- Amazon Q Developer CLI

### 準備：Amazon Q Developer CLIとpygameをインストールする
下記の記事を参考にAmazon Q Developer CLIとpygameのインストールを行いました。
なお、pygameはPythonでゲームを簡単に作れるライブラリです。

※Windows環境の場合は、Wslの上にUbuntsをインストールする必要があります。

https://community.aws/content/2v5PptEEYT2y0lRmZbFQtECA66M/the-essential-guide-to-installing-amazon-q-developer-cli-on-windows

### Step1. ゲームの構想を練る
ゲームを作るにあたり、頭に思いつくことをひたすらマークダウンに書きました。

<details><summary>詳細はこちら</summary>

```
下記のゲームをpygameで作りたいです。
概要は記載しているので、ゲームのストーリー、BGM、効果音、デザイン等すべて、あなたが作ってください。

# 作りたいゲームの構想
## ジャンル
- AWSサービスと共に世界を救う知るRPG

## シナリオ
### 主人公
- 日本でオンプレミスのシステムを開発する新人インフラエンジニア

### 世界観
- ある日、主人公が100日の徹夜から家に帰宅中、突如、謎の光に包まれる
- 気付くとそこはAWSサービスが生活するクラウドの異世界
- 一見、平和に見えるクラウドの世界。しかし、裏ではセキュリティ脆弱性がクラウドの世界を乗っ取ろう計画していた...

### ストーリー進行
- オープニング
    - 上記、世界観を参照
- 異世界で主人公の冒険が始まる
- 最初の町でセキュリティ脆弱性の存在を知る
- 7つのボスを倒す旅に出る
- 全員のボスを倒し、ラスボスを倒す
- エンディング
    - 主人公は世界を救い、無事に元の世界へ戻る
    - 異世界で培ったAWSの知識を元に無事クラウドエンジニアに転職を果たす

## ゲーム性
- 主人公を操作するRPGゲーム

### ストーリーシステム
- 道中、一定の条件を満たすと、ストーリーが見れる
- ストーリーは、シミュレーションゲームのように、仲間との対話やAWSサービスの深い話などが聞ける

### フィールドシステム
- キャラクターは、好きにフィールド内を探索できる
- フィールドは下記で構成される
    - 移動可能フィールド：キャラクターが移動可能
    - 障害物：キャラクターが移動不可(山、海など世界に存在するであろう、一般的な障害物)
    - 街：フィールド上にはアイコンで表示され、アイコンに主人公が触れると、街に移動する
        - (街の詳細は後述)
    - ダンジョン：フィールド上にはアイコンで表示され、アイコンに主人公が触れると、ダンジョンに移動する
        - (ダンジョンの詳細は後述)

### 町システム
- AWSのカテゴリ(サーバレス、コンテナなど)毎に町が点在している
- 町の中には、カテゴリに属するAWSサービスが生活を営んでおり、町の人に声をかける事が可能
#### 町の人
- 町の人に声をかけると、AWSサービスの豆知識を教えてくれたり、ストーリー進行に必要な情報を教えてくれる
- 町の人の見た目
    - AWSサービスのアイコンを使用すること
- 町の人の名前
    - AWSサービスの正式名称を使用すること
- 町の人は、話しかけることで仲間にスカウトすることができる
    - (スカウトに関しては後述)
##### ショップ
- 主人公や仲間の装備やバトル中に使用できるアイテムを購入できる 
    - (仲間、バトル、アイテム、に関しては後述)

### バトルシステム
- エンカウント式で道を歩いていると、敵とバトルが始まる
- 味方は、主人公を含めて４名までバトルに参加できる

#### ステータス
- キャラクターごとにステータスが設定されており、値によってバトル中に下記の影響がある

- 体力
    - キャラクターごとに体力が設定され、0になるとゲームオーバー
    - 敵にも体力が設定され、0になるとゲームオーバー
- 速さ
    - ステータス値によって攻撃順が変わる
    - 逃げる際にも影響がある (詳細は後述)
- 攻撃力と防御力
    - 装備によって、上昇する

#### アイテムの使用
- アイテムを使用するとことで、体力の回復、ステータスの上昇、攻撃が可能
#### 逃げるの使用
- 逃げることで、バトルから離脱することが可能。ただし、敵よりキャラクターの「速さ」が上でないと、失敗する

#### バトルの報酬
- バトルに勝利すると、経験値とお金がもらえる

### スキルシステム
- スキルを使うことで、相手に大ダメージを与えることが可能
- スキルには、お金を使用し、下記「時間経過システム」にて、請求される
- スキルは、キャラクター(AWSサービス)によって、覚えられるスキル、効果・名称・料金が異なる
#### スキル名称
- AWSサービスが提供する機能名
#### スキルの料金
- 使用するAWSサービスの機能の１週間分の使用量

### 時間経過システム
- 下記の条件により、１週間が経過する
    - 4週間が経過すると、AWS料金の支払いが発生し、バトルで試用したスキルによって月額が請求される
- 月額が払えないと、バトルでのスキル試用が制限され、威力が半減してしまう

### 成長システム
- キャラクターは、バトルで経験値を得て、レベルアップする
- 最初は、レベル0から始まり、最大で100レベルまで到達する
- レベルが上がるごとに、ステータスが上昇する
- 一定のレベルになるとスキルを覚える

### 仲間スカウトシステム
- 町の中で、町の人に声をかけるとAWSサービスを仲間に出来る
- ただし、町の人からAWSサービスの問題が出され、４択から答えられないと、仲間に出来ない
- 仲間に出来るのは最大3名まで、主人公を含めると４名で進行することが可能

### キャラクターデザイン
#### 主人公
- 一般的な、20代男性、日本人の見た目であること
#### 敵
- なんかいい感じで
#### 仲間
- 各AWSサービスのアイコンであること
- 手足あってほしい
- それぞれ個性がでるようにしてほしい。(仲間に愛着が持てるように)

### その他
#### セーブ
- セーブがいつでも可能で、セーブデータはローカルに保存すること
- セーブ再開時は、最後に立ち寄った町からスタートする。説明をセーブ時に記載する事

#### 画面構成
- タイトル画面
    - はじめから、続きから、を選択できる
- ゲーム画面
    - ゲーム進行の画面
- 設定画面
    - キャラクター情報(ステータスや装備や仲間)、タイトルに戻る、所持金、の確認が可能
    - セーブすることも可能

# 制限事項
## 言語
- デフォルト：日本語
- ゲーム内の設定変更によって：英語
## 使用技術
- pygame
## 成果物
- 全てローカルに保存すること
```
</details>

次にとりあえず書いた構想をGitHub Copilotに渡して、添削&サマリ化してもらいました。

```
# AWS クラウド異世界RPG - 企画サマリ

## ゲーム概要
**新人エンジニアがAWSサービスと共に異世界を救うRPG**

- **開発**: Python + pygame
- **言語**: 日本語・英語対応
- **ターゲット**: AWSを学びたいエンジニア

## ストーリー
100日徹夜した新人エンジニアが、謎の光でAWSサービスが住む異世界に転移。セキュリティ脆弱性から世界を救い、AWSの知識を身につけて元の世界でクラウドエンジニアになる物語。

## 主要システム

### バトル
- 4人パーティのターン制バトル
- AWSサービスのスキル使用で実際の料金が発生
- 料金未払いでスキル威力半減

### 町・仲間
- AWSカテゴリ別の町を探索
- AWSサービス（住人）と会話で知識習得
- 4択クイズに正解で仲間にスカウト

### 成長
- レベル0→100まで成長
- 経験値でステータス上昇
- 一定レベルで新スキル習得

## 教育要素
- **学習**: AWSサービスの豆知識を対話で習得
- **体験**: 実際のAWS料金体系をゲーム内で模擬体験
- **確認**: 4択クイズでAWS知識の定着確認

## キャラクター
- **主人公**: 20代日本人男性エンジニア
- **仲間**: AWSアイコンベースの個性的キャラクター
- **敵**: セキュリティ脆弱性をテーマとした敵

## その他
- いつでもセーブ可能（ローカル保存）
- 最後の町から再開
- タイトル・ゲーム・設定の3画面構成

```

### Step2：実際にAmazon Q Developer CLIでゲームを実装する
下記のコマンドを実行して、Amazon Q Developer CLIを開始します。
```
q chat
```

下記の画面になったら準備完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560123/b0589652-975a-4c0b-859f-2e89c32ee370.png)

準備が出来たら先ほど作成したマークダウンを渡して、コードを書いてもらいます。
ローカルにPythonのコードが作られるのを待つだけです！

あとは、エラー、追加機能、機能修正があれば追加で依頼して、完成度を上げていきます。
```:例：エラーを直してもらう場合
ローカルのコードを修正して、下記のエラーを解消してください。
IndentationError: expected an indented block after function definition on line 830
```

```:例：修正してもらう場合
ローカルのコードを修正してください。
町中でドアが無いので建物には入れません。
また町中のオブジェクトの種類を増やして、町っぽくしてください。
```
ローカルのコードを修正してください。と付けないと、ファイル自体を更新してくれない事が多々ありました...

# 今回の反省点 (※あくまで個人の感想です)
### 1. プロンプトの文章は省略せず的確に
曖昧な命令をすると、意図しない動作をする場合が多々あります。
例えば、「マップのタイルの種類を増やして」という命令だと、具体的にどんなタイルを追加してほしいのか伝わりません。
結果、期待値は「川、山といったタイルを追加」に対して、実際は「町の花、ベンチといったタイルを追加」と思わぬ結果になってしまいます。

そのため、プロンプトは命令を具体的に書いてあげる必要があります。

### 2. 的確だけど文章は簡潔に
文章は具体的にと書きましたが、ただ長すぎても日本語の場合、文章の区切りが曖昧になりがちなので、簡潔に書いてあげた方が伝わると思いました。
あとは読点も意識しないとAIが誤解しちゃう場合もありそうです。

× 「マップに新しい地形タイルとして川や山そして森林のようなものを追加して」
○ 「マップに川、山、森のタイルを追加してください」

### 3. 1度に依頼する仕事は少しずつ
一度に大量の依頼をすると、情報量のせいか取り乱したような挙動になりがちでした。
- コードが正常に動作しない
- タイムアウトでエラーが発生し続ける

(人間と一緒で、上司から一度に大量の仕事が来ると、どこから手を付けるか、何をどう対処するか困るときありますよね？あれと同じです)

### 4. 煮詰まったらやり直す
エラー修正などを依頼した際、「直りました！」→「別のエラー」→「今度こそ直りました！」→「前に直したエラーが再発」のような感じで、にっちもさっちもいかなくなる場合があります。
そういった場合は、いっそのことAmazon Q Developer CLIを開きなおして、新しいセッションでお願いすると解決したりします。

(人間と一緒で、残業してもわからないバグが、お風呂入ったら解決したりしますよね？あれと同じ感じです)

# 最後に
Amazon Q Developer CLIを使って1行も自分でコード書かずにゲームが作れました！(完成したとは言ってない)

今までは頭にアイデアが思いついても実現の仕方が分からず眠ってしまったアイデアがあるのではないでしょうか。

個人的には、これらのアイデアが生成AIを活用することでサクッと実現できるようになってきているので、0から1の開発が加速していると感じました。