防御力を上げたのに敵が硬くならない、が起きる理由
ゲームを作っていて、攻撃力と防御力の数値を決めたところまでは順調だったのに、レベルが上がるにつれて「防御が高すぎてダメージが通らない」「逆に防御がほとんど意味を持たない」といった問題にぶつかることがあります。原因の多くは、数値そのものではなくダメージ計算式の形にあります。
この記事では、よく使われる3つの式(単純減算・割合軽減・除算型)を同じ数値で比べ、それぞれの性質と選び方を整理します。特定の作品の仕様を再現する話ではなく、自作ゲームの式を自分で決めるための判断材料です。
3つの式の基本
攻撃力をA、防御力をDとします。「ダメージ計算機」で選べる3種類は次のとおりです。
- 単純減算: A − D
- 割合軽減: A × 100 ÷ (100 + D)
- 除算型: A² ÷ (A + D)
どれも、技の威力(%)を掛けて最終的な基本ダメージにするのが一般的です。計算機では「上の式 × 技の威力 ÷ 100」としています。
性質の違いを一言でいうと次のようになります。
- 単純減算は直感的で調整しやすい反面、DがAに近づくと急にダメージが消えます。
- 割合軽減は、防御力が「何%カットするか」を決める式です。軽減率は D ÷ (100 + D) で、攻撃力には依存しません。
- 除算型は、攻撃と防御の「比」でダメージが決まります。軽減率は D ÷ (A + D) で、両方を同じ倍率で大きくしても結果の比率は変わりません。
数値例で比べる
攻撃力120・技の威力100%で、防御力だけを変えた結果を、Pythonで計算して検算しました(小数第2位を四捨五入)。
防御力 単純減算 割合軽減 除算型
0 120 120.00 120.00
30 90 92.31 96.00
60 60 75.00 80.00
120 0 54.55 60.00
240 -120 35.29 40.00
単純減算は防御力120でちょうど0、240ではマイナスになります。実装では0や1で下限を切るのが普通ですが、下限に張り付いた状態では、防御をどれだけ上げても、攻撃を少し強化しても結果が変わらず、数値を調整する意味がなくなります。これが「防御力がダメージ0になる問題」です。割合軽減と除算型は、防御がどれだけ高くても0にはなりません。
次に、攻撃力と防御力を同じ比率で2倍にしてみます。攻撃力120・防御力60から、攻撃力240・防御力120にした場合です。
- 単純減算: 60 → 120(2倍)
- 割合軽減: 75.00 → 109.09(約1.45倍)
- 除算型: 80 → 160(2倍)
除算型は比だけで決まるので、数値のインフレに強く、単純減算も比例して増えます。割合軽減は「100」という定数が入っているため、数値が大きくなるほど防御の効きが強くなり、同じ比率で成長させるとダメージの伸びが鈍ります。数値が膨らむゲームでは、割合軽減の定数(上の式の100)も一緒に見直す必要があります。
乱数幅も確認します。初期値(攻撃力120、防御力60、威力100%、割合軽減、乱数幅±10%)では、基本ダメージ75に対し、理論上の範囲は67.5〜82.5です。ツールでは整数にした最小67、最大82が表示されます。威力を150%にすれば、基本ダメージは112.5になります。
どの式を選ぶか、判断の基準
- 数値が小さく、プレイヤーが暗算できる範囲に収めたいなら単純減算が向いています。ただし、敵の防御を攻撃力の上限より低く保つ設計が必要です。
- 防御力を「何%減らす」という見せ方にしたい、装備で防御を積み上げさせたいなら割合軽減が扱いやすいです。軽減率が頭打ちになるので、防御を上げる価値が徐々に下がる(逓減する)設計になります。
- レベル差や数値のインフレがあるゲームで、強さを「攻撃と防御の比」で表したいなら除算型が安定します。
どの式でも、下限値(最低1ダメージなど)を入れるかどうかは別に決めます。0を許すと「完全に無効」という演出が作れますが、戦闘が終わらなくなる危険もあります。
よくある落とし穴
- 端数の扱い: 切り捨て・四捨五入・切り上げで、低ダメージ帯の結果が大きく変わります。たとえば基本ダメージが3前後のとき、1の差は30%以上の差です。
- 乱数幅の掛け方: 防御を引く前に乱数を掛けるのか、後なのかで、単純減算の分布は変わります。ダメージが小さいほど影響が大きくなります。
- 属性・クリティカル・バフの順序: 加算するのか乗算するのかを決めずに足していくと、後から倍率が暴走します。倍率の掛ける順序は、最初に仕様として書き出しておくと混乱しません。
- テストの観点: 「最強の攻撃 対 最強の防御」と「最弱の攻撃 対 最強の防御」の両端で、結果が0や極端な値にならないか確認します。
防御を「実質的な体力」に置き換えて考える
割合軽減の式は、防御力を実質的な体力の倍率として読み替えると設計しやすくなります。受けるダメージが 100 ÷ (100 + D) 倍になるので、実質的な体力は (100 + D) ÷ 100 倍です。検算すると、防御力60で1.6倍、防御力100で2倍、防御力300で4倍になります。軽減率にすると、それぞれ37.5%、50%、75%です。
この見方をすると、「防御を100上げたときの価値」が一定ではないことが分かります。防御0から100にする価値(実質体力が1倍から2倍)と、防御200から300にする価値(3倍から4倍)は、実質体力の増え方は足し算では同じ+1ですが、倍率で見ると前者は2倍、後者は約1.33倍です。装備やレベルアップで防御が積み上がるほど、1ポイントの価値が薄くなる設計になっています。成長曲線を決めるときは、防御の最終値で軽減率が何%になるかを先に決め、そこから逆算すると失敗しにくくなります。
関連ツールの使い方
ダメージ計算機では、初期値が割合軽減になっています。式を切り替えながら、同じ入力での軽減率の違いを見比べてください。吹き飛ばしの距離はノックバック計算機、スキルの連発頻度との兼ね合いはクールダウン計算機で確認できます。1回のダメージだけでなく、一定時間に出せるダメージ(1回のダメージ ÷ クールダウン)で見ると、バランスの偏りに気づきやすくなります。
まとめ
ダメージ式は、数値の見た目より「防御が上がったときにどう変化するか」で選びます。単純減算は分かりやすいが0になる、割合軽減は逓減して0にならないが数値の規模に左右される、除算型は比で決まり安定する、というのが大まかな性質です。選んだ式で端と中央の数値を表にしてみる習慣をつければ、後から大きなバランス崩れを避けられます。最終的な丸め方や上限値は、実際に遊んで確かめてください。