推しアイデア
ジェンガの「1本抜いて崩れたら負け」を、コードの「1行消してテストが落ちたら負け」に置き換えた。抜けそうな行を見抜く読解力と、相手に危ない行を残す駆け引きが同時に生まれる。Geminiが毎回違う関数とテストを出すので、同じ勝負は二度とない。
ジェンガの「1本抜いて崩れたら負け」を、コードの「1行消してテストが落ちたら負け」に置き換えた。抜けそうな行を見抜く読解力と、相手に危ない行を残す駆け引きが同時に生まれる。Geminiが毎回違う関数とテストを出すので、同じ勝負は二度とない。
「コードを1行消しても動くか」はレビューや保守で毎日起きる判断。それをジェンガのルールに乗せ、テストの通る限界を探り合う対戦ゲームにした。読む・消す・検証するを遊びにして、コードの依存関係を体で覚える体験を目指した。
コードとテストをGeminiで生成し、Piston(隔離サンドボックス)でVitestを実行して1手ごとにセーフ/アウトを判定。Supabase Realtimeで手番・判定を全員に同期し、盤面はCSS 3Dの積み木として崩壊まで演出。
その1行、消して大丈夫? テストが崩れたら、君の負けだよ☆

ジェンガの「1本抜いて崩れたら負け」を、コードの「1行消してテストが落ちたら負け」に置き換えた対戦ゲームです。 お題の関数とテストは毎回 Gemini が生成し、プレイヤーは交互に1行ずつ削除します。削除のたびに隔離環境で本物の Vitest が走り、セーフかアウトかを判定。アウトを出した人が負けです。
「この行、消しても動くのか?」はコードレビューや保守で毎日起きる判断です。 それを遊びにすれば、コードの依存関係や「どの行が本当に効いているか」を体で覚えられるのではないか、という発想から始めました。読む・消す・検証する、を対戦の緊張感の中で繰り返します。

画面全体。App Router、Server Component と Client Component を分離
読む・選ぶためのエディタ表示(選択行のハイライト)
木片・崩壊・光。ライブラリなし
積み木が落ちて積み上がる物理演算
Web カメラで手を検出し、指さし・つまみで操作
関数と Vitest テストをペアで生成
プレイヤーのコードを隔離環境で実行
お題の検証と1手ごとの判定
ルーム・試合・手番の保存と、全員への即時同期
本番は Vercel、Piston は発表者 PC の Docker をトンネルで公開


対戦相手の一手をリアルタイムに反映する部分で、「購読は成功しているのにイベントが届かない」問題に2度ぶつかった。