Mopuru Cannonは、角度と威力を決めて弾を撃ち合う2〜4人の砲撃バトルです。風で弾道が流され、爆発で地面が削れ、足場を失ったプレイヤーは落ちていきます。友だちとはルームコードでオンライン対戦ができ、1台の端末を順番に回して遊ぶこともできます。

この記事では、2026年10月8日の最初のプロトタイプから、10月9日の正式公開、10月11日の特殊弾の追加までを、実際に入った変更の順に振り返ります。

Mopuru Cannonのプレイ画面。左下に弾の選択、下部にMOVE・ANGLE・POWER・FIRE、右上に風の強さが表示されている

開発の流れ

  • 10月8日:プロトタイプ。角度・威力・風・地形破壊の基本
  • 10月8日:落下ダメージと場外K.O.、演出の追加。2〜4人のオンライン対戦
  • 10月9日:ターンごとの移動(MOVE)
  • 10月9日:公開準備(遊び方・詳細ページ・キービジュアル)と正式公開
  • 10月9日:4つのステージ
  • 10月11日:特殊弾(ワープ弾・氷結弾)

短期間で進められたのは、最初に「勝敗を決める計算」をひとつのエンジンにまとめ、そのあとの機能をすべてそのエンジンへの追加として積み上げたからです。

ひとつのエンジンを、ブラウザとサーバーで動かす

Mopuru Cannonの弾道、ダメージ、地形の削れ方、移動は、すべて同じゲームエンジンで計算しています。このエンジンは、同じ入力と同じ乱数の種(シード)を与えれば、必ず同じ結果を返すように作っています。

オンライン対戦では、この性質をそのまま使っています。

  • ルームの乱数の種はサーバーが決めます。
  • プレイヤーが送るのは「この角度・この威力で撃つ」「何歩動く」という操作だけです。位置や弾の着地点は送りません。
  • サーバーは、手番・席・数値の範囲・弾の残数などを確認してから、エンジンで結果を1回だけ計算します。
  • 各ブラウザは、サーバーから届いた結果を同じように再生します。

画面に表示されるものを信用せず、結果をサーバー側で決めることで、2〜4台の画面がずれず、不正な数値を送られても勝敗が変わらない構成にしています。

小数点以下の小さなずれ

この構成で一度つまずいたのが、計算環境の違いです。サーバー(Cloudflare Workers)と、テストを実行するNode.jsとでは、三角関数(sin・cos)の結果が最後の桁でわずかに異なることがありました。

同じ環境の中では結果は完全に一致します。そのため、サーバーとNode.jsの比較テストだけは10億分の1程度の誤差を許容し、同じ環境どうしの再現性は完全一致で確認する形にしました。物理やダメージの計算そのものは変えていません。

落下と場外で、地形が武器になる

最初のプロトタイプには、角度・威力・風と、爆発で地面が削れる仕組みまでが入っていました。ただし、勝負は弾を当ててHPを削り合うことだけで決まっていました。早い段階で加えたのが、落下ダメージと場外K.O.です。

爆発で地面が削れ、足場を失ったプレイヤーは落ちてダメージを受けます。少しの段差なら無傷ですが、高いところから落ちるほどダメージが増えます。そして、いちばん底まで掘られた穴に落ちると場外(RING OUT)でK.O.です。

これにより「相手を直接狙う」だけでなく、「相手の足もとを崩す」という攻め方が生まれました。同じタイミングで、直撃・自爆・K.O.の演出、画面外へ飛んだ弾の位置を示す表示、ラウンド表示も追加しています。

ターンごとに、少しだけ歩ける

10月9日には、自分のターンに左右へ少しだけ歩ける「MOVE」を追加しました。歩ける量は画面下のゲージ(36/36)で確認できます。

移動もエンジンの中で計算しています。地面の起伏に沿って1ピクセルずつ進み、急な斜面、穴、画面の端、ほかのプレイヤーにぶつかると止まります。オンラインでは、サーバーが手番や残りの歩数を確認してから移動を確定します。

画面では、長押しで歩くボタンを角度のボタンと見分けやすいデザインにし、キーボードではA・Dキーで歩けるようにしました。

公開前に行ったこと

正式公開の前は、プレイページを検索エンジンに載せない状態で、直接URLを知っている人だけが遊べる期間を設けました。その間に、次のような調整を行っています。

  • 弾の最高速度を下げる調整
  • スマートフォンを縦向きで開いたときに、横向きにするよう案内する表示
  • 初めて遊ぶ人向けの遊び方ガイド
  • スマートフォンで押しやすい大きさにした音声の切り替えボタン
  • Spaceキーで撃つときにフォーカスがずれる問題の修正

公開にあたっては、作業手順をチェックリストにまとめました。自動テストに加えて、本番環境での2台の端末による対戦(ルーム作成から参加、READY、移動、砲撃、再読み込み後の復帰まで)と、横向きスマートフォンでの操作確認を含めています。

4つのステージ

公開後すぐに、地形の違う4つのステージを追加しました。

草原、大峡谷、双峰、クレーター荒野の4ステージ

  • 草原:ゆるやかな丘。いちばん標準的なステージ
  • 大峡谷:中央が大きく沈んだ谷。高い角度で谷越しに撃つ
  • 双峰:2つの山と低い鞍部。高さの差と位置取りが鍵
  • クレーター荒野:最初から凹地だらけ。地面を崩して落とすステージ

地形はステージの種類と乱数の種から生成されるため、同じステージでも毎回少しずつ形が変わります。「ランダム」を選んだ場合は試合を作る側(オンラインではサーバー)がステージを決めます。ステージを固定して再戦すると同じステージの新しい地形に、ランダムで再戦すると直前とは別のステージになります。

オンラインでは、ステージは部屋を作るときにホストが選び、ロビーに表示されます。部屋を作ったあとは変更できません。

特殊弾:ワープ弾と氷結弾

10月11日には、1試合に1発ずつ使える特殊弾を追加しました。

  • ワープ弾:ダメージも地形の削れもなく、着弾点の近くの安全な場所へ自分が瞬間移動します。場外に出た場合や、安全な場所がない場合は失敗です。
  • 氷結弾:ダメージは少なめで地形も削りませんが、相手に直撃すると、その相手の次のターンを1回休みにします。重ねがけはできず、自分に当たった場合やK.O.した場合は凍りません。

弾の残り数と「凍っている」状態もサーバー側で管理しています。存在しない弾の種類や、残っていない弾を指定した操作はサーバーが受け付けません。

オンライン対戦の流れ

  • 1人が部屋を作り、ほかの人はルームコードか招待URLで参加します(2〜4人)。
  • 全員がREADYになったら、ホストが試合を始めます。
  • 通信が切れても、90秒以内に戻れば同じ席で続けられます。戻れなかった場合はその試合から脱落扱いになります。
  • 再戦では先攻が交代します。

テストについて

機能を追加するたびに、エンジン単体のテスト、サーバー(Worker)のテスト、ブラウザを使ったテストを追加しています。たとえば移動では、ルールどおりに止まるか、サーバーが不正な移動を拒否するか、再接続や再戦のあとも状態が正しいかを、それぞれ確認しています。

開発にはAIコーディング支援も使っています。仕様の分け方やテストの進め方についてはこちらの記事にまとめています。

これから

遊び方のコツは初心者向け攻略ガイドにまとめました。ルールの全体はゲーム詳細ページで確認できます。