JavaScript GameDev Algorithm

【開発裏話】モンスタークリッカーの「無限インフレ」はどうやって計算しているのか?

Play Spotで公開中の放置系RPG「モンスタークリッカー」。
ステージが進むごとに敵のHPが「100 → 1000 → 1億…」と爆発的に増えていく、いわゆるインフレゲームですが、この計算式がどうなっているか気になりませんか?
今回は、開発コードの一部を公開しながら、その裏側のロジックを解説します。

📈 指数関数で「インフレ」を作る

ゲームバランスの肝となるのが「敵のHP計算」です。
単なる足し算(HP + 100)ではすぐに簡単になりすぎてしまいます。そこで使用するのが「指数関数(Math.pow)」です。

実際の計算ロジック

モンスタークリッカーでは、以下のような計算式で敵のHPを決定しています(Ver2.0の例)。

// ステージ数とサブステージから「レベル係数」を算出
const levelFactor = ((stage - 1) * 10) + subStage;

// 基礎HP × (1.15の累乗)
// Math.pow(底, 指数) を使うのがポイント
let hp = Math.floor(baseData.baseHp * Math.pow(1.15, levelFactor - 1));

// ボス戦(サブステージ10)だけさらに5倍
if(subStage === 10) hp *= 5;

この 1.15 という数字が重要です。
1レベル上がるごとにHPは1.15倍になります。「たった1.15倍?」と思うかもしれませんが、これが50回(5ステージ分)繰り返されると…

  • レベル1: HP 10
  • レベル10: HP 35
  • レベル50: HP 9,300
  • レベル100: HP 1,000,000 オーバー

このように、後半になるほど急激に数値が跳ね上がる曲線を描きます。
この「手に負えないほどのインフレ」こそが、クリッカーゲームの醍醐味を生み出しているのです。

💾 ブラウザだけでセーブする「localStorage」

当サイトのゲームは会員登録不要ですが、ブラウザを閉じてもデータが消えません。
これはデータベースではなく、ブラウザの機能である localStorage(ローカルストレージ) を使用しています。

function saveGame() {
    // 保存したいデータをオブジェクトにまとめる
    const data = {
        gold: gold,
        gems: gems,
        stage: stage,
        weaponLevels: weaponLevels, // 配列やオブジェクトもOK
        lastLogin: Date.now()
    };
    
    // JSON文字列に変換して保存
    // キー名 'monster_clicker_v2_save' で保存
    localStorage.setItem('monster_clicker_v2_save', JSON.stringify(data));
}

JSON.stringify() を使うことで、複雑なゲームデータも一列の文字列として保存できます。
サーバーにデータを送る必要がないため、通信ラグがなく、サクサク動くゲームを実現できるのがメリットです。

👨‍💻 まとめ

一見シンプルに見えるゲームも、裏側では「ユーザーにどうやって成長を感じさせるか」という数学的な調整が行われています。
もしプログラミングに興味を持ったら、ぜひ自分だけのクリッカーゲームを作ってみてください!

スポンサーリンク
開発ブログ一覧に戻る