はじめに
皆さんは1/8192という素晴らしいゲームを知っていますか?
これは単純に1/2を当てていき、1/8192まで到達したらクリアという非常にシンプルなゲームです。
これがYoutubeの実況者などの間で結構流行っていて、とてもおもしろいコンセプトで素晴らしいと感じたので、自分も似たようなゲームをwebで誰でも遊べるものを作ってみようと思いました。
ちなみに私はこういうシンプルかつエレガントなアイデアを形にしているゲーム大好きです
8番出口とか、ジオゲッサー、スイカゲームとか
作ったアプリ
コードはOSS(オープンソースソフトウェア)として公開して、誰でも気軽に機能改善、編集などを行えるようにしたいと考えたのですが、ゲームという性質からコードの中身が見えてしまうと仕組みなどがすべてわかってしまうので、ゲームを純粋に遊ぶ人のことやセキュリティ面などを考慮してプライベートリポジトリとして開発しています。
とはいえ、機能改善だったり一緒に開発したいという方がいれば大歓迎なので、その際はX(Twitter)などで気軽にご連絡ください。
機能としては非常にシンプルで赤か緑の宝箱の前でAボタンを押すことで、1/2の判定が走り、正解したらスコアが伸びていきます。

ログイン機能も実装しており、ユーザー登録やユーザーの編集機能もあります。
これはまだ未実装の機能ですが、ユーザーのスコアランキングもこれから実装していきます
使用技術
私はNext.jsが好きなので、Next.js 14 App Routerを使用することにしました。
以前個人開発でNext.js 13を使用してフリマサイトを作成していたのですが、その際認証機能の実装が非常に面倒でした。
Googleログイン機能の実装、ログインしているユーザーしか見られないページの実装、ユーザー編集ページはログインしているユーザーが編集しているユーザーと一致している場合のみ編集を許可するなど、「よーし、こんないいアイデア思いついたからアプリを個人開発してみよう!」となった場合にここらへんの仕組みから作っていくのはめんどくさいしテンションも上がりません。
そこで、t3-stackという非常に便利なテンプレートのようなものを見つけたので、これを使用することにしました。
What is t3-stack?
T3 Stackとはsimplicity(簡潔さ)、modularity(モジュール性)、full-stack type safety(フルスタックの型安全)を追求した思想に焦点を当てています。
使い方としては以下のコマンドをCLI実行するだけで対話式でアプリケーションに必要なライブラリ等がインストールできる形になっています
自分は以下のような技術を使用しました。
- Next.js 14 App Router
- tanstack query
- trpc
- prisma
- zod
- shadcn/ui
- tailwind
- cloudinary
- react hook form
- vitest
- Supabase
- pnpm
- Bun
- Google Analytics
- Google Cloud
- vercel
pnpmでパッケージ管理して、BunはGitHub ActionでのCI実行時のみに使用しています。
コマンドを実行しただけでもうすでに認証機能やtrpcを使用するための複雑な設定などは完了しています。非常に便利ですね。
私が一番素晴らしいと感じた点は、apiを呼び出すためのコードを書く時にtrpcによって完全にドット開発手法が使えます。
例:
src/app/user/[id]/page.tsx
これはユーザーページのコードですが、このコードにおいて
ここは全て補完が効くのでapiのurlなどを意識することなく直感的に呼び出すことができます。
素晴らしいですね。
ちなみにクライアントコンポーネントでapiを叩く場合はtanstack queryを使用します
この場合も補完が効くのでapi側のコードを直感的に即座に書くことができます。
こんな感じでapi routeでapiを書くのが非常に簡単で、認証もpublicProcedure
かprotectedProcedure
を先頭に付けるだけです
現状はapi routeでデータ操作を書いてしまっていますが、今後serverrr actionをより活用する方向にリファクタリングしていく予定です
セットアップ
私はGoogle ログイン機能を作りたかったので、プロバイダーだけ変更しました。
初期値ではDiscordになっています。
src/server/auth.ts
あとは以下を行うだけ
- Supabaseのセットアップ
- Google Cloudでプロジェクトを作成し、OAuth認証設定
- cloudinaryでプロジェクトのセットアップ
- NextAuthのシークレットを発行
- Google Analyticsのプロジェクトのセットアップ
- GitHubでリポジトリを作成
- 環境変数を設定する
- Vercelを使用してGitHubリポジトリと連携する
これだけでもうすでにプロジェクトが立ち上がり、ログイン機能までが実装されている状態になります。すごすぎる、、、、、
ローカルのDBを立ち上げるには./start-database.sh
を実行するだけでdockerが起動してローカルのpostglesが起動します。これも素晴らしいですね。
工夫した点
見た目に関して
見た目は割と良い感じになったかなと思ってます。
shadcn/uiはコンポーネントを直接リポジトリの中に含めるので、カスタマイズしやすいです。
最初は便利なhooksもあり、RSCにも対応しているNextUIを使用したいと思ったのですが、なぜかボタンの色など、その他のコンポーネントの背景色の設定がうまくいかなかったのでshadcn/uiとtailwindcssを使用してスタイリングしています。
v0との相性が非常に良いので、結果的には悪くはないんじゃないかなと思っています。
lint設定
自分は統一されたコードを書くことが好きなので、eslintの設定をある程度追加しています。
自分しかコードを書かないのでルールは弱めですが、もう少しいろいろ入れてもいいかなと思ってます
.eslintrc.cjs
CI/CD
私はapiのルートの1つのサービスごとにテストを書いていくことにしました。
テストを書いたら必ずCIで自動実行されるようにしたいので、github actionでlintとtestが走るようにしています。
個人開発とはいえ、リリースしているので自分が間違えたコードをmainブランチにpushしちゃったせいでアプリが動かなくなってしまうと嫌なので、必ずブランチを切って作業をしてCI/CDが通ってからmergeするようにしています。
本当はCode Rabbit
も入れたいのですが、以前自分が使用した時には一ヶ月での使用料が56000円かかったのでちょっと検討中です(このときは一ヶ月で3050PR
くらい出した。PRの要約機能だけでもかなり神機能)
.github/workflows/test.yaml
src/server/api/routers/user.ts
src/server/api/routers/user/getUserById.ts
今後追加する機能
- 各種操作にloading表示を追加
- サービスの紹介ページの追加
- ユーザーのスコアランキング表示機能を追加
- 選択した宝箱のログを確認できるようにする
- 正解か不正解のフィードバックをポップアップにする
- マップのパターンやオブジェクトを追加する
- 結果共有機能を追加する
最後に
trpcやNextAuthなど、設定が少し面倒に感じる機能をほぼ自分で触ることなくいきなり作りたい機能の実装から開始できるt3-stack templeteは本当に素晴らしいと感じました。
最近はDrizzleなども勢いがすごく、便利な連携のためのライブラリが作られていたりとかなり使いやすそうなので学んでいきたいです。
最後にもう一度宣伝になりますが、せっかく作ったので触って遊んでみたり、引用やいいねなどしていただけるとすごく嬉しいです!