【ゲーム開発】超感覚的バランス調整について【ステータス編】

## ■はじめに

皆さんはゲーム開発中、バランス調整むず！！っと感じたことはありませんか？
私は常々感じてます。というかゲーム開発の中でもかなりの難易度高い位置にあるのでは？と思っております。

何を参考にすれば良いのかわからず途方にくれることもしばしば。いろいろ探しては見るもののこれだ！とドンピシャでハマるところが見つかりません。（見つけられてないだけ）
というわけで無いなら自分で考えてやろう！と勢いでqiitaに登録してやりました。

そもそも、ゲームのバランスって何なんですかね？バランス悪いと感じることはあっても具体的にどれがどのくらい悪いのか意外と考察することはないんじゃないですかね？（私はそういうゲーム辞めちゃってます。）しかもバランスが良いゲームについては「たのしー！」が全面に出過ぎててそのことが頭から飛んでしまうorz

そんな絶望的な「分からない」から目をそらさずに今回はステータスのバランスについて、真剣に考えてみます。（要素が多いと難しいので対象ステータスを絞りました）

あと今作ってる私のゲームの仕様にて考察するので、もし参考にして頂けるのでしたらそこは置き換えて考えてください。

##■対象ステータス
- プレイヤー
    - PlayerLV（レベル）
    - PlayerSTR（攻撃力）
    - PlayerEXP（レベルアップに必要な経験値）

- 敵
    - EnemyLV（レベル）
    - EnemyHP（体力）
    - EnemyDEF（防御力）
    - EnemyEXP（倒したときに得られる経験値）

##■ゲームの仕様

プレイヤーと敵が衝突したタイミングで敵へ攻撃、敵のHPが0になったら経験値獲得。（簡単にするために今回はプレイヤーの被ダメージは考慮しません）

##■ダメージ計算

*EnemyHP = EnemyHP - (PlayerSTR - EnemyDEF)*

##■前提条件

PlayerSTRよりEnemyDEFが大きい場合は被ダメージ1
EnemyHP以上の攻撃を受けてもEnemyHPは0未満にならない。

##■バランスって何だろう？

私はずばり「時間」が大きく関わっていると考えています。

以下のような問題を挙げてみます。

- 時間かかり過ぎ問題
    - 敵がなかなか倒せない（難易度高すぎ）
    - レベルあがらない

- 時間かからな過ぎ問題
    - 敵弱すぎ（難易度低すぎ）
    - レベル上がり過ぎ

まぁ他にも色んな要素あると思いますが、今回はこの「時間」をベースにバランス調整の計算式を考えていきたいと思います。

##■追加要素

時間をベースに計算する為に以下要素を考慮することにします。（これを書いている途中でいろいろな問題点に気づいたので追加要素が膨れ上がりましたw）

- 1秒当たりの攻撃回数（攻撃回数）
- レベルアップまでの時間（時間）
- レベルアップに必要な敵討伐数（必要討伐数）
- 敵へのダメージ量（ダメージ）
- 基準DEF
- 基準EXP
- レベルアップまでの時間上昇値
- 必要討伐数上昇値
- 敵へのダメージ上昇値
- PlayerEXP上昇値
- EnemyDEF上昇値
- EnemyEXP上昇値

##■計算式の検討（ステータス）

レベル1のステータスから作っていきます。

**1.一部追加項目の設定**

|項目名| 設定値（任意） | 
|:--|:-:|
|攻撃回数|1|
|時間（秒）|10|
|必要討伐数|5|
|ダメージ|1|
|基準DEF|1|
|基準EXP|1|

単純計算で「時間 ÷ 必要討伐数」で1体あたりの討伐時間が決まります。今回は1体あたり2秒で討伐ですね。

**2.EXPの設定**

*EnemyEXP = 基準EXP*
*PlayerEXP = 基準EXP × 必要討伐数*

