はじめに
こんにちは。普段はライブ配信のレコメンドアルゴリズムを扱うバックエンドエンジニアをしていますが、業務外で個人開発として 82-0 というWebゲームを作っています。今回はQiitaに初投稿ということで、このプロジェクトの紹介と、開発の過程で考えたことを書いてみます。
82-0 は、NBAの歴代選手を「ドラフト」してチームを編成し、82試合を無敗で終える"完全なシーズン"をシミュレーションするWebゲームです。
コンセプトはシンプルで、
スロットマシンのような演出で歴代選手をランダムに引き当てていく
引いた選手でロースターを組み、シーズンをシミュレーション
どこまで"82-0"(全勝)に近づけるかを競う
というものです。NBAファンなら「もしあの選手とこの選手が同じチームにいたら」という妄想を一度はしたことがあると思うのですが、それをゲームとして具現化した形です。
こだわった機能: Poach Mode
素の「無敗チャレンジ」だけだと単調になりがちなので、Poach Mode というプレイオフモードを別途実装しました。1990年〜2026年の歴代ブラケットをベースにしたシングルエリミネーション形式で、対戦相手を倒すたびに、負けたチームから選手を1人「引き抜ける(poach)」というルールです。
このモードを入れたことで、
単なる運試しではなく「誰を引き抜くか」という戦略要素が生まれる
ラウンドが進むごとにロースターが強化されていく成長感が出る
過去の実在のプレイオフ対戦カードを追体験できる
という狙いがあり、実際にプレイ感がかなり変わりました。個人開発だと機能を絞りがちですが、コア体験に直結する部分は思い切って作り込む価値があると感じています。
技術スタック
フロントエンド: Next.js
バックエンド / シミュレーションエンジン: Node.js + TypeScript
デプロイ: Vercel
フロントとロジックをNext.js + TypeScriptで統一することで、個人開発の限られた時間の中でも開発速度を落とさずに済んでいます。特にシミュレーションエンジン部分(スコアリング、対戦結果の計算)はTypeScriptで型をしっかり定義しておくことで、選手データやルールを後から拡張する際のバグを減らせています。
スコアリングロジックの設計で悩んだこと
このゲームの肝は「歴代選手の能力をどう数値化し、対戦結果にどう反映させるか」という部分です。単純な平均ステータス比較にすると、
時代によってプレースタイル・ルールが違う選手をどう公平に比較するか
スター選手1人に依存しすぎるロースターと、バランス型のロースターのどちらが強いべきか
といった論点が出てきて、"それらしい数式"を作るだけでなく、プレイしていて納得感のある結果になるかを何度も調整する必要がありました。このあたりの詳細は、機会があれば別の記事で掘り下げたいと思っています。
個人開発を通して感じたこと
本業ではレコメンドアルゴリズムの設計やチームマネジメントに関わっていますが、個人開発は完全に一人で企画・設計・実装・グロースまでやる必要があるので、業務とはまた違う筋肉を使う感覚があります。特に「面白さ」という定量化しづらい指標を相手にしながら数式を調整する作業は、業務でのアルゴリズム設計とは違った難しさと楽しさがありました。
おわりに
NBAファンの方、あるいは「歴史上の選手を集めたらどうなるか」という妄想が好きな方は、ぜひ一度遊んでみてください。
フィードバックや「こんな機能欲しい」といったコメントも大歓迎です。今後も個人開発の進捗や技術的な工夫について、Qiitaで発信していければと思っています。

