Amazon Q CLI で音ゲーを作ろう。楽曲生成もAmazon Q CLIで出来るよ。

## デモ 
- Pythonでの開発経験なし、作曲経験もなしの私が、Amazon Q CLIとの対話のみを活用してリズムゲーム（以下、音ゲー）と、ゲーム内で使う音楽を製作することができたので、今回はそのプロセスを説明していきます。
 
![完成したリズムゲーム.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074525/85e3b112-0c6d-414b-a9de-23c6c8e77899.gif)

https://github.com/sense-of-unity/rhythm_game_amazon_q_cli

## きっかけ
巷では『Amazon Q CLI』を使ってゲームを製作し、その結果についてブログに書けば、Amazon QブランドのTシャツがもらえる、という画期的なキャンペーンが話題になっていたため、私も週末に参加してみることにしました。

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

## 音ゲーを題材に選んでみた理由
私は大学生のころスマホのリズムゲームでβテスターをしたり、暇さえあればゲームセンターに通ったりしていたほど、大の音ゲー好きであり、今も櫻坂46・日向坂46の公式リズムゲーム『UNI'S ON AIR』に時間（+お金）を溶かしており、ゲームの中で音ゲーが一番身近だったというのが理由です。
また、Amazon Q CLIは単体では音楽の生成をサポートしていませんが、プロンプトの与え方次第で何とか音楽生成をしてくれるのではないかと期待し、今回は楽曲制作も含めて音ゲーをAmazon Q CLIに作らせることとしました。

## 音ゲーのゲームとしての構成要素
音ゲーの主たる構成要素は
- バックグラウンドで音楽を流すこと
- 音楽のリズムに合わせて流れてくるボタンやキーなどを押したりスライドさせること
- プレイヤーのボタンやキーの操作が、流れている音楽のリズムにあっているかを判定して点数をつけること

のざっくり３つだと思います。
最低限この要素は実装するように指示します。
この時点で１番の不安要素は、やはり「音楽を作成する方法」です。もしできれば面白いアプローチになりそうなため、この辺りはAmazon Q CLIと壁打ちして解消していきたいと思います。

## 環境について
公式で案内されている通り、Amazon Q CLIとPyGameを導入していきます。
私はWindows環境のため、WSLの環境上にAmazon Q CLIとPyGameを導入しました。導入については、ほかの方も多数記事を書かれているため割愛します。

## 実際にAmazon Q CLIと音ゲーを作っていく

### まずは仕様書作成
仕様書を一から起こすのも大変なため、たたき台を作成してもらっていきます。
``` :プロンプト
> 最低限次のような構成要素を満たした、音ゲーの仕様書をローカルファイルに作成したい。
- バックグラウンドで音楽を流すこと
- 音楽のリズムに合わせて流れてくるボタンやキーなどを押したり、スライドさせること
- プレイヤーのボタンやキーの操作が、流れている音楽のリズムにあっているかを判定して点数をつけること
```
``` :Amazon Q CLI
おおきに！音ゲーの仕様書を作成しました！/home/sence_of_unity/rhythm_game_spec/rhythm_game_specification.mdに保存しましたで。

この仕様書には、ご要望いただいた要素をバッチリ入れてます：
• バックグラウンドで音楽を流す機能（3.1 音楽再生機能）
• 音楽のリズムに合わせて流れてくるノーツの操作（2.2 操作方法）
• プレイヤーの操作タイミングを判定して点数をつける仕組み（2.3 判定システム、6.1 得点計算）

他にも音ゲーとして必要な要素をガッツリ入れてます：
• 難易度システム
• ビジュアル要素
• スコアとランク評価
• カスタマイズ機能
• 技術要件

この仕様書をベースに開発を進めたら、ええ感じの音ゲーができそうですな！何か追加したい要素や変更点があれば、言うてくださいね。
```

<details><summary>起こしてくれた仕様書 rhythm_game_specification.md（長いので折りたたみます）</summary>

# リズムゲーム仕様書

## 1. 概要

### 1.1 ゲーム概要
本ゲームは音楽のリズムに合わせてプレイヤーが操作を行い、タイミングの正確さによって得点を競うリズムゲームである。

### 1.2 対象プラットフォーム
- モバイル（iOS/Android）
- PC（Windows/Mac）

## 2. ゲームシステム

