Amazon Q CLIでPyGameを使ったゲームを作ってみた

最近Amazon Qを使ってゲームを作成したらTシャツをゲットするキャンペーンをやっているようです。

aws.amazon.com

結構TLでもAmazon Qを使っている人たちがたくさんいますが、僕は他のAIエージェントを使っていたこともあってAmazon Qをわざわざ触るメリットが無いかなーと思って触っていなかったです。

ですが、TシャツにつられてAmazon Q CLIだけでゲームを作成してみることにしましたw

今回作ったゲーム

今回はAWSアーキテクチャアイコンを使ったツムツム風のゲームを作ってみました。

その昔新卒時代に働いてた会社ではツムツムのようなパズルRPGの開発に携わっていました。(今はそのゲームはサービス終了しています…)

なので、その頃のことを思い出して懐かしくなったのとこれまでPythonを結構触っていましたが、一度もPyGameで自分でゲームを作成したことなかったのでAIのちからを使って自分だけのゲームを作ってみようと思ったのがモチベーションだったりしています。

事前準備

まずはAWSアーキテクチャアイコンを用意します。

本当はそこからAIで用意すべきな気もしますが、さすがに膨大なAWSのアイコンを取得させるのは負荷がおもすぎる気がするのであくまでアセットとして用意することにしました。

AWSのアイコンは以下のリンクにアクセスします。

aws.amazon.com

リンク先ページ「開始方法」のプルダウンからアイコンパッケージをダウンロードします。

ダウンロードしたzipファイルを展開したらサービスアイコンのディレクトリ名を arch_icons に変更してプロジェクトディレクトリに配置します。

そして、今回の主役であるAmazon Q CLIをパソコンにインストールします。

以下のリンクからお使いのOSに合わせてCLIをインストールします(正直今回大事なところはここw)

docs.aws.amazon.com

あとは今回はPyGameを使うので以下のコマンドでインストールします。

pip install pygame

これで準備は完了です。

実装

ここからは実装です。

試しに「AWSアーキテクチャアイコンを使ってディズニーツムツムのようなゲームをつくってください。制限時間内に3個以上のアイコンが揃ったら削除し、制限時間内で削除したアイコンのサービス名を一覧で表示するようにしてください」とプロンプトを叩いた結果が以下のポストの動画です。

雑に投げたのにそれっぽい完成度になりました!ただ、見ての通り縦に2つ消したときに一つしか隙間が埋まってなかったり、ちょこちょこバグがありました。

ただ、それも気になったバグを逐一報告していくと都度修正してくれるし、もちろんUIの修正も細かくやってくれました。

そして、動画をご覧いただくとお分かりいただけるかと思いますが、隣合わせのブロックをいちいちクリックしないといけないのはツムツムらしさがまるでないのでツムツムのように連鎖的に消去する改修にも対応してくれて、本当にAmazon Qだけで全部実装を簡潔することができてしまってびっくりしました!

こんな感じでどんな修正をしたかを毎回リッチなUIこんな感じで丁寧に説明してくれるのも良かったです

### 1. 連鎖選択機能の追加

chain_select という新しいメソッドを追加し、選択したアイコンと同じ種類のアイコンを周囲から自動的に選択するようにしました
:

python

   def chain_select(self, row, col, service_name):
        # 上下左右斜めの8方向をチェック
        directions = [
            (-1, -1), (-1, 0), (-1, 1),
            (0, -1),           (0, 1),
            (1, -1),  (1, 0),  (1, 1)
        ]
        
        for dr, dc in directions:
            new_row, new_col = row + dr, col + dc
            
            # グリッド内かチェック
            if 0 <= new_row < self.grid_size and 0 <= new_col < self.grid_size:
                neighbor = self.grid[new_row][new_col]
                
                # 隣接アイコンが同じタイプで、まだ選択されておらず、マッチしていない場合
                if (neighbor and 
                    neighbor.service_name == service_name and 
                    not neighbor.selected and 
                    not neighbor.matched):
                    
                    # 選択状態にする
                    neighbor.selected = True
                    self.selected_icons.append(neighbor)
                    
                    # 再帰的に連鎖選択を続ける
                    self.chain_select(new_row, new_col, service_name)
    

