Amazon Q CLIでEカード風ゲームを作ってみた

# はじめに
本記事はAWS主催の「Amazon Q CLI でゲームを作ろう」キャンペーンで作成したゲームです。

https://community.aws/content/2xIoduO0xhkhUApQpVUIqBFGmAc/build-games-with-amazon-q-cli-and-score-a-t-shirt

期間限定でTシャツがもらえるとのことなので、Amazon Q CLIを使って、漫画『賭博黙示録カイジ』に登場するEカードゲームをPygameで作成してみました。プロンプト1発で7〜8割完成するAIの威力に驚愕した体験をシェアします。

# 作成したゲームについて

## Eカードとは？

https://dic.pixiv.net/a/E%E3%82%AB%E3%83%BC%E3%83%89

今回は漫画『賭博黙示録カイジ』に登場する2人対戦用のカードゲームEカードをモチーフにしたゲームを作ってもらいました。

**基本ルール：**
- プレイヤーは「皇帝側」または「奴隷側」に分かれる
- 皇帝側：皇帝1枚 + 市民4枚
- 奴隷側：奴隷1枚 + 市民4枚
- 勝敗関係：皇帝 > 市民 > 奴隷 > 皇帝
- **どちらかが勝利した時点でゲーム終了**（市民vs市民の場合のみドロー）

# 開発環境の準備

## Amazon Q CLIのインストール

公式ドキュメント通りにインストール

https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-installing.html

![ecard1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/f6137428-4230-4fea-80ad-9086fdaca975.png)

## Pygameのインストール
```bash
# 作業フォルダでPython仮想環境を構築
python -m venv .venv
source .venv/bin/activate
pip install pygame
```

## チャット起動
早速`q chat`コマンドでQ CLIを起動してみた。
Q CLIではもうClaude Sonnet 4が選択できるようなのでモデル変更しました。

```bash
% q chat

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

╭─────────────────────────────── Did you know? ────────────────────────────────╮
│                                                                              │
│      Set a default model by running q settings chat.defaultModel MODEL.      │
│                          Run /model to learn more.                           │
│                                                                              │
╰──────────────────────────────────────────────────────────────────────────────╯

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

> /model

✔ Select a model for this chat session · claude-4-sonnet

 Using claude-4-sonnet

>
```

# 開発過程

## プロンプト1回目：基本ゲーム作成
早速Q CLIとチャットを開始してゲームを作成していく。

```
> あなたはpygameでのゲーム開発に精通しているプロのPythonエンジニアです。今回は漫画『賭博黙示録カイジ』
に登場する2人対戦用のカードゲーム「Eカード」をモチーフにしたカードゲームアプリをpygameで作成してください。
ルールはEカードと同じでお願いします。

---

# 回答
Eカードゲームをpygameで作成しますね。まず、Eカードのルールを確認して、完全なゲームアプリケーションを作成し
ます。

🛠️  Using tool: fs_write
 ⋮
```

**結果：** なんと1発で7〜8割完成！
- 基本的なゲームループ
- カード選択UI
- 勝敗判定ロジック
- プレイヤー情報表示

以下のソースコードが生成された

https://github.com/bamtech1904/amazon-q-ecard/blob/main/ecard_game.py

ただし、文字化けが発生...
![ecard2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/326c66c2-600a-42d3-a00f-101ea50284e8.png)


### プロンプト2回目：文字化け対応
フォントが正常に読み込めてないので修正するように依頼してみる。
なんと、フォントが読み込めない場合は英語で表示するようなフォールバック処理も作ってくれた。

```
> ゲームを起動してみましたが、文字化けが発生して正常に文字が表示されないようです。文字が表示されるように改良をお願いし
ます。

---
# 回答
文字化けの問題を解決するため、日本語フォントを適切に読み込むように改良します。macOSで利用可能な日本語フォントを使用す
るようにコードを修正しますね。
...
```

**改良点：**
- 日本語フォント自動検出機能
- フォールバック処理の実装
- 英語版も同時作成

![ecard3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/f1a84ffd-ef09-41d3-8db0-f27e73166958.png)

![ecard4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/1605e18a-85c0-49f4-8600-c79ecf6cdc2b.png)

![ecard5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/854976a7-3236-4a0d-9d15-14c14e054219.png)

修正版ソース

https://github.com/bamtech1904/amazon-q-ecard/blob/main/ecard_game_correct.py

フォールバック用の英語版ソース

https://github.com/bamtech1904/amazon-q-ecard/blob/main/ecard_game_en.py

### プロンプト3回目：ルール修正
Eカードは奴隷側と皇帝側でプレイヤーを分けるのだが、現状は両プレイヤーが奴隷カードと皇帝カードの両方を選べる状態になっている。

より原作に忠実にするために皇帝と奴隷を分けるようにさらに改良を依頼してみる。

```
> Eカードではプレイヤーは皇帝側、奴隷側に分かれるルールとなっています。でも今の状態だとプレイヤーは皇帝と奴隷のどちらも選択できる状態になっています。Eカードでは「皇帝側は皇帝のカード1枚と市民のカード4枚」「奴隷側は奴隷のカード1枚と市民のカード4枚」を持ってゲームを開始します。そして使ったカードはもう使えなくなるというルールもあります。以上を踏まえてより原作に忠実なルールとなるように改良をお願いします。

---
# 回答
おっしゃる通りです！現在の実装は原作のEカードのルールと異なっていました。正しいEカードのルールに従って、プレイヤーが皇
帝側か奴隷側かを選択し、それぞれが専用のカードセットを持つように改良します。
...
```

