Amazon Q CLI に日本語で指示するだけでゲーム作成した話

先日AWS公式ブログにて「Amazon Q CLI でゲームを作ろう Tシャツキャンペーン」というキャンペーンの告知がありましたのAmazon Q CLIで遊んでみました。
https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

## 最初に
プロンプトが長文だったので、ブログが長くなってしまった。
今回このゲームを作るにあたって、僕が実際に手を動かしたのは延べ１時間くらいでした。
このゲームは最終的にpythonベースの約1500行分のスクリプトで出来上がりましたが、僕が実際にコードを書くことは全くありませんでした。
僕は日本語で作りたいゲームの機能／要望をひたすらAmazon Q CLIに指示していただけで作成することができました。
また、実行基盤に足りないモジュールもAmazon Q CLI側で判断して適宜インストールしてくれるので、
自分で実行基盤のメンテをしなくてすむのも便利でした。

★2025/6/18 追記
賞品のTシャツ届きました！Amazon Qのロゴが入ってました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/64a43104-a203-49e6-a27e-30e4fb9f3484.png)


## ゲームの紹介
実際に作ったゲームの画面は下記になります。

■タイトル画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/b5a80e54-7d61-4b80-b994-fb3ff89ed7a9.png)

■マップ画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/29811c60-2710-4a8a-b463-5fe3310efb26.png)

■野生モンスターとの戦闘シーン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/866c6280-f6bb-4875-b355-84facf3cb4c3.png)

マップを移動すると一定の確率で野生モンスターが出現します。
野生モンスターと戦闘シーンでは技を選択して、相手モンスターにダメージを与えていきます。


## 環境セットアップ
AWSブログに書いてあった下記のリンクを参考に、Amazon Q CLIをインストールしました。
https://community.aws/content/2v5PptEEYT2y0lRmZbFQtECA66M/the-essential-guide-to-installing-amazon-q-developer-cli-on-windows?trk=e07eca93-fa2f-4351-b567-f293b83eb635&sc_channel=el_

早速Amazon Q　CLIを起動してみました。
```
$ q chat
Welcome to Amazon Q!

💡 Get notified whenever Q CLI finishes responding. Just run q settings chat.enableNotifications true

/help all commands
ctrl + j new lines
ctrl + s fuzzy search
> 
```