### 2.1 基本ゲームプレイ
- プレイヤーは音楽のリズムに合わせて画面上に表示される指示に従って操作を行う
- 操作のタイミングと正確さによって得点が決まる
- 一曲のプレイ終了後に総合評価が表示される

### 2.2 操作方法
以下の操作タイプをサポート：
1. **タップ/クリック**: 指定された位置を単純にタップ/クリック
2. **ホールド**: 指定された時間だけボタンを押し続ける
3. **スライド**: 指定された方向にスワイプ/ドラッグする
4. **フリック**: 短く素早く指定方向にはじく

### 2.3 判定システム
タイミング判定は以下の5段階：
- **PERFECT**: 理想的なタイミング（±0.03秒以内）- 100点
- **GREAT**: 良好なタイミング（±0.05秒以内）- 80点
- **GOOD**: 許容範囲内のタイミング（±0.10秒以内）- 50点
- **BAD**: 許容範囲外のタイミング（±0.15秒以内）- 20点
- **MISS**: 完全に外れたタイミングまたは未入力 - 0点

### 2.4 コンボシステム
- 連続して成功（GOOD以上）すると「コンボ」としてカウント
- コンボ数に応じて得点倍率が上昇（最大2.0倍）
- BADまたはMISSでコンボが途切れる

## 3. 音楽システム

### 3.1 音楽再生機能
- バックグラウンドで音楽を再生
- 音楽データはOGG形式またはMP3形式をサポート
- 音楽の再生速度を変更可能（0.75倍～1.5倍）

### 3.2 ビート検出と同期
- 各楽曲のBPM（Beats Per Minute）情報を事前に設定
- ノーツ（操作指示）は楽曲のビートに合わせて配置
- システムは音楽の再生位置とノーツの表示タイミングを常に同期

### 3.3 音響効果
- 操作成功時に効果音を再生
- 判定結果に応じて異なる効果音を使用
- 効果音の音量は音楽とは別に調整可能

## 4. ビジュアルシステム

### 4.1 ノーツデザイン
- 各操作タイプに対応した視覚的に区別しやすいノーツデザイン
- タップ: 円形
- ホールド: 長方形
- スライド: 矢印付きライン
- フリック: 方向付き矢印

### 4.2 判定ライン
- 画面上に判定ラインを表示
- ノーツがこのラインに到達したタイミングで操作を行うのが理想的
- 判定結果に応じてエフェクトを表示

### 4.3 背景演出
- 音楽のビートや盛り上がりに合わせて背景エフェクトを変化
- プレイヤーの操作成功率に応じて背景の演出を変化

## 5. 難易度システム

### 5.1 難易度レベル
以下の4段階の難易度を用意：
- **EASY**: 初心者向け、基本的な操作のみ
- **NORMAL**: 中級者向け、基本操作に加えて簡単な複合操作
- **HARD**: 上級者向け、複雑な操作パターンと高速なテンポ
- **EXPERT**: 熟練者向け、極めて複雑かつ高速な操作要求

### 5.2 難易度調整要素
- ノーツの数と密度
- 複合操作の頻度
- 判定の厳しさ（オプションで調整可能）

## 6. スコアシステム

### 6.1 得点計算
基本得点 = ノーツの判定点 × コンボ倍率
総合得点 = 基本得点の合計 + ボーナス点

### 6.2 ランク評価
プレイ終了時に以下のランクを表示：
- **S**: 95%以上の精度
- **A**: 90%以上の精度
- **B**: 80%以上の精度
- **C**: 70%以上の精度
- **D**: 60%以上の精度
- **E**: 60%未満の精度

### 6.3 リザルト画面
- 総合得点
- 最大コンボ数
- 各判定の回数（PERFECT, GREAT, GOOD, BAD, MISS）
- 精度（%）
- ランク評価

## 7. 楽曲選択システム

### 7.1 楽曲リスト
- ジャンル別に楽曲を分類
- 難易度別にフィルタリング可能
- お気に入り登録機能

### 7.2 楽曲情報表示
- 曲名とアーティスト
- 曲の長さ
- BPM
- 各難易度のレベル表示
- 自己ベストスコアとランク

## 8. カスタマイズ機能

### 8.1 ゲーム設定
- 音量調整（BGM、効果音）
- ノーツの落下速度調整
- 判定タイミングオフセット調整

### 8.2 視覚カスタマイズ
- ノーツのスキン変更
- 背景テーマ変更
- 判定エフェクト変更

## 9. 技術要件

