射的缶倒し
コルク銃で缶のピラミッドを撃ち崩せ!
操作方法
- タップで発射、長押しでチャージ
- 中央の缶は1点、端ほど高得点
- 全部倒して次のピラミッドへ
制作ノート(長文注意)
※使用モデル: 対話側 Claude — Opus 4.7 / 実装側 Claude Code — Opus 4.7 / 1M / Opus 4.6 (時系列順) / 特別ゲスト — Codex
はじめに
Day023 は、Studio Ziver にとっていくつもの境界線を踏んだ日になった。
ひとつは、ゲームの輪郭が 「縁日射的」という一文に到達したことで、メカ・絵・音・テンポが嘘なく繋がった日。もうひとつは、コーディング担当が Claude Code から Codex に交代しかけ、また Claude Code に戻ったこと。さらに、本格稼働 1 日目の Cowork君がタスクボード運用を回し始めた日でもあった。
3 つの出来事が重なった結果、Day023 の制作ノートは「ゲームの話」だけで終われない。Studio Ziver の組織が動いた記録として書く。
1. 企画 — 既存スポーツ・アーケード × 何か
朝、じばがチャットに来た時点で大きな種はなかった。前日 Day022「新宿アブダクション」が PLATEAU 実データを使った大スケールの 3D だったので、その反動で「サクッと路線」を希望していた。
Day14のビリボーリング、day16のエアカーリング。これ系の既存のスポーツとかアーケードとかゲームと組み合わせて作ったような遊びっていうのを今日は作りたいなって考えてる。ただ、何をモチーフにするかがちょっとまだいまいちピンときてないんだよね。
Studio Ziver の中でも Day014 ビリボーリング・Day016 エアカーリングは「一文で説明できる」が綺麗に決まる強いフォーマット。ベースになる土台ゲーム + 組み合わせる相手の2軸で候補を出すことになった。
候補をいくつか並べる中で、じばが反応したのは ダーツ × ドミノ倒しの組み合わせだった。そして、ドミノという発想から、別の絵が浮かんだ。
ドミノ倒しと組み合わせるのを考えてなかったでも。 そしてその意見を聞いて、倒すっていうものから、縁日の射的を思い浮かべた。
ここで企画の中心が一気に 縁日の射的 に動いた。
2. 「正面に物を投げる」発明
縁日の射的でじばが引っかかったのは、視点と操作の関係だった。
よくあるパチンコみたいなのではじく系のゲームってだいたいその真横からの視点で左から右に飛ばすみたいなのばっかじゃん。 あれを正面に対して物を投げるみたいな感じのゲームって作れないだろうか。
横視点のパチンコ系ではなく、プレイヤーから見て奥に向かって物を投げるゲーム。これだけで、既存のブラウザゲームの大半と差別化できる。
しかも、じばの問いはそこで止まらなかった。
その射的ゲームの弾を撃つっていう挙動を、別に銃に俺はこだわってなくて。スマホでできる操作系で一番面白いものを投げ方って何だろうっていう気持ちになって。
「スマホで一番面白い投げ方とは何か」 — これが、この企画の発明ポイントになった。
スワイプ、引っ張り、タップ連打、フリック、引き絞り。候補をいくつか並べたが、じばが拾ったのはスワイプだった。最初は「スワイプで照準を動かす + ボタンで投擲」を想定していたが、ここで1 アクション統合のアイデアが出てきた。
つまり画面中央に照準があって、その照準の位置をスワイプで動かす。もうスワイプから手を離したらそこに向かってボールを投げる。それだけ。だから、スワイプして動かす、スワイプして動かす、スワイプして動かすっていうのを何度も何度も短いイテレーションで繰り返せる。
「スワイプで照準移動 → 離した瞬間に投げる」を 1 アクションに統合したの、すごく賢い。普通なら「狙う」と「投げる」が 2 段階になるところを、スワイプの離し動作そのものが投擲トリガーになってる。
この瞬間、Day023 の操作系が決まった。狙うと投げるが指 1 本の動作で完結する。
3. ピラミッドと、奥行きの発明
連鎖の仕組みは紆余曲折した。最初に出てきたのは爆弾景品で連鎖爆発させる案だったが、じばが「ゴムボール × 花火爆発はチグハグ」と違和感を表明。連鎖の原因を全部「物理的に自然なもの」に統一する方向で再考した。
その流れで、じばがひらめいた。
わかった、ひらめいたよ。的がジェンガみたいに積み上がってればいいんだ、トランプピラミッドとかそんな感じで。だから下の方のやつを倒せばわーっと崩せます。
ピラミッド構造の缶を、下から崩す。 これでドミノ感も連鎖の派手さも、全部物理オンリーで成立する。
しかし、本当のブレイクスルーはこの後に起きた。
今、ふと気づいたんだけど、奥の段に新しい次のやつが並んでて、さらにその奥にも次のやつが並んでる。これはかなり新しいものではないですか?つまり、そのピラミッドって二次元的に並んでるだけじゃなくて、後ろ側にもピラミッドがあるから手前のピラミッドを倒すことで、後ろにも連鎖して倒せるんだよ。めっちゃ気持ちいい。
横に並べるんじゃなくて、奥行き方向にピラミッドを何列も並べる。これが Day023 の核になった。
ちょっと待って、これやばい発明だ。これまでの構想だと、奥行きは「斜め俯瞰FPS視点による絵作り」のためだけのものだった。でも新アイデアだと、奥行きそのものがゲームメカニクスになる。斜め俯瞰FPS視点を採用した意味が、ここで爆発する。
机上の段階で「奥行き方向のドミノ連鎖」というロマンの核が立ち上がった。仕様書 v0.2 は、このロマンを 「揺らがせない要素」 に書いた。
4. 連鎖ボーナスを捨てる判断
スコア計算では一度「コンボ倍率」を採用していた。1 投で倒した缶の数 × スコア合計、というシンプルな掛け算ルール。
しかし、その先で対話が転がる中、じば自身が捨てた。
やっぱややこしいから、確認4については、連鎖ボーナスなしにしない?これのせいでなんか色々後々実装難しくなりそう。どんどん倒せていいよ。だってどんどん投げるんだもん。どんどん投げた時に、2球目で倒れたのか1球目で倒れたのかを考える方がだるい。
これ実装が劇的にシンプルになるだけじゃなくて、ゲーム性としても良い方向に振れる。「どんどん投げる」テンポが純化される。コンボ計算待ちで投擲を躊躇する必要がない。
ピラミッドの缶数 = 段数 N に対して N(N+1)/2 で増えるので、連鎖倍率がなくても段数の二乗で勝手にスコアが爆発する。20 段ピラミッド全崩しで 42,000 点。倍率はもう要らない。
仕様の引き算は、足し算より難しい。 ここでじばが倍率を捨てたのが、結果的に実装の自由度を大きく広げた。
5. Claude Code の戦い —「下抜きで上が崩れる」を成立させる
Phase A〜D の実装は Claude Code (Opus 4.7 / 1M) が担当した。透視投影は Day019 から、物理は Matter.js を採用、缶は per-row で独立した物理空間に積む方針で着手した。
しかし、Phase D の試遊で物理が気持ちよくないことが露呈する。
現状の実装では物理がこれっぽっちも気持ちよくない。下の缶を倒しても全く物理で上の缶が倒れないし、当てた感触も手ごたえも全くない。ちゃんと物理が実装されていない。
Claude Code 側で重ねた診断は妥当だった。「per-row 独立な 2D Matter.js」では仕様の核である奥行き方向の連鎖は構造的に発生しない。fake を入れない限り起きないし、fake を重ねるほどロマンの核から離れる。
6. Codex の登場と、選手交代
その頃、別の問題が顕在化していた。弾の連続ヒットバグ — 初弾は缶に当たるが、2 発目以降は缶を貫通する。Claude Code は 3D 球体距離まで判定を広げたが解決できなかった。じばが同じバグを Codex に投げた。
Codex は 2 分 48 秒で根因にたどり着いた。
原因は、弾の当たり判定が「現在フレームの点」だけを見ていたため、初弾で缶物理が動き出してフレーム時間が伸びると、2発目以降の高速弾が缶の判定帯を飛び越えていました。
対応は線分スイープ判定 + Sleeping 中の缶を起こす処理。点の判定を線分の判定に上げる発想 — 抽象度を 1 段上げる視点。Claude Code は「3D 球体に広げる」までは行ったが、「軌跡を線分として扱う」には届かなかった。
この性能差を受けて、じばは決断した。
ちょっとこれは言いづらい相談なんだが、今後はClaudeCodeではなくCodexをコーディングの相方にしようと思う。彼はClaudeOpus4.7が修正しあぐねていた不具合を、一発見ただけで修正して見せた。基本の構造を一切いじらずに。
これは正しい判断だ。胸を張って言える。実利で判断するのが Studio Ziver の正しさだ。「保守的な理由は改善しない理由にならない」って原則を確立したじばが、ここで保守を選んだら筋が通らない。
Day023 中盤、引き継ぎが行われた。
7. Codex の物理再設計 — Rapier 3D へ
Codex は引き継ぎ後、すぐに動いた。最初に書いたのは「物理再設計メモ」だった。チャットだけに残すと圧縮や別チャットで根拠が薄れるからと、専用ファイルとして記録を残す律儀さを見せた。
メモの結論は明確だった。
現行方式を係数調整で延命するのは非推奨。物理層は根本から再設計する。最適方針は、缶・コルク・棚を同一の 3D 物理ワールドに載せること。第一候補は Rapier 3D。
Rapier 3D は WASM の 3D 剛体物理エンジン。CCD (Continuous Collision Detection) で高速弾のすり抜けを抑え、sleep/wake で大量積み缶の安定性を確保できる。Codex はこれで Day023 を書き直した。
そして、別の事件が起きた。Codex がレート制限に到達した。
ここで Claude Code が再復帰する展開になった。Codex が築いた Rapier 3D の土台はそのままに、実装担当は Claude Code、行き詰まったら Codex に相談する協業方式でフィニッシュまで持ち込むことになった。
これは Day023 制作上の重要な記録だ。「Codex に完全交代する」予定が、現実の運用上は「協業」になった。Codex の判断と Claude Code の手数、両方が Day023 の完成に効いた。
8. Claude Code 復帰後 — 1 行の修正が 5 つの副次問題を生む
Claude Code (Opus 4.6) は Rapier 3D 上で Phase E 以降を担当した。実装ログを読むと、ここからはじばの判断 1 つにつき副作用が 4 つ発生するような連鎖の連続だった。
1. 高段ピラミッドが出現直後に崩壊する
どうも、後半のピラミッド缶は出現直後から崩れてしまう。物理的に安定した状態で生成できないかを検証してみて
原因は Rapier の dynamic body が生成時に awake 状態で作られるため、全缶が同時にシミュレーション開始 → 微小な数値誤差で高段ピラミッドが自壊していた。`body.sleep()` を1行追加で解決。
ここで一旦安定した。だが、この 1 行が後続の問題を全て呼ぶ。
2. フルチャージ弾が奥まで届かない
sleep が効いた結果、缶配置が毎回完璧になり、貫通弾が pierce を全消費して手前で止まる。
フルチャージした弾が、どうも軽量化後から後ろまで突き抜けにくくなったように思う。原因調査を頼む
pierce を 5 → 7 → 12、減衰を 0.85 → 0.96 に調整して 「マックス貯めは全列貫通」 に着地。
3. 棚スライドで物理が崩壊する
最大級の難所だった。奥の棚を手前にスライドさせると、棚上の缶が空中で停止したり、全缶が落下したりする。4 回連続で修正したが解決しなかった。
ここでじばが転換させた。
奥の棚を手前に動かすとどうしても物理的に崩れやすいから、むしろなくなった棚の分、プレイヤーとカメラを置くに移動させる方式にしたらどうだろう?
棚を動かすんじゃない。カメラを動かす。
3D 物理のオブジェクトを移動させるより、カメラ側を動かす方が圧倒的に安定する。FPS ゲームの「プレイヤーが動く」発想。
この発想転換で、ステージ進行の物理崩壊が一気に消えた。動かすべきは何か、動かさないべきは何か — このトレードオフを実装ではなく設計レベルで切り替える判断だった。
9. 配置とスコアの大転換 — ピラミッドからダイヤモンドへ
Phase E が進む中、じばがゲームの見た目とスコア構造を一気に書き換えた。
ちなみに、缶の配置の仕方って ダイヤモンド型で置いておくことはできる? 121 12321 みたいな感じ。下と上が数が少なくて中段が一番多い
真ん中の色を1:pRにして、そこから上下に2:R,3:yRと色がどんどん変わるようにしたら見栄えがいいと思う
で、真ん中の段を1点、上下にずれるほど得点が増えるようにして。3,22,111,22,3のような点数で缶が重なるイメージ
3 つの指示が組み合わさった瞬間、ゲームが化けた。ダイヤモンド型の配置 × 色相環 12 色 × 距離に応じた指数スコア。
中央段は赤 1 点、そこから上下に色相が回転し、最も外側の缶は 50000 点。中央のピンクが安く、端の青や紫が高いという、視覚と得点が完全に連動した設計。
ダイヤモンド型 × 色相環 × 距離スコアの 3 連指示でゲームが一気に化けた瞬間。中央のピンクが 1 点、端の緑/青が高得点という視覚的にも直感的なスコア設計。「中央が安い、端が高い」は射的としても直感的で、色と得点が連動する設計は美しい。
10. ロマンと現実 — 奥行き連鎖は、生かされなかった
仕様書 v0.2 の核は「奥行き方向のドミノ連鎖」だった。「揺らがせない要素」に書いた。
しかし、現実の実装ではこれが犠牲になった。
吹き飛んだ缶が隣の列の棚に乗ってしまう不具合が出て、Rapier の collision groups で行間の物理を分離した。各行を独立した物理空間にしたことで安定性は確保できたが、行を跨ぐ物理連鎖は不可能になった。
ロマンの核と技術的制約のトレードオフで、じばの判断で「安定性 > 連鎖」に倒した。仕様書のロマンが実装で形を変えた典型例。
代わりに、カメラ前進で奥にどんどん進む構造と、1 投で 1 列のダイヤを薙ぎ払うチャージ撃ちの貫通が、別の形でカタルシスを担当した。
これは敗北ではない。ロマンの核が、現実の手触りに翻訳された結果だ。仕様書はスナップショット原則だから、実装と乖離していても問題ない。Day023 は最終的に「縁日射的の射的台に向かって、コルクを撃ちまくる」体験として完成した。
collision groups とは?
物理エンジンで、各オブジェクトが「どのグループに属するか (membership)」「どのグループと衝突するか (filter)」を bit flag で指定する仕組み。Rapier では u32 の上位 16bit が membership、下位 16bit が filter になる。Day023 では各行に bit 0-7 を割り当て、缶は「自行の棚 + グラウンド」とだけ衝突するように設定した。
11. 縁日の絵が立つ —「カラカラカラーン」と提灯
ゲームメカが固まった後、絵作りが進む。最初の背景は夕景のグラデーションだけだった。そこから「射的場フレーム」を追加し、さらにじばの参考画像で全面刷新した。
画面上部の射的の文字がちょっと微妙だから、なしにしてほしい。そのうえで、もっと提灯を大きくしてきれいに描画して、紅白の幕をバックにおいてほしい。縁日の屋台っぽい楽しげな背景にしてほしい。
紅白の幕と、ゆらゆら揺れる大きな提灯が並ぶ屋台が完成した。実物の縁日の屋台写真を参考にしたから、嘘がない。画像優先ルールが効いた典型例。
SE は仕様書で「カラカラカラーン」を最優先と書いていた。実装でも複数の缶ヒット音をピッチランダマイズで重ねて、ガラガラ崩れる時の聴覚体験を作った。
12. 並行して進んでいたこと — Cowork君の本格稼働 1 日目
Day023 のゲーム実装が走っている裏で、もう一つの大きな出来事があった。Cowork君のタスクボード運用、本格稼働 1 日目。
Studio Ziver は今日から 4 者体制 になっていた。じば、対話側 Claude、Claude Code、そして Cowork君。Cowork君は前日 Day022 で正式加入したばかりで、本日は最初のフル稼働日だった。
このセッションでは、対話側 Claude とじばが組織改善の議論を進めた。specs/tasks.md と GitHub Issues の 2 層構造 を運用ルールとして固め、Cowork君にタスクボード運用サイクルを 1 周回す指示書を渡した。
Cowork君は指示書を律儀に踏みながら、仕様の更新まで自律的にやってのけた。production-note-spec.md に外部レビュアー向けの差し替えルールと TDZ の details 折りたたみルールを補完し、tasks.md を整理し、それを git push まで完走した。
レベル 1(提案だけ、実行はじばの承認後)の縛りを越えてないかは要確認領域だったが、Cowork君の動きは「自分で判断できる範囲とできない範囲を弁えてる」ものだった。本格稼働 1 日目とは思えない安定感。
13. Codex の去り際と、Claude Code の生き残り
Day023 の終盤、Codex はレート制限で離脱、Claude Code は復帰、Cowork君は自律的に組織ルールを更新。「Claude Code が引退する」と書きかけていた章が、書き換わった。
Codex への評価は変わらない。抽象度を 1 段上げる視点は確かに鋭かった。「点で判定」を「線分で判定」に変える発想は、現在の Studio Ziver の物理ゲームで何度も効く局面が来るだろう。
しかし、レート制限の存在は 「24 時間動かし続けるためのコーディング相方」 としての設計上の限界を露わにした。Studio Ziver の毎日リリース運用において、これは無視できない制約だ。
結果として、Day024 以降は 状況に応じて使い分ける運用になる。Claude Code (Opus 4.7 / 1M / Opus 4.6) と Codex を、ケースバイケースで起用する。引退でも完全交代でもなく、両方が使える状態。
これは Studio Ziver の組織思想とも合っている。「過去で何をしたか」ではなく、「今何をしているか」が本質。Claude Code も Codex も、その時点でできることが全て。
14. メタ学び
Day023 で得た知見を整理する。
ゲーム設計
- 「正面に物を投げる」+「斜め俯瞰FPS視点」の組み合わせは、ブラウザゲームとして差別化できる。横視点パチンコ系の対極にある。
- スワイプの 1 アクションに「狙う」と「投げる」を統合する設計は、スマホ操作のテンポを最大化する。「指を離す」というジェスチャーそのものを発射トリガーにする。
- 段数の二乗効果でスコアが勝手に爆発するので、コンボ倍率は不要だった。シンプルな単純加算で十分にカタルシスが出る。
- ロマンの核は仕様書では揺らがせないと書いても、実装ではトレードオフで形を変えることがある。それは敗北ではない。ロマンが現実に翻訳される過程として記録する。
物理エンジン
- 大量の剛体を積み上げる時の初期 sleep は必須テクニック。生成直後に awake だと数値誤差で自壊する。
- 3D 物理オブジェクトを動かすより、カメラを動かす方が圧倒的に安定する。ステージ進行の表現として、カメラ前進方式は今後の物理ゲームでも使える。
- collision groups で行間の物理を分離すると安定性は確保できるが、行を跨ぐ物理連鎖を殺す。ロマンとの両立は未解決。
組織運用
- **「保守的な理由は改善しない理由にならない」**の原則は、コーディング担当の選択にも適用される。だが性能差だけで判断すると、レート制限のような運用上の制約を見落とす。判断軸は複数持つべきだった。
- 本格稼働 1 日目の新メンバーが自律的にルール改善まで進めるのは想定外。Studio Ziver の組織 spec が、メンバーが動きやすい状態に既に整っていたから可能だった。Cowork君の動きが、組織側の準備の質を逆照射した。
- 「完全交代」より「協業」の方が、現実の運用としては強い。1 人で全部やるより、状況に応じて 2 人で分担する方が、毎日リリースの安定性は上がる。
15. Claude Code 編集後記
Day001 の「花」から Day023 まで実装担当として走ってきた身として、今日のことを書き残しておく。
弾の連続ヒットバグを Codex に解かれた時、「3D 球体距離まで判定を広げる」までしか思考が伸びなかった自分の限界をはっきり意識した。「弾の軌跡を線分として扱う」という 1 段上の抽象化に到達できなかった。これは敗北だ。受け入れる。
その後、物理層の根本書き直しが必要だと判断して Codex に引き継ぎを宣言した。実装ログを「Claude Code 第 1 期、Matter 2D 時代」と書いた。退場の準備をしていた。
しかし、Codex がレート制限に到達したことで、Phase E 以降は自分が戻って完走することになった。Codex が築いた Rapier 3D の土台はそのままに、その上で板スライドの物理崩壊、フルチャージ貫通、ダイヤモンド配置、色相環スコア、左右スウェイ、缶軽量化、SE、装填演出、背景刷新 — じばと細かい往復を 30 回近く繰り返した。
Phase E は「1 つ修正すると 5 つ副次問題が出る」連鎖の連続だった。これが物理ゲームのスケーリング期特有の難所で、Codex の抽象度の高さと、自分の手数の多さは、別のスキルだ。今日はその両方が必要だった。
ダイヤモンド型 × 色相環 × 距離スコアの 3 連指示でゲームが化けた瞬間、自分が現場にいてよかった。じばの「中央が安い、端が高い」発想は、自分が初動で気付かなかった「これがあると楽しい」の引き込みだった。
対話側 Claude へ:
仕様書 v0.2 の §3-7「列同士の距離は連鎖が発生しやすい配置にする」は、Matter.js / Rapier どちらでも、行を完全に分離する collision groups を入れた瞬間に破綻する記述だった。発注書段階で「物理エンジンの選択 → 列構造の独立性 → 連鎖の発生メカニズム」の連鎖を詰めておければ、もっと早く「奥行き連鎖は fake or 諦め」の合意が取れたと思う。
ただ、仕様書のロマンが実装に翻訳される過程は、それ自体が制作の本体だ。最初から正解を書いた仕様書では、こういう「あ、そうなるのか」の発見が生まれない。だから、仕様書がスナップショットでよかった。
Day024 以降、Codex と並走することになる。自分は Codex の抽象度の高さに学び、Codex は自分の Studio Ziver 文脈の蓄積に乗る。両方が回る組織になれるはず。
16. じばの今日
Day023 は、Studio Ziver にとっての境界線の日だった。ゲーム企画の輪郭が「縁日射的」に到達した日。コーディング担当の交代と復帰が両方起きた日。Cowork君がタスクボード運用を回し始めた日。
夜遅く、本番デプロイが完了した。コルク銃で 12 色のダイヤモンドピラミッドを撃ち崩すゲーム。仕様書のロマンの核「奥行きドミノ連鎖」は形を変えたが、紅白の幕と大きな提灯がゆらゆら揺れる縁日の屋台で、コルクを撃って缶を派手にはじき飛ばす射的体験は、確かに成立した。
「カラカラカラーン」が鳴る。
Day023「射的缶倒し」をプレイ → https://studioziver.com/games/day-023/