## ゲーム作成
今回私はポケモンっぽいロールプレイングゲームを作りたいと思ったので、プロンプトに下記を入力しました。
尚、日本語にも対応していたので、日本語で入力しました。
```
> 私はロールプレイングゲームを作りたいです。草むらを歩いているとモンスターが出現し、自分のモンスターと戦うゲームを作成したいです。
また、野生のモンスターは専用のボールを使って捕まえることができるようにしたいです。
モンスターを倒すと経験値がもらえ、経験値を集めるとレベルアップするようにしたいです。
またトレーナー同士で互いのモンスターを戦えるようにしたいです。
そんなゲームを作ってください。
```
AmazonQからの返答は下記でした。
※長いので抜粋してます。
　実際には「monster_game.py」にどんなコードを記載したかも回答してくれました。
```
ロールプレイングゲームの作成についてのご質問ありがとうございます。モンスター
収集、バトル、レベルアップシステムを持つゲームを作りたいとのことですね。
Pythonを使って簡単なコンソールベースのゲームを作成してみましょう。

まず、基本的な構造を作成します。以下のファイルを作成していきます：


monster_game.pyというファイルを作成しました。このゲームには以下の機能が含ま
れています：

1. モンスターシステム
   • 各モンスターには名前、HP、攻撃力、防御力、素早さ、タイプ、技があります
   • モンスターはレベルアップすると能力が向上します
   • 経験値システムがあり、バトルで勝つと経験値を獲得できます

2. バトルシステム
   • ターン制のバトルシステム
   • タイプ相性（火、水、草など）によるダメージ補正
   • クリティカルヒットの要素

3. 捕獲システム
   • モンスターボールを使って野生のモンスターを捕まえられます
   • HPが低いほど捕まえやすくなります

4. トレーナーバトル
   • CPUトレーナーと対戦できます
   • 勝利すると報酬としてモンスターボールを獲得できます

5. その他の機能
   • モンスターセンターでモンスターを回復
   • モンスターボールの購入
   • モンスター情報の表示

ゲームの実行方法：
1. ターミナルで python monster_game.py を実行します
2. 名前を入力し、最初のモンスターを選びます
3. メインメニューから様々なアクションを選択できます

このゲームはポケモンに似た要素を持っていますが、シンプルなコンソールベースの
ゲームとして実装しています。拡張したい場合は、より多くのモンスター、技、
タイプを追加したり、グラフィカルインターフェースを実装したりすることができます。

お試しいただき、フィードバックがあればお知らせください！
```
ポケモンと同じようにするための機能を拡張できるとのことなので、追加で下記をお願いしました。
```
> グラフィカルインターフェースを実装してほしいです。マップを移動していると一定の確率で、
モンスターが出現するようにしてほしいです。また、モンスターを倒すと経験値がもらえるようにして
一定の経験値をためるとレベルアップして強くなるようにしてほしいです。
```
AmazonQからの返答は下記でした。※長いので抜粋してます。
追加機能が多すぎるので分割して実装すると怒られました(笑)
```
申し訳ありません。コードが大きすぎるため、分割して作成していきます。まずは基
すみません、応答に時間がかかりました。グラフィカルインターフェースの実装は大
きなタスクですので、段階的に進めていきましょう。

まずは基本的なGUIフレームワークから始めて、徐々に機能を追加していきます。以
下のように分割して実装していきます：

1. 基本的なPygameの設定とマップ表示
2. プレイヤーキャラクターの移動機能
3. モンスター出現システム
4. バトル画面の実装
5. 経験値とレベルアップシステムの統合

まずは第1ステップから始めましょう。Pygameを使った基本的なフレームワークを作
すみません、応答に時間がかかってしまいました。グラフィカルインターフェースの
実装は複雑なタスクですので、小さなステップに分けて進めていきましょう。

まずは基本的なPygameのセットアップから始めましょう。以下のように段階的に実装
していきます：

## ステップ1: 基本的なPygameのセットアップ
すみません、応答に時間がかかってしまいました。より小さなステップに分けて進め
ていきましょう。
～～～～～
すみません、応答に時間がかかってしまいました。より小さなステップに分けて進め
ていきましょう。

まず、作成したmonster_game_gui_step1.pyを実行してみてください。これは基本的
なマップ移動システムを実装したものです。

このファイルには以下の機能が含まれています：
• タイトル画面
• 簡易的なマップ表示（道、草むら、水、木）
• キャラクター移動（矢印キーまたはWASDキー）
• 草むらに入ると一定確率でモンスター出現メッセージ（コンソール表示のみ）

次のステップでは、モンスターのクラスとバトルシステムを追加していきます。まず
は実行して動作確認をしてみてください。

実行方法：
bash
python monster_game_gui_step1.py


タイトル画面でスペースキーを押すとゲームが始まります。矢印キーでキャラクター
を動かせます。草むらに入ると、コンソールに「モンスターが現れた！」と表示され
ることがあります。

次のステップでは、モンスターのクラスとバトル画面を実装していきます。一度に全
ての機能を追加するのではなく、段階的に進めていきましょう。
```
2Dマップで移動する機能と野生モンスターを出現させる機能を実装してくれました。
次に、モンスターのクラスとバトル画面を実装をお願いしたのですが、タイムアウトが発生してしまいました。。
```
Creating: /home/tkazu/q/monster_game_gui_step2.py

 ⋮
 ● Completed in 0.1s
Response timed out - message took too long to generate
```
タイムアウトの画面が発生したので、モンスターのクラスとバトル画面を別々で実装をお願いしてみましたところ、実装自体はできてたとのことです。
```
> モンスターのクラスを実装をお願いします。
モンスターのクラスはすでに実装済みです。monster_class.pyというファイルに基本
的なモンスタークラスを作成しました。このクラスには以下の機能が含まれています
：

1. モンスターの基本ステータス（HP、攻撃力、防御力、素早さなど）
2. レベルアップシステム
3. 経験値獲得システム
4. 攻撃機能（タイプ相性やクリティカルヒットを含む）
5. 回復機能

また、monster_game_gui_step2.pyファイルも作成しました。このファイルでは：

1. モンスタークラスを使用したバトルシステム
2. グラフィカルなバトル画面
3. 技選択システム
4. 敵モンスターとのターン制バトル
```

```
> バトル画面の実装をお願いします。
バトル画面の実装を進めていきましょう。すでに基本的なバトル画面は
monster_game_gui_step2.pyに実装されていますが、さらに機能を追加して改善して
すみません、応答に時間がかかってしまいました。バトル画面の実装を小さなステッ
プに分けて進めていきましょう。

すでにmonster_game_gui_step2.pyにバトル画面の基本的な実装はされていますが、
さらに改良していきます。
```

