0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

#184 非エンジニアも使えるゲーム開発の仕組みをAI+Github Actionsで作ってみた

0
Posted at

はじめに

先日、知人たちとボードゲームを遊ぶ機会がありました。
そのゲームが盛り上がりまたやりたいという話が出たのですが、そのゲームの流通量は少なく、また対面でのプレイとなると遊べる機会も限られます。
そこで今回は、非エンジニアの知人グループが気軽にオンラインボードゲームを自作できるようなプラットフォームを開発してみました。

具体的には以下のような仕組みです:

  1. ユーザーがブラウザ上でゲームのアイデアを投稿
  2. GitHub Actions 経由で Claude Code が自動起動
  3. AI がゲームロジックを実装し、PR を作成
  4. 検証環境で検証 → 承認で本番反映

非エンジニアが使えるよう、GitHub やコードといった技術的な要素を全て隠蔽しています。

全体構成

レイヤー 技術
フロントエンド React + Vite + Tailwind CSS
フロントエンド ホスティング Cloudflare Pages
バックエンド Cloudflare Workers + Hono
データベース Supabase PostgreSQL
リアルタイム通信 Supabase Realtime
認証 Supabase Authentication
CI/CD GitHub Actions
AI 実装 Claude Code

Cloudflare と Supabase はどちらも無料枠が充実しているため、個人プロジェクトでも継続運用しやすい構成です。

認証に Supabase Authentication を採用したのは、Supabase Realtime
との親和性が高いためです。同じクライアントでリアルタイム通信と認証を扱えるため、実装がシンプルになります。

運用フロー

ユーザー視点のフロー

1. ブラウザでゲームのアイデアを投稿
2. しばらく待つと「検証できます」と通知が届く
3. 検証環境でゲームをプレイ・検証
4. 承認 or コメントをつけて差戻
5. 承認すると本番環境に反映、差戻すると2に戻る

内部で起きていること

ユーザーがゲーム要望を投稿
  ↓ API が GitHub Issue を自動作成 + wip ラベル付与
  ↓ GitHub Actions で Claude Code が起動
  ↓ AI がゲーム定義を実装 → ブランチ作成 → PR 作成
  ↓ 検証環境に自動デプロイ
  ↓ 検証 URL を Issue コメントに通知 → UI に表示
ユーザーがプレイ・検証
  ↓ 「承認」→ API が PR をマージ → 本番デプロイ
  ↓ 「差し戻し」→ Issue にコメント追加 → Claude Code 再実行

デプロイフロー

3 つの GitHub Actions ワークフローで自動化しています。

1. implement.yml(実装)

Issue に wip ラベルが付くと Claude Code が起動します。

on:
  issues:
    types: [opened, labeled]

jobs:
  implement-game:
    runs-on: ubuntu-latest
    if: |
      (github.event.action == 'opened' &&
      contains(github.event.issue.labels.*.name, 'wip')) ||
      (github.event.action == 'labeled' && github.event.label.name == 'wip')
    steps:
      - name: Run Claude Code
        uses: anthropics/claude-code-action@beta
        with:
          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
          direct_prompt: |
            ## タスク
            1. Issueから要望を解析
            2. 実装
            3. ブランチを作成してコミット・プッシュ
            4. PRを作成

Claude Code Max プラン(OAuth 認証)を使用しているため、API キーではなく
claude_code_oauth_token を指定しています。

Note: OAuth トークンは Claude Code の Max プラン契約が必要です。取得方法は公式ドキュメントを参照してください。

2. preview.yml(検証環境)

PR が作成・更新されると自動で検証環境にデプロイされます。

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  deploy-preview:
    runs-on: ubuntu-latest
    steps:
      # API を Cloudflare Workers にデプロイ
      - name: Deploy API to Preview
        run: wrangler deploy --env preview

      # フロントエンドを Cloudflare Pages にデプロイ
      - name: Deploy to Cloudflare Pages
        uses: cloudflare/pages-action@v1

      - name: Update Issue
        # review ラベルを付与

3. production.yml(本番環境)

PR がマージされると本番環境にデプロイされます。

on:
  push:
    branches: [main]

jobs:
  deploy-production:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy API
        run: wrangler deploy

      - name: Update Issue
        # done ラベルを付与して Issue をクローズ

ラベルによる状態管理

Issue のラベルで受け付けたアイデアの状態を管理しています。

ラベル 状態 トリガー
wip 開発中 ユーザーがアイデアを投稿 or 検証で差戻
review 検証待ち Claude Codeによる実装完了 & 検証環境デプロイ完了
done 完了 ユーザーが承認 & 本番デプロイ完了

Issueの作成やラベルの更新は、Web UIから叩いたAPIやGithub Actionsを通して実行されます。

リアルタイム同期

複数人でゲームをプレイするため、リアルタイム同期が必要でした。

Cloudflare Workers 単体で WebSocket を実装する場合、Durable Objects が必要になります。しかし
Durable Objects は無料枠がかなり厳しいため、Supabase Realtime を採用しました。

supabase
  .channel(`game_states:session_id=eq.${sessionId}`)
  .on('postgres_changes',
    { event: '*', schema: 'public', table: 'game_states' },
    (payload) => {
      // 他プレイヤーの操作をリアルタイム反映
    }
  )
  .subscribe();

Supabase Realtime は PostgreSQL の変更を WebSocket で配信してくれる機能で、無料枠に含まれています。

設計判断のポイント

招待制によるアクセス制限

ユーザー操作をトリガーに Claude Code や GitHub Actions が起動する仕組みのため、以下のリスクがあります:

  • 悪意あるプロンプトによる意図しない操作
  • API 使用量の急増によるコスト増加
  • GitHub Actions の実行時間制限の消費

そこで招待リンク経由でのみログイン可能な構成にし、信頼できるユーザーのみに利用を制限しています。

検証環境の活用

検証環境へのデプロイまでをAIによる自動作業、本番環境へのデプロイを人間による承認必須とすることで、ほとんどAIと非エンジニアによる運用想定ながら、本番環境は安全な状態を維持できるようにしています。

ランニングコストの抑制

このプラットフォームの運用にかかる費用は以下です:

  • Claude Code: 月額固定(もともと契約していたもの)
  • ドメイン: Cloudflare 経由で購入(年間数ドル)

それ以外は身内での利用なら無料枠に十分収まります:

  • Cloudflare Workers / Pages
  • Supabase
  • GitHub Actions

使ってみた感想

実際にこのプラットフォームからゲームを実装してみた所感です。

難しくないルールのゲーム(独自のボードやコマがいらないもの、トランプゲーム等)であれば、動くところまでは割とすんなりいけます。ただし演出や UI の作り込みは苦手な印象でした。「分かりやすいUI」「気持ちいいアニメーション」といった正解が明確でない領域は、AI にとってまだ難しいようです。

そのため、ユーザーが満足するレベルまで仕上げようとすると、どうしてもフィードバックの回数が多くなります。当初の目論見であった「Webフォーム経由で非エンジニアが自由に機能拡張していく」という使い方は、できなくはないものの時間がかかりすぎる印象でした。本格的な実用ラインにはまだ届いていないと感じています。

プロトタイピングとしては十分使えますが、クオリティを上げるのであれば、最初にしっかりしたエンジンやテンプレートツールを作っておくか、AIの性能向上を待つことになりそうです。

以上です。
最後まで読んでいただきありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?