【開発裏話】モンスタークリッカーの「無限インフレ」はどうやって計算しているのか?
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() を使うことで、複雑なゲームデータも一列の文字列として保存できます。
サーバーにデータを送る必要がないため、通信ラグがなく、サクサク動くゲームを実現できるのがメリットです。
👨💻 まとめ
一見シンプルに見えるゲームも、裏側では「ユーザーにどうやって成長を感じさせるか」という数学的な調整が行われています。
もしプログラミングに興味を持ったら、ぜひ自分だけのクリッカーゲームを作ってみてください!