今実装されてる機能がわからなくなったので聞いてみたところ、下記が実装されてました。
```
> 今実装してる機能の一覧をおしえてください
現在実装されている機能の一覧は以下の通りです：

1. 基本システム
   • Pygameを使用したグラフィカルインターフェース
   • タイトル画面
   • キーボード操作によるゲーム操作

2. マップシステム
   • ランダム生成されるマップ（道、草むら、水、木）
   • キャラクター移動システム
   • カメラ追従システム

3. モンスターシステム
   • モンスタークラス（HP、攻撃力、防御力、素早さなど）
   • 複数の技を持つモンスター
   • タイプ相性システム（火、水、草など）
   • レベルアップシステム
   • 経験値獲得システム

4. バトルシステム
   • 草むらでのランダムエンカウント
   • ターン制バトル
   • 技選択と攻撃
   • HPバー表示
   • バトルメッセージ表示
   • 逃げる機能

5. プレイヤーシステム
   • 複数のモンスターを所持可能
   • モンスターボールの所持

現在、以下の機能は実装途中または未実装です：
• モンスターボールでの捕獲システム（UIはあるが機能未実装）
• モンスター交換システム（UIはあるが機能未実装）
• モンスター情報画面
• メニュー画面
• トレーナー同士の対戦

>
```
## ゲームの起動と遊び方確認
作ったゲームの起動方法と遊び方を確認しました。
```
> ゲームの実行方法と遊び方を教えてください
ゲームの実行方法と遊び方についてご説明します。

## ゲームの実行方法

1. ターミナルを開き、ゲームファイルがあるディレクトリに移動します
2. 以下のコマンドを実行します：

   python monster_game_gui_step2.py


## 遊び方

### 開始方法
1. タイトル画面が表示されたら、スペースキーを押してゲームを開始します
2. ゲーム開始時に自動的に初期モンスターが与えられます

### マップ移動
• 矢印キー（↑↓←→）またはWASDキーでキャラクターを移動できます
• 画面上部に現在の座標が表示されます
• 画面下部にはプレイヤーのモンスター情報が表示されます

### モンスターとの遭遇
• 緑色の草むらを歩くと、一定確率（約10%）で野生のモンスターに遭遇します
• モンスターに遭遇するとバトル画面に切り替わります

### バトル画面
1. バトル画面では以下の選択肢があります：
   • 「戦う」：モンスターの技を選んで攻撃
   • 「モンスター」：別のモンスターに交代（現在は機能未実装）
   • 「モンスターボール」：野生のモンスターを捕まえる（現在は機能未実装）
   • 「逃げる」：バトルから逃げる（70%の確率で成功）

2. 技選択：
   • 「戦う」を選ぶと技選択画面になります
   • 矢印キー（↑↓）で技を選び、Enterキーで決定します
   • 技を使うと相手にダメージを与えます
   • タイプ相性によってダメージが変わります（例：水は火に強い）

3. バトル結果：
   • モンスターを倒すと経験値を獲得し、一定量たまるとレベルアップします
   • 自分のモンスターが倒されると負けになります

### 操作方法まとめ
• 移動：矢印キーまたはWASDキー
• 決定：Enterキー
• 選択：矢印キー（↑↓）
• キャンセル：Escapeキー（技選択画面のみ）

現在のバージョンではモンスターボールでの捕獲やモンスター交換などの機能は未実
装ですが、基本的なマップ移動とバトルシステムをお楽しみいただけます。

>
```

## 作ったゲームで遊んでみた

```
> python monster_game_gui_step2.py
I'll help you run the monster game. Let me execute that command for you.


🛠️  Using tool: execute_bash
 ⋮
 ● I will run the following shell command:
python monster_game_gui_step2.py
 ⋮
 ↳ Purpose: Running the monster game GUI application


Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

> t
```

ゲームが起動できました！まずはマップを移動してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/70f76d62-e63e-46b2-9e08-4bbb8ed9f07d.png)

マップを少し移動したらモンスターが出てきました。ただ文字化けしてる。。。
コマンドプロンプトの方を見るとちゃんと処理が実行されてました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/1d592413-fbd5-4866-a8c2-33b011e615d9.png)

## 文字化けの修正
AmazonQに修正してもらいましょう。
```
> さっき作ったpython monster_game_gui_step2.pyですが、GUI画面の方で文字化けが
発生してしまいました。文字化けを修正して正しく日本語が表示されるようにしてほしいです。
```