### 9.1 フレームレート
- 最低60FPS以上を維持
- 120FPSにも対応（ハイエンド端末向け）

### 9.2 入力遅延
- 入力遅延は16ms以下を目標
- タッチ/クリック入力からシステム認識までの遅延を最小化

### 9.3 音声同期
- 音声と視覚要素の同期ずれは±10ms以内に抑える
- デバイスごとの音声遅延を自動補正する機能を実装

## 10. 将来拡張計画

### 10.1 マルチプレイヤー機能
- リアルタイム対戦モード
- ランキングシステム

### 10.2 追加コンテンツ
- 定期的な楽曲追加
- 季節イベント
- 限定スキン

## 11. 開発スケジュール

### 11.1 フェーズ1: 基本システム開発
- 音楽再生エンジン
- 基本操作システム
- 判定システム

### 11.2 フェーズ2: コンテンツ制作
- 楽曲データ作成
- ノーツ配置
- ビジュアルデザイン

### 11.3 フェーズ3: テストと最適化
- パフォーマンス最適化
- バランス調整
- ユーザーテスト

## 12. 付録

### 12.1 用語集
- **ノーツ**: プレイヤーが操作すべき対象
- **BPM**: Beats Per Minute、曲のテンポを表す単位
- **判定**: プレイヤーの操作タイミングの評価
- **コンボ**: 連続成功回数

### 12.2 参考資料
- 競合製品分析
- ユーザーフィードバック要約
- 技術的制約と解決策
</details>

かなり音ゲーについての解像度は高い仕様書ができたのですが、気になるところをチャット上で微修正してもらっていきます。
### 仕様の修正
今回スマホでの実装までは想定しないので、PCのキーボード操作に特化したデザインとしてもらいます。
``` :プロンプト
> 1.2 対象プラットフォームはPCとしてください。これに合わせて、キーボードで操作できるデザインとしてください。
わかりました！仕様書を修正して、対象プラットフォームをPCに限定し、キーボード操作に特化したデザインに変更しますね。
```
``` :Amazon Q CLI
ほな、仕様書を修正しました！PCプラットフォーム専用のキーボード操作に特化した内容に変更しましたで。主な変更点は：

1. 対象プラットフォームをPCのみに限定
2. 操作方法をキーボード向けに変更（キープレス、ホールド、同時押し、連打）
3. ノーツデザインをキーボード操作に合わせて修正
4. ゲーム設定にキーボード関連の設定を追加
5. 入力遅延の目標値をキーボード向けに最適化（10ms以下）
6. 新しく「13. キーボードレイアウトと操作方法」のセクションを追加
   • デフォルトキー配置（A, S, D, F, J, K, L, ;）
   • 難易度別のキー配置ガイドライン
   • キーボード操作のUI表示方法

これで、PCでのキーボード操作に特化したリズムゲームの仕様書になりました。何か他に修正や追加したい部分はありますか？
```

### Amazon Q CLIで音楽を作成する
楽曲製作もAmazon Q CLIにやってもらえるかを聞いてみます。
``` :プロンプト
 ゲーム内で使用する音楽も生成してくることはできますか？
```
``` :Amazon Q CLI
ごめんなさい、音楽ファイルを直接生成することはできませんねん。Amazon Q では実際の音声や音楽ファイルを生成する機能は持ってないんです。

ただ、音ゲーで使う音楽についての仕様や要件を追加することはできますよ！例えば：
• 必要な音楽の種類やジャンル
• BPM（テンポ）の推奨範囲
• 音楽の長さや構成
• 著作権に関する注意点
• 外部から音楽を取得する方法や推奨サービス

音楽に関する仕様書のセクションを追加しましょか？または、音楽制作のための外部ツールやサービスについての情報を提供することもできますよ。どないしましょ？
```
そうですよね。それは最初から分かっていました。
>Amazon Q CLI の可能性を探るため、できるだけ革新的なゲームを作ってみてください。

ということなので、Amazon Q CLIさんを信じて、もう少ししがみついてみましょう。
``` :プロンプト
とはいえ、なんとか簡単なものでもCLI上でmp3を生成できないですか？
```
``` :Amazon Q CLI
そうですね、CLI上で簡単なmp3ファイルを生成する方法はいくつかあります！FFmpegを使って基本的な音声ファイルを作成できますよ。
```
***できるんかい！*** ということで、ここからもAmazon Q CLIに言われるがまま、Shellコマンドを承認していきます。インストールは実際載せると長くなるので割愛しますが、「FFmpeg」と「Sox」のインストールを提案され、インストールしました。ざっくり方式を説明すると、Soxでコマンドラインからwavを生成し、FFmpegでmp3へ変換をかけるという仕組みで音楽の生成を提案してくれました。