※はじめ「基準EXP」を設けず「EnemyEXP × 必要討伐数」としていましたが相互参照が発生して初期化の時に困るかなぁと思って変更しました。
具体例を上げると敵の初期設定が終わらないとプレイヤーの初期設定がはじめられない等。もちろんこの点に関しては順番守ればいいですし、大丈夫そうに見えますが出来るだけ順番を意識せずに初期化できるようにした方がのちのち後悔しなくてすみます。これに気づいて内容を書き直してる私がいるので実証済みです。

**3.PlayerSTR,EnemyDEFの設定**

*EnemyDEF = 基準DEF*
*PlayerSTR = 基準DEF + ダメージ*

**3.HPの設定**

*EnemyHP = ダメージ × 攻撃回数 × (時間 ÷ 必要討伐数)*

##■レベル1のステータス

|項目名| 設定値 | 
|:--|:-:|
|PlayerLV|1|
|PlayerSTR(基準DEF+ダメージ)|2|
|PlayerEXP(基準EXP×必要討伐数)|5|
|EnemyLV|1|
|EnemyHP(ダメージ×攻撃回数×(時間 ÷ 必要討伐数))|2|
|EnemyDEF(基準DEF)|1|
|EnemyEXP(基準EXP)|1|

##■レベルアップの検討

レベル1のステータスは一応決まりました。それでは次にレベルアップの検討をします。
ここは非常に悩みました。

**1.一部追加要素の設定（任意）**

|項目名| 設定値（任意） | 
|:--|:-:|
|時間上昇値|20|
|必要討伐数上昇値|1|
|ダメージ上昇値|1|
|EnemyDEF上昇値|1|
|EnemyEXP上昇値|1|

**2.単純に比例みたいな感じで実装してみる。**

- レベルアップ時

*PlayerLV = PlayerLV + 1*
*EnemyLV = EnemyLV + 1*

*基準DEF = 基準DEF + (EnemyDEF上昇値 × LV)*
*基準EXP = 基準EXP + (EnemyEXP上昇値 × LV)*

*EnemyDEF = 基準DEF*
*EnemyEXP = 基準EXP*

*時間 = 時間 + (時間上昇値 × LV)*
*必要討伐数 = 必要討伐数 + (必要討伐数上昇値 × LV)*
*ダメージ = ダメージ + (ダメージ上昇値 × LV)*

##■レベル2になったときのステータス

さて、レベルアップの計算式にてレベル2のステータスを見てみましょう。

- 追加項目

