🎮

Q Developerで「AWSツヨツヨ」を作ってみた

に公開

Tシャツ👕欲しいぞ!ということで、「ぷ*ぷ*」ならぬ「AWSツヨツヨ」というゲームを作ってみました。
最近はAmazon Q Developerのお世話になりまくりですが、なんだかんだで後回しにしてしまっていたので、みんなで集まってゲーム作りをするきっかけを作ってくれたJAWS-UG横浜には感謝しかありません。

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

https://jawsug-yokohama.connpass.com/event/355243/

AWSツヨツヨ

動画を見ていただくのが早いと思いますが、「ぷ*ぷ*」の"ぷよ"?をAWSのアーキテクチャアイコンに変えただけの落ちゲーです。

https://www.youtube.com/watch?v=uycxqQgae3w

自分は難し過ぎて初心者🔰モードをプレイするのがやっとですが、ソースはGitHubで公開していますので、AWSツヨツヨな人は是非上級者モードで遊んでみてください。

https://github.com/p0n/aws-tsuyo-tsuyo

初回生成物

マルチターンで作っていくつもりなので、最初に与えるプロンプトはシンプルにしました。
uvを使うよう指示したのはちょっとしたこだわりです。また、明示的にuv initするよう指示したのは、何も支持しないと少し古い内容のuv init後の構成物を生成したことがあるからです。パッケージのバージョンなどは学習時から更新されていくので、止むを得ないところかと思います。

PyGameを使用して、ぷよぷよ風のシンプルなゲームを作ってください。
ぷよぷよの画像の代わりにAWSのアーキテクチャアイコンを使用してください。
プレイヤーのレベル別に、使用するアイコンの数を変更したいです。

  • 初心者はランダムな4種類
  • 中級者はランダムな6種類
  • 上級者はランダムな20種類

パッケージと仮想環境の管理にはuvを使用してください。
uv initを実行して作業を開始してください。

これだけの指示でも、ほぼ完成に近いものを生成してくれました。

AWSのアイコンへのアクセスが制限されているようです。代わりにダミーのアイコンを作成しましょう。

ということで、なにやらスクリプトを書いて、アイコンの代わりになる画像ファイルも生成してくれました。

Initial Outpu

早速プレイして見つけた主な問題点と改善点は次の通りです。

  • プレイ開始時にレベルを聞いてくれない
  • 日本語と思われる箇所が文字化けしている(日本語フォントが使用されていない?)
  • 途中で一時停止したい(指示してなかった)
  • "ぷよ"がちぎれて落ちない(テトリスみたいに空間ができる)
  • 連鎖時に一気に消えてしまう
  • アーキテクチャアイコンの代わりの画像ファイルがイケテナイ
  • 背景が殺風景
  • BGMが欲しい

手を出さずにできた修正

ひとつづつ問題点を直してもらいましょう。

プレイ開始時にレベルを聞いてくれない

ゲーム開始時にレベルを選択するようにして

これだけで直りました。ゲーム中にレベルを変更する機能も勝手に追加してくれました。

日本語と思われる箇所が文字化けしている(日本語フォントが使用されていない?)

日本語が文字化けしているようです。PyGamesで使用するフォントをNoto Sans JPに変更できますか?

これの対応はちょっと興味深く、

Noto Sans JPフォントをダウンロードするスクリプトを作成します

という形で、フォントを取得するスクリプトを書いてくれたのですが、ダウンロードに失敗していました。また、あらかじめダウンロードしておいたフォントを使うのではなく、毎回DLするようにコードが修正されて、毎回失敗するせいでエラーメッセージが出力されていました。

Error downloading font: 404 Client Error: Not Found for url: https://github.com/notofonts/noto-cjk/raw/main/Sans/OTF/Japanese/NotoSansJP-Regular.otf
Using system default font instead

ちなみに、フォントのダウンロードに失敗するとOSのデフォルト日本語フォントを使用するようなフォールバックが追加されていて、MacとWindowsを意識したコードが書かれていました。おバカなのか賢いのかw

def get_font(size):
    # Noto Sans JPフォントをダウンロード
    font_path = download_noto_sans_jp()
    
    try:
        if font_path and os.path.exists(font_path):
            return pygame.font.Font(font_path, size)
    except:
        pass
    
    # ダウンロードに失敗した場合や読み込みエラーの場合はシステムフォントを使用
    try:
        # macOSの日本語フォント
        return pygame.font.Font("/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc", size)
    except:
        try:
            # Windowsの日本語フォント
            return pygame.font.Font("C:\\Windows\\Fonts\\msgothic.ttc", size)
        except:
            # それでもダメならデフォルトフォント
            return pygame.font.SysFont(None, size)