### 2. select_icon メソッドの改良

select_icon メソッドを改良して、アイコンを選択した後に連鎖選択を行うようにしました:

python

def select_icon(self, row, col):
    icon = self.grid[row][col]
    # If icon is already selected, deselect it
    if icon.selected:
        icon.selected = False
        if icon in self.selected_icons:
            self.selected_icons.remove(icon)
        return
    
    # Check if the icon is the same type as already selected icons
    if self.selected_icons and icon.service_name != self.selected_icons[0].service_name:
        return
    
    # 連鎖選択のために、すでに選択されているアイコンに隣接しているか確認
    can_select = not self.selected_icons  # 最初の選択は常に可能
    
    if self.selected_icons:
        # 隣接チェック
        for selected_icon in self.selected_icons:
            # 選択済みアイコンの位置を探す
            for r in range(self.grid_size):
                for c in range(self.grid_size):
                    if self.grid[r][c] == selected_icon:
                        # 隣接しているか確認(上下左右斜め)
                        if abs(row - r) <= 1 and abs(col - c) <= 1:
                            can_select = True
                            break
                if can_select:
                    break
    
    if can_select:
        icon.selected = True
        self.selected_icons.append(icon)
    
        # 連鎖的に周囲の同じタイプのアイコンを自動選択
        self.chain_select(row, col, icon.service_name)
    
        # If we have enough selected icons, match them
        if len(self.selected_icons) >= self.match_min:
            self.match_selected_icons()


### 主な変更点

1. 連鎖選択の実装: 選択したアイコンの周囲8方向(上下左右斜め)に同じ種類のアイコンがあれば、自動的に選択します。
2. 再帰的な連鎖: 連鎖選択は再帰的に行われるため、連続して同じ種類のアイコンが並んでいる場合、すべて選択されます。
3. 選択条件の調整: 最初のアイコン選択は常に可能で、2つ目以降は隣接しているかつ同じ種類のアイコンのみ選択可能です。

### ゲームプレイへの影響

この変更により、ゲームプレイが以下のように変わります:

1. より簡単な操作: プレイヤーは1つのアイコンをクリックするだけで、周囲の同じ種類のアイコンがすべて選択されます。
2. より大きなコンボ: 同じ種類のアイコンが多く隣接している場合、一度に多くのアイコンを消すことができます。
3. 戦略性の向上: プレイヤーは同じ種類のアイコンを隣接させるように移動させる戦略を考えるようになります。

完成品

何度もCLIと会話をしたことでだいぶ完成度高めのゲームが出来上がりました!

それなりに難易度高かったので簡単な難易度調整も入れました(最小で消せるブロックの数や画面上のブロックの数)

まとめ

今回はAmazon Qを使ってPyGameを使ったゲームを作成してみました。

学生時代にPyGameでゲームのロジックを組むのが難しくて断念していたのですが、Amazon Qを通じて思ってたよりも細かいUI操作ができることに気づけてそれは挫折しても仕方ないと思えてしまいましたw。

何よりAmazon QはAWSのサービスに特化したツールだと思っていましたが、それとは関係ないコーディングにも対応しているうえに1円も課金せずにここまで作ってしまうのは恐ろしいと思いましたw。(そのうち制限が掛かりそう)

後日談

あれから今回作成したゲームでキャンペーンに応募したところ、無事にTシャツをゲットしました!

応募してから大体1週間ぐらいで審査が通り、更にもう1週間ぐらいで配送手配してもらい思ってたよりもスピーディーに対応してもらえた印象です。(配送業者の提示してた配送予定日より1日遅れたけど、AWSさんは関係ないw)