|項目名| 設定値| 
|:--|:-:|
|攻撃回数|1|
|時間(+(時間上昇値×LV))|30|
|必要討伐数(+(必要討伐数上昇値×LV)|6|
|ダメージ(+(ダメージ上昇値×LV))|2|
|基準DEF(+(EnemyDEF上昇値×LV))|2|
|基準EXP(+(EnemyEXP上昇値×LV))|2|
|時間上昇値|20|
|必要討伐数上昇値|1|
|ダメージ上昇値|1|
|EnemyDEF上昇値|1|
|EnemyEXP上昇値|1|

- プレイヤー

|項目名| 設定値| 
|:--|:-:|
|PlayerLV(+1)|2|
|PlayerSTR(基準DEF+ダメージ)|4|
|PlayerEXP(基準EXP×必要討伐数)|5|

- 敵

|項目名| 設定値| 
|:--|:-:|
|EnemyLV(+1)|2|
|EnemyHP(ダメージ×攻撃回数×(時間÷必要討伐数))|2|
|EnemyDEF(基準DEF)|2|
|EnemyEXP(基準EXP)|2|

ふむふむ、なるほどわからん。
計算式できたしレベル100まで上げてみるか。

##■レベル100になったときのステータス

- 追加項目

|項目名| 設定値| 
|:--|:-:|
|攻撃回数|1|
|時間(+(時間上昇値×99))|1990|
|必要討伐数(+(必要討伐数上昇値×99)|104|
|ダメージ(+(ダメージ上昇値×99))|100|
|基準DEF(+(EnemyDEF上昇値×99))|100|
|基準EXP(+(EnemyEXP上昇値×99))|100|
|時間上昇値|20|
|必要討伐数上昇値|1|
|ダメージ上昇値|1|
|EnemyDEF上昇値|1|
|EnemyEXP上昇値|1|

- プレイヤー

|項目名| 設定値| 
|:--|:-:|
|PlayerLV(+99)|100|
|PlayerSTR(基準DEF+ダメージ)|200|
|PlayerEXP(基準EXP×必要討伐数)|10400|

- 敵

|項目名| 設定値| 
|:--|:-:|
|EnemyLV(+1)|100|
|EnemyHP(ダメージ×攻撃回数×(時間÷必要討伐数))|1914|
|EnemyDEF(基準DEF)|100|
|EnemyEXP(基準EXP)|100|

なかなかそれっぽい数値になってる気がするなぁ。

##■レベルアップ時間を確認

条件：プレイヤーと敵のLV同じ場合

レベル1→2
10秒
累積時間10秒

レベル50→51
990秒(約16分)
累積時間25000秒（約416分）

レベル99→100
1970秒（約32分）
累積時間（約1634分）

##■レベルアップ時間を確認(プレイヤーと敵のレベルが異なる場合）

計算方法の再確認

- 1体あたりの討伐時間
    - *EnemyHP÷((PlayerSTR-EnemyDEF) * 攻撃回数)*
- 必要討伐数
    - *PlayerEXP÷EnemyEXP*
- レベルアップ時間
    - *1体あたりの討伐時間×必要討伐数*

条件：プレイヤーのLVが敵のLVより5低い場合

- プレイヤーLV50

|項目名| 設定値| 
|:--|:-:|
|PlayerLV(+49)|50|
|PlayerSTR(基準DEF+ダメージ)|102|
|PlayerEXP(基準EXP×必要討伐数)|2805|

- 敵LV45

|項目名| 設定値| 
|:--|:-:|
|EnemyLV(+44)|45|
|EnemyHP(ダメージ×攻撃回数×(時間÷必要討伐数))|837|
|EnemyDEF(基準DEF)|46|
|EnemyEXP(基準EXP)|46|

- 1体あたりの討伐時間
    - 837÷((102-46)×1)=約15秒
- 必要討伐数 
    - 2805÷46=約61体
- レベルアップ時間
    - 15×61=915秒
- レベル50→51
    - 915秒(約15分)

*参考までにレベル99→100は1762秒（約30分）*

条件：プレイヤーのLVが敵のLVより5高い場合

- プレイヤーLV50

|項目名| 設定値| 
|:--|:-:|
|PlayerLV(+49)|50|
|PlayerSTR(基準DEF+ダメージ)|102|
|PlayerEXP(基準EXP×必要討伐数)|2805|

- 敵LV45

|項目名| 設定値| 
|:--|:-:|
|EnemyLV(+54)|55|
|EnemyHP(ダメージ×攻撃回数×(時間÷必要討伐数))|1036|
|EnemyDEF(基準DEF)|56|
|EnemyEXP(基準EXP)|56|

- 1体あたりの討伐時間
    - 1036÷((102-56)×1)=約22.5秒
- 必要討伐数 
    - 2805÷56=約50体
- レベルアップ時間
    - 22.5×50=1125秒
- レベル50→51
    - 1125秒(約18分)

*参考までにレベル95→96は2159秒（約35分）*

計算結果的に弱い敵と戦った方が効率良いっぽいですね。
こういうのを調整していく必要があるということかorz
##■まとめ
自分なりに考えて独自理論展開しておりますが、結局こういうのの積み重ねでバランス調整していくのかなぁと思いました。久しぶりに長めの文章書いたので疲れましたが、なかなか良い感じにまとまった風はあると思います。

この計算式だけでゲームを実装するとバランス悪い！となるかもしれませんが
数値を変えたり計算式を見直したりして調整してみてもいいかもしれませんよｗ

例えば上昇値をレベル10ごとに変えてみるとか、回避率を追加してみるとか、命中を追加してみるとかでまた違った感じになりますね。

とりあえず第一弾はこんなもんでしょうか。（第二弾なんてあるんだろうか。。。）