``` :Amazon Q CLI
🛠️  Using tool: execute_bash
 ⋮
 ● I will run the following shell command:
mkdir -p /home/sence_of_unity/rhythm_game_spec/sample_music && cd /home/sence_of_unity/rhythm_game_spec/sample_music && sox -n -r 44100 -c 2 beat.wav synth 0.1 sine 880 fade 0 0.1 0.01 : synth 0.1 sine 440 fade 0 0.1 0.01 repeat 20 && ffmpeg -i beat.wav -codec:a libmp3lame -qscale:a 2 rhythm_sample.mp3 && echo "サンプル音楽ファイルを作成しました: /home/sence_of_unity/rhythm_game_spec/sample_music/rhythm_sample.mp3"
 ⋮
 ↳ Purpose: 簡単なmp3ファイルを生成

（中略）

サンプル音楽ファイルを作成しました: /home/sence_of_unity/rhythm_game_spec/sample_music/rhythm_sample.mp3

 ⋮
 ● Completed in 1.552s
```
待つこと１秒、なんと **できてしまいました。** この時点ではほぼモールス信号的な音源になっていたため、追加で指示をします。

:::note info
音楽生成の部分は少し珍しいアプローチのような気がしますので、細かく載せております。
:::

``` :プロンプト
> このコマンドベースにして、１分ぐらいの「音楽」を作成してください。できるだけJ-POPのトレンドに近い音楽を作成することを期待します。
```
``` :Amazon Q CLI
cd /home/sence_of_unity/rhythm_game_spec/sample_music && cat > create_jpop.sh << 'EOF'
#!/bin/bash

# J-POPっぽい1分間の音楽を生成するスクリプト
# 一時ファイル用のディレクトリ
mkdir -p temp

# テンポ設定（BPM=120）
BEAT_LENGTH=0.5  # 4分音符の長さ（秒）

# コード進行（J-POPでよく使われるコード進行）
# C-G-Am-F の進行を使用
create_chord() {
  local name=$1
  local root=$2
  local third=$3
  local fifth=$4
  local length=$5

  sox -n -r 44100 -c 2 temp/${name}.wav synth $length sine $root fade 0 $length 0.1 : synth $length sine $third fade 0 $length 0.1 : synth $length sine $fifth fade 0 $length 0.1
}

# ドラムビートの作成
create_drum_beat() {
  local name=$1
  local length=$2
  local pattern=$3

  # キック（低い音）
  sox -n -r 44100 -c 2 temp/kick.wav synth 0.1 sine 80 fade 0 0.1 0.05

  # スネア（中音）
  sox -n -r 44100 -c 2 temp/snare.wav synth 0.1 sine 240 fade 0 0.1 0.05

  # ハイハット（高音）
  sox -n -r 44100 -c 2 temp/hihat.wav synth 0.05 noise fade 0 0.05 0.01

  # パターンに基づいてドラムを配置
  sox -n -r 44100 -c 2 temp/${name}.wav trim 0.0 $length

  local position=0.0
  for beat in $pattern; do
    case $beat in
      "k") sox temp/${name}.wav temp/kick.wav temp/temp_drum.wav splice $position && mv temp/temp_drum.wav temp/${name}.wav ;;
      "s") sox temp/${name}.wav temp/snare.wav temp/temp_drum.wav splice $position && mv temp/temp_drum.wav temp/${name}.wav ;;
      "h") sox temp/${name}.wav temp/hihat.wav temp/temp_drum.wav splice $position && mv temp/temp_drum.wav temp/${name}.wav ;;
    esac
    position=$(echo "$position + 0.25" | bc)
  done
}

# メロディの作成
create_melody() {
  local name=$1
  local length=$2
  local notes=$3

  sox -n -r 44100 -c 2 temp/${name}.wav trim 0.0 $length

  local position=0.0
  for note in $notes; do
    sox -n -r 44100 -c 2 temp/note_temp.wav synth 0.25 sine $note fade 0 0.25 0.05
    sox temp/${name}.wav temp/note_temp.wav temp/temp_melody.wav splice $position && mv temp/temp_melody.wav temp/${name}.wav
    position=$(echo "$position + 0.25" | bc)
  done
}

# コード進行の作成（各コード2小節 = 4拍 = 2秒）
create_chord "c_chord" 261.63 329.63 392.00 $BEAT_LENGTH
create_chord "g_chord" 392.00 493.88 587.33 $BEAT_LENGTH
create_chord "am_chord" 220.00 261.63 329.63 $BEAT_LENGTH
create_chord "f_chord" 349.23 440.00 523.25 $BEAT_LENGTH

# 4つのコードを1セットとして、それを繰り返す
sox temp/c_chord.wav temp/g_chord.wav temp/am_chord.wav temp/f_chord.wav temp/chord_progression.wav

# 8回繰り返して約30秒の伴奏を作成
sox temp/chord_progression.wav temp/chord_progression.wav temp/chord_progression.wav temp/chord_progression.wav temp/chord_progression.wav temp/chord_progression.wav temp/chord_progression.wav temp/chord_progression.wav temp/full_chords.wav

# ドラムビートの作成（4拍 = 1小節）
# k=キック、s=スネア、h=ハイハット、-=休符
create_drum_beat "basic_beat" 4.0 "k - s - k - s -"

# ドラムパターンを繰り返して30秒のドラムトラックを作成
sox temp/basic_beat.wav temp/basic_beat.wav temp/basic_beat.wav temp/basic_beat.wav temp/basic_beat.wav temp/basic_beat.wav temp/basic_beat.wav temp/basic_beat.wav temp/full_drums.wav

# シンプルなメロディの作成
# C メジャースケールの音符を使用
create_melody "melody1" 4.0 "523.25 523.25 783.99 659.26 523.25 587.33 523.25 493.88"
create_melody "melody2" 4.0 "493.88 493.88 783.99 659.26 523.25 587.33 523.25 440.00"

# メロディを繰り返して30秒のメロディトラックを作成
sox temp/melody1.wav temp/melody2.wav temp/melody1.wav temp/melody2.wav temp/melody1.wav temp/melody2.wav temp/melody1.wav temp/melody2.wav temp/full_melody.wav

# すべてのトラックをミックス
sox -m temp/full_chords.wav temp/full_drums.wav temp/full_melody.wav jpop_song_raw.wav

# 音量調整とエフェクト追加
sox jpop_song_raw.wav jpop_song.wav reverb 50 50 100 100 0 0

# MP3に変換
ffmpeg -i jpop_song.wav -codec:a libmp3lame -qscale:a 2 jpop_rhythm_game.mp3

# 一時ファイルの削除
rm -rf temp

echo "J-POPスタイルの音楽ファイルを作成しました: /home/sence_of_unity/rhythm_game_spec/sample_music/jpop_rhythm_game.mp3"
EOF

chmod +x create_jpop.sh
./create_jpop.sh
 ⋮
 ↳ Purpose: J-POPっぽい1分間の音楽を生成するスクリプトを作成して実行
```