**改良点：**
- サイド選択システム追加
- 正しいカード配布（皇帝側：皇帝1+市民4、奴隷側：奴隷1+市民4）
- カード残数表示
- より戦略的なAI

皇帝側と奴隷側を選択できるようになった。
![ecard6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/8e6d7977-841b-4303-9ebc-2f9746a5e649.png)

皇帝側を選択してみると、カードも枚数分選択できるように
![ecard7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/37801119-5791-42b1-b23f-d03ac8e1111c.png)
![ecard8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/64b71d37-9bcc-490e-9aeb-d0bc7ea32f8a.png)

ちゃんと枚数も減っている
![ecard9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/790b9b47-c037-4976-9931-b934adb2d117.png)


### プロンプト4回目：更なるルール改良
だいぶ改良されてきたが、どちらかが勝利した後もゲームが続行されるようになっている。
さらに別のゲームである「限定じゃんけん」のルールを引きずってるのか、星数を競うという独自ルールが追加されている。

![ecard10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/926c12b7-5146-421f-b3a9-9ca4c2774625.png)

より原作のゲームルールに忠実にするために、星数ルール撤廃と、どちらかが1回でも勝った時点でゲーム終了となるように改良をしてもらう。

```
> だいぶ原作に忠実になってきました。しかし、どちらかのプレイヤーが勝利した後も、Eカードが続いてしまいます。より原作に忠実にするなら、両者とも市民のカードを出した場合はドローとなり、残りのカードから再び1枚ずつ出すというのは現状で良いのですが、どちらかが勝ち、勝負がついた時点で終了となるようにして欲しいです。なので「全カードを使い切るまで」というルールと「星数の多いプレイヤーが勝利」というルールは無くして、単純にどちらかが一回でも勝った時点でゲーム終了となるように改良
をお願いします。

---
# 回答
おっしゃる通りです！原作のEカードでは、どちらかが勝利した時点でゲーム終了となります。ドロー（市民vs市民）の場合のみ続

...
```

**最終調整：**
- 星数システム削除
- 即座ゲーム終了ルール実装
- ドロー時のみ続行

というわけで完成した

サイド選択画面
![ecard11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/96d65c48-4b0f-4e24-8d11-665631aa8fb5.png)

ゲームプレイ画面
![ecard12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/d3c9ed38-7ebf-49ef-8cd8-d2520dbc8302.png)

勝利画面
![ecard13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/a122b48d-74a2-48c8-8184-004e137a8018.png)


最終的なソースコード

https://github.com/bamtech1904/amazon-q-ecard/blob/main/ecard_game_final.py

## 完成したゲームの特徴

### 🎮 ゲーム機能
- **サイド選択システム**：皇帝側/奴隷側の選択
- **戦略的カード管理**：使用済みカードは二度と使えない
- **リアルタイム情報表示**：残りカード数、サイド表示
- **原作準拠ルール**：勝者決定時点で即ゲーム終了

### 🧠 AI戦略
- 皇帝側：30%の確率で皇帝カード使用
- 奴隷側：40%の確率で奴隷カード使用
- 基本は市民カードで安全策

### 🎨 UI/UX
- 直感的なカード選択
- 日本語フォント対応
- カード残数の視覚的表示
- サイド情報の明確な表示

## 技術的なポイント

### 日本語フォント対応
```python
def get_japanese_font(size: int):
    """日本語対応フォントを取得"""
    font_paths = [
        "/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc",
        "/System/Library/Fonts/Hiragino Sans GB.ttc",
        "/Library/Fonts/Arial Unicode MS.ttf",
        "/System/Library/Fonts/AppleGothic.ttf",
    ]

    for font_path in font_paths:
        if os.path.exists(font_path):
            try:
                return pygame.font.Font(font_path, size)
            except:
                continue

    # フォールバック処理
    try:
        return pygame.font.SysFont("hiragino sans", size)
    except:
        return pygame.font.Font(None, size)
```

### カード管理システム
```python
def set_side(self, side: PlayerSide):
    """プレイヤーのサイドを設定し、対応するカードセットを配布"""
    self.side = side
    if side == PlayerSide.EMPEROR_SIDE:
        # 皇帝側：皇帝1枚 + 市民4枚
        self.cards = [CardType.EMPEROR] + [CardType.CITIZEN] * 4
    else:  # SLAVE_SIDE
        # 奴隷側：奴隷1枚 + 市民4枚
        self.cards = [CardType.SLAVE] + [CardType.CITIZEN] * 4
```

Amazon Q CLIの書いてくれたコードは、下記リポジトリで公開しています。
READMEやLICENSEなどもついでにQ CLIで作ってもらいました。



## Amazon Q CLIを使ってみた感想

### 👍 良かった点
- **驚異的な初期完成度**：プロンプト1発で7〜8割完成
- **段階的改良が容易**：具体的な要求に対して的確な修正
- **新ファイル作成方式**：変更履歴が追いやすい
- **Claude 4 Sonnetが利用可能**：高品質なコード生成

### 👎 改善点
- **変更内容の説明不足**：何を改良したかの文章説明が少ない
- **ファイル管理**：毎回新ファイル作成は場合によっては煩雑

## まとめ

Amazon Q CLIを使って、わずか1時間程度で原作に忠実なEカードゲームを作成できました。特に印象的だったのは：

1. **初期プロンプトの威力**：雑なプロンプト1つで大部分が完成
2. **段階的改良の精度**：具体的な要求に対する的確な対応
3. **技術的課題の解決力**：文字化け問題なども適切に対処

AIを活用したゲーム開発の可能性を実感できる体験でした。特に、プロトタイプ作成や学習目的でのゲーム開発には非常に有効だと思います。