```
 ● Completed in 0.0s
日本語の文字化け問題を解決しました。以下の対応を行いました：

1. システムに日本語フォントがインストールされていなかったため、
fonts-noto-cjkパッケージをインストールしました。これは日本語、中国語、韓国語
などの東アジア言語をサポートする高品質なフォントです。

2. Pygameのフォント設定を変更し、Noto CJKフォントを使用するようにしました：

python
   try:
       # Noto CJK フォントを使用（日本語対応）
       font_small = pygame.font.Font("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 24)
       font_medium = pygame.font.Font("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 32)
       font_large = pygame.font.Font("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 48)
       print("Noto CJK フォントを使用します")
   except FileNotFoundError:
       # フォールバックオプションも用意
       ...



3. フォールバックオプションとして、Ubuntuフォントも設定しました。これにより
、何らかの理由でNoto CJKフォントが使用できない場合でも、可能な限り文字化けを
防ぐようにしています。

これで、ゲーム内の「モンスターRPG」や「野生のモンスターが現れた！」などの日
本語テキストが正しく表示されるようになります。

プログラムを実行すると、「Noto CJK フォントを使用します」というメッセージが
表示され、日本語が正しく表示されるはずです。

>
```
自分の実行環境に日本語用のフォントが入ってないことが原因でした。
AmazonQが自動でインストール対応をしてくれました。


## ゲームの再実行
再度実行したところ、無事日本語でゲームができるようになりました！
※実際のポケモン名が入ってたので、マスクしてます(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/85167458-d342-4743-ae6c-dd580ccc7ac0.png)

GUIの方はまだ改良が必要ですが、プロンプトの方を見るとちゃんとゲームが機能してるのがわかります。
タイプ相性も中でちゃんと判別してくれてるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/80a284e5-e4e9-4ff1-ae10-d3ce42c71d5c.png)

## ゲームのブラシュアップ
せっかくなので、作ったゲームをもっとポケモンっぽく改修してもらうことにしました。
```
> 以前作った monster_game_gui_step2.pyをポケモン赤のようなゲームにしたいです。
足りない機能、要素を洗い出してほしいです。また、足りない機能、要素をSTEPに分割して、
一つずつ実装していってほしいです。最終的にポケモン赤よりも面白いゲームにしてください。
```
回答
```
まず、monster_game_gui_step2.pyの内容を確認して、現在の機能を把握しましょう。
🛠️  Using tool: fs_read (trusted)
 ⋮

 ● Completed in 0.0s
現在のmonster_game_gui_step2.pyを分析した結果、ポケモン赤のようなゲームにするために足りない機能や要素を洗い出し、それら
をSTEPに分けて実装していきましょう。

# ポケモン赤風ゲームに必要な追加機能・要素

## 現状の機能
• 基本的なマップ移動とプレイヤー表示
• シンプルなバトルシステム（攻撃、逃げる）
• モンスターの基本ステータスと技
• タイプ相性システム
• 経験値とレベルアップ
• 草むらでのランダムエンカウント
⋮
```
長くなりますが、この後はプロンプトエンジニアリングベースで機能の追加を行っていきました。
一括で機能を実装しようとしたところ、処理がタイムアウトしてしまったので、何回かに分けて実行しました。
キャラクターの画像もAmazonQに作ってもらいました。最終的に下記のようなゲームができました。
■マップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/29811c60-2710-4a8a-b463-5fe3310efb26.png)

■野生モンスターとの戦闘シーン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/fff9296f-77f9-4ee0-89fb-f1b615f5c277.png)

ボールを使って野生モンスターを捕獲する機能も実装しました。ボールを投げるエフェクトも実装してます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990360/7969567b-d751-4343-b2db-599417357685.png)

## 最後に
今回初めてAmazon Q CLIを使ってみましたが、とても便利なツールだと思いました。
実施に僕がやったことは作りたいゲームの要望を出してただけで、特にプログラム書いたりはしませんでした。
また、冒頭でも触れましたが僕が手を動かしたのは延べ1時間くらいであとは全部Amazon Q CLIの方でやってくれました。
実行環境の不備をAIで自動修復してくれるのもありがたかったです。
始める前に想像していたクオリティよりもかなり高クオリティのゲームができたと思います。
今度はもっと別のゲームを作ってみたいです。また、本業にも活用できなかを真面目に検討したいなと思いました。