危うく驚き屋になりかけてしまいました。J-POPのコード進行、ドラムセットそれぞれの指定、メロディの作成などをすべてAmazon Q CLIが考えてくれました。生成された音楽はスネアの音が少し邪魔だった（リズムと同期されていなかった）ということもあり、その後何度かAmazon Q CLIに補正の指示をしながら、最終的に１つmp3音源を作成することができました！
それでは、音楽もできたので、仕様書をもとにゲームを作成してもらいましょう。

### いよいよ実装
:::note warn
 今回Pythonのコード作成やエラー対応部分に対する応答はあまり目新しいものはなさそうなため、視認性の問題で省略しています。
:::
``` :プロンプト
> では、音楽も用意できたので、PyGameで仕様書rhythm_game_specification.mdに基づいたリズムゲームをjpop_rhythm_game.mp3で作成してください。
```
``` :Amazon Q CLI
PyGameを使って仕様書に基づいたリズムゲームを作成しますね！jpop_rhythm_game.mp3を使用したゲームのコードを作成します。
(中略)
おおきに！PyGameを使って仕様書に基づいたリズムゲームを作成しました！以下のファイルを作成しましたで：

1. rhythm_game.py - メインのゲームコード
2. run_game.sh - ゲームを簡単に実行するためのスクリプト
3. change_music.py - 使用する音楽ファイルを変更するためのスクリプト
4. README.md - ゲームの説明書

## ゲームの特徴

• **4レーンのリズムゲーム**: D, F, J, Kキーを使って操作
• **判定システム**: PERFECT, GREAT, GOOD, BAD, MISSの5段階判定
• **スコアとコンボ**: 連続成功でコンボが増え、高得点を獲得
• **ランク評価**: プレイ精度に応じてS〜Eのランクを表示
• **効果音**: 判定に応じた効果音を自動生成
• **音楽ファイル**: jpop_rhythm_game.mp3を使用（変更可能）

## 実行方法

ゲームを実行するには、以下のコマンドを使います：

bash
cd /home/sence_of_unity/rhythm_game_spec
./run_game.sh


音楽ファイルを変更したい場合は、以下のコマンドを使います：

bash
cd /home/sence_of_unity/rhythm_game_spec
./change_music.py


## 音楽ファイルについて

デフォルトではjpop_rhythm_game.mp3を使用していますが、先ほど作成した同期の取れたvery_short_jpop.mp3に変更することもできます。change_music.pyを実行して、使用する音楽ファイルを選択してください。

## 注意点

• 初回実行時に効果音ファイルが自動生成されます
• PyGameがインストールされていない場合は、実行スクリプトが自動的にインストールを試みます

ゲームを楽しんでくださいね！何か質問や改善点があれば、お気軽に聞いてください！
```
簡単にできましたね、では作成したものをWindows環境に移動して恐る恐る起動してみましょう。