これは次のように指示すると直してくれました。

Noto Sans JPのダウンロードに毎回失敗しているので、使用するのをやめます。OSのデフォルト日本語フォントを使用します。

JP Font

途中で一時停止したい

ゲーム中にPボタンを押すと、Pauseできるようにして

だけで機能追加完了!

"ぷよ"がちぎれて落ちない

「ぷよぷよ」の「ぷよ」がちぎれないのですが、落ちてきた「ぷよ」の下に空間がある場合は、「ぷよ」が分離して落ちるようにできない?

と指示するだけでと、"ぷよ"がちぎれるようにはなりました。

連鎖時に一気に消えてしまう

せっかく連鎖を作っても、一気にまとめて消えてしまうので

連鎖的に消えるときに、一度にすべて消えてしまうので、段階的に消えるようにできない?

と指示したところ

連鎖的に消える際に段階的に消えるようにするため、アニメーション効果を追加しましょう。現在は一度にすべて消えてしまうので、連鎖ごとに少し間を空けて消えるように修正します。

ということで、段階的に消えるように修正してくれたのですが、バグを作っちゃったようで4つくっついても消えなくなってしまいました。

同じ種類の「ぷよ」が4つくっついても消えなくなってしまいました。バグを修正できますか?

と指示すると、

コードを確認したところ、バグの原因を特定しました。アニメーション状態の処理に問題があります。
check_chains メソッドで連鎖を見つけた後、vanishing_puyos リストに追加していますが、実際に消去する処理が正しく動作していないようです。
 ぷよを消す処理に範囲チェックを追加して、配列の範囲外アクセスを防止します

と問題点を見つけて、修正してくれました。これはスゴイ!

手を出しちゃった修正

アーキテクチャアイコンの代わりの画像ファイルがイケテナイ

アーキテクチャアイコンの取得に失敗しているだけに見えたので粘ればチャットだけでも修正できたような気がしますが、時間をかけたくなかったので、AWSのサイトからアイコンをダウンロードしてきてアセットフォルダに展開してから、次のように指示しました。

AWSアイコンが Architecture-Service-Icons_02072025 フォルダ以下にあります。この中からランダムに20種類を選んで、 assets にあるアイコンファイルを更新してください。

その後は、

Architecture-Service-Iconsフォルダ内のファイル構造を確認します
フォルダ内のPNGファイルを確認します
48x48サイズのアイコンを確認します
64x64サイズのアイコンを確認します

のように、内容物を自律的に調査し、リサイズ用のスクリプトを生成して作成済みの画像を置き換えてくれました。

背景が殺風景

Nova Canvasで生成した画像をアセットフォルダに配置して、

Please use asset/bg.jpg as a background.

のように指示すると、画面サイズに合わせてリサイズをして背景画像を設定してくれました。リサイズはアスペクト比が維持されず少し縦長になりましたが、

背景画像の上にゲームエリアを半透明で表示し、見やすくします

と、支持しなくても背景画像が隠れないようゲームエリアを半透明にしてくれました。スゴイぞQ!

BGMが欲しい

せっかくなのでBGMも追加してみました。BGMはUdioで生成しました。手元でループ時に違和感が少ない位置でカットしたmp3をアセットフォルダに置いて、

BGMに assets/bgm.mp3 を使って。Sボタンでミュート・アンミュートを切り替えられるようにして。

と指示するだけでOK。

Final

感想

全体としてQ Developerは、うまくいかない場合に複雑な代替案を実行したり、指示されたことを行った結果として次に起きそうな問題に先回りして対処したりと、高度な自律的判断をしている点が印象に残りました。
また、見つけた問題があっという間に修正され、アイデアが次々と実現していく様にワクワクしっぱなしでした。大きく複雑なコードベースでどれくらいお任せできるかはまだ未知数ですが、価値検証のようなフェーズではとても役に立つと思います。Figmaやペーパーモックなどを使ったプロトタイピングは、実際に動くものに置き換えられていくのかもしれませんね。
今回試した範囲ではQは安定していて、VSCodeのチャットウィンドウを使用して作業するとdiffも確認できるので不安を感じることはなかったのですが、こまめにコミットしていつでも戻せるようにしておくのが良いと思います。
細かいことをいうと、READMEなどもいい感じに生成してくれるのですが、ざっと確認したところuvの使い方の説明や、uvの定義ファイルには誤りがありました。学習データは大半がpipを使用していると思うので、これもそのうち改善されるような気がします。

Discussion