``` :コマンドプロンプト
 RuntimeWarning: use sndarray: No module named 'numpy'(ModuleNotFoundError: No module named 'numpy')
```
エラーが出てしまいました。
どうやら今回作成したPythonの処理の中に、効果音ファイルを生成するという処理がありそこで「NumPy」モジュールを使用していたようです。NumPyをインストールして再度起動したところエラーは解決しました。その後も環境面での似たようなエラーがいくつか出ましたが、そのたびエラー内容をコピー＆ペーストして、「これを解決して」という雑なプロンプトで、指示されるがままに修正していきました。

## ついに起動！したが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074525/be5d0a1b-7a7f-43f0-9f31-a8f7f1cd50c1.png)
どうやら、日本語が文字化けしていそうです。エンコードが原因なことは明らかですが、ここも

``` :プロンプト
>文字化けしないようにして
```

と雑に修正してもらいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074525/e89f65f9-b669-426e-a90b-f94ac47d12ab.png)

無事なおりました。いよいよ「スペースキー」でスタートしていきます！

### ついに音ゲーが動く！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074525/0be3aaf9-2951-497b-877e-0577b758c99f.png)

ノーツ（細長い四角のオブジェクト）が次々と流れてきました！ ~~まるでbeatmania IIDX（通称弐寺）ですね。~~
最初はかなり苦戦しましたが・・・
慣れないながらタイミングを合わせて必死にキーボードをたたいて、ボロボロになりながらなんとか終了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074525/0afca0d5-43a5-47ff-9a28-7a599df4df2b.png)

最大コンボや、精度もばっちり出してくれています！
現在はおそらくノーツがリズムに同期せずランダム生成されていたり、文字被りなどを起こしてしまったりしていますが、第一歩としてはかなり満足です！

### もう少し良いゲームにしていく
上記の問題も解決させながら、もう少し画面をモダンにさせてみましょう。併せて背景画像も与えてみます。

:::note info
画像はClaudeからHTML形式で生成し、画像に変換しました。
:::

``` :プロンプト
>以下要望に対応した形に修正を加えてください。
- 現在はランダムでノーツを作成しているようなので、音楽に完全に同期してノーツを生成するような仕組みに変更してください。
- リザルト画面で文字被りを起こしているので、全体的に文字の大きさをもう少し整えてください。
- プレイ中・リザルトで、PERFECT,GREAT,GOOD,BAD,MISSそれぞれ文字の色を変えてください。
- 現在は黒背景であまりにも殺風景なので、与えたGIFを背景にしてください。
```
``` :Amazon Q CLI
ご要望に対応して、リズムゲームに以下の修正を加えます：

1. 音楽に同期したノーツ生成システム
2. リザルト画面の文字サイズ調整
3. 判定結果ごとの色分け
4. GIF背景の追加
（中略）
Updating: rhythm_game.py

 ⋮
 ● Completed in 0.2s
要望に対応した修正を行いました。以下の変更点をまとめます：

1. 音楽に同期したノーツ生成:
   • beatmap.json ファイルを作成し、音楽に合わせたノーツデータを定義
   • generate_notes メソッドを修正して、譜面ファイルからノーツを読み込むように変更
   • 譜面ファイルが存在しない場合は、従来のランダム生成にフォールバック

2. 文字サイズの調整:
   • フォントサイズを調整（大: 60px、中: 36px、小: 24px）
   • リザルト画面の判定内訳の間隔を狭めて（40px→30px）文字被りを解消

3. 判定結果の色分け:
   • 判定色の定数を定義（PERFECT_COLOR, GREAT_COLOR など）
   • プレイ中の判定表示に色を適用
   • リザルト画面の判定内訳にも色を適用

4. 背景GIFの設定:
   • 背景画像を読み込む機能を追加
   • タイトル画面、プレイ画面、リザルト画面に背景を表示
   • リザルト画面には半透明のオーバーレイを追加して文字を見やすく
   • Windows環境で実行時に指定されたパスから背景画像をコピーする処理を追加
```
実行してみたところ、譜面が20秒程度で終了し想定通りには実装されなかったため、再度ビート検出の機能について以下のように指示を与えて再修正を試みます。
``` :プロンプト
ノーツは音楽のビートを解析して、時間も併せてノーツを生成するようにしてください。
```
``` :Amazon Q CLI
音楽のビートを解析してノーツを自動生成する機能を実装します。以下の手順で修正を行います。
（中略）
実行方法は以下の通りです：

1. 必要なライブラリをインストールします：
pip install pygame numpy librosa
2. ファイルを実行します：
python rhythm_game_with_beat_detection.py
この実装では、以下の優先順位でノーツが生成されます：
1. beatmap.jsonファイルが存在する場合は、そこからノーツを読み込む
2. librosaを使用して音楽ファイルからビートを検出し、ノーツを生成
3. 上記の方法が失敗した場合は、ランダムにノーツを生成

音楽のビートに合わせたノーツ生成、文字サイズの調整、判定結果の色分け、背景GIFの設定という要望に対応しています。
```

その後も、数回のプロンプトでの修正を重ね、ついに完成です。
BPMを検出し、ノーツを生成してくれるようになりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074525/ad5b4dbd-97fd-4d42-ac61-117e14cc8f51.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074525/2462e04f-72d6-4e0a-a952-7b1344b2eba7.png)

音ありの動画がこちらになります。

https://x.com/__maikeru___/status/1929067338919186863?s=46&t=cHFOTtTv87N-OE6CRu6r0Q

だんだんプレイもうまくなってきましたね。笑
また、ノーツの生成が毎プレイ事にされるのは完全に意図していない（要件定義を詳しくしていない）ものですが、音ゲーとしては新規性があり面白かったです。

## 音ゲーを完全Amazon Q CLI頼みで作成してみて
今回は、完全にAmazon Q CLIとの対話のみを使用して、
- 音ゲーの製作
 
だけでなく

- 音ゲーに使用する音楽の生成

を簡単に実現することができました。初めの一歩としてはかなり良くできたと思います。
一方で、普段プレイしているゲームがいかにすばらしいか、ということも同時に思い知ることができ、とても良い機会になりました。
（障害や不具合が起きても開発者を労いましょう）

### 今後の展開
例えば、今回は試すことができませんでしたが、以下のような改善点を思いついています。

- 音楽の作成はMCPなど通して、もう少し本格的に生成するのがよさそう
- ノーツはテンポだけではなく、メロディに合わせるように実装したほうがよい
- 押したキーは光るようにしておいたほうが、ゲームとして見た目が良い
- JSONで譜面ファイルを指定できるようにもなっていますが、譜面はやはり音ゲーの「魂」の部分なので、人間が意図をもって手動で作るほうが面白いはず

そのほかにも、最近ターミナルでの画像入力をサポートされたため、これを生かせばもっとグラフィカルなゲームを作ることもできそうです。
例えばノーツをAWSのサービスのアイコンにしたりしてみても面白いかもしれないですね。
これからもたくさんAmazon Q CLIで遊んでいきたいと思います。

https://aws.amazon.com/jp/blogs/news/amazon-q-developer-cli-supports-image-inputs-in-your-terminal/


皆様、くれぐれもTシャツの申請をお忘れなく。

以上、お読みいただきありがとうございました。