カテゴリー: Minecraftプラグイン

AIチームでマイクラサーバーを作る#3数値×10、12時間の経験値曲線、クラス6種のシミュレーション! 📊

この記事は韓国語の原文から翻訳したものです。

ひと目でわかる要点

「ダメージも体力も豪快に」という一言を実際の数値に変えていく過程です。すべての設定を10倍にしつつ運営者が変えた値には触れない1回限りの移行、Excelで直せる経験値テーブル、そして「基本武器が強すぎる」という意見をシミュレーションで検証したら、原因は計算式ではなく武器の攻撃速度だったという話。

  • Paper 1.21.11 · サーバー設定ファイル · 2026-09-28〜30 実際に適用・シミュレーション
  • ×10移行は「旧デフォルト値のままの項目だけ」を一度だけ変更し number-scale: 10 を記録 — 運営者が変えた値は保持
  • 経験値曲線の目標:1→30レベルで約12時間、序盤は速く · 区間ごとに平坦な区間
  • クラス間DPS差±40%の主な原因は計算式ではなく武器の攻撃速度の差(斧 0.8回/秒 vs 剣 1.6回/秒)
目次9項目

こんにちは!Mojangcamです 😎

前回の#2では、プラグインの構造と 1000029 ダメージ事件を扱いました。今回はゲームの数値の話です。

RPGサーバーを作っていると、こんな声が出てきます。

「ダメージも豪快に入って、体力も豪快に増えてほしいです。」

良い方向性ですが、これを実際の数値に落とし込むのはなかなか厄介です。今回は

  • 🔢 体力・ダメージをまとめて10倍にした方法
  • 📈 「30レベルまで12時間」の経験値曲線づくり
  • ⚖️ 「基本武器が強すぎる」という意見をシミュレーションで検証した結果

をまとめます。数値を決めるのは企画チームAI、コードに組み込むのは各開発チーム、選ぶのは人間です。


📌 ステップ1 - 数値×10:「見える数値」を大きくする 🔢

何を10倍にするか

10倍にする(固定値) そのまま(割合・その他)
体力、攻撃力、魔法攻撃力 %オプション、倍率
武器の基本ダメージ、固定追加ダメージ 防御力(割合の式なので)
ポーションの固定回復量、モブの体力・ダメージ マナ、経験値、金貨

防御力を10倍にしてはいけない理由が面白いんです。防御の式が 방어 / (방어 + 100)(防御 / (防御 + 100))なので、防御25(20%軽減)を250にすると71%軽減になってしまいます。割合の式に入る値をいじると、バランスが崩れます。

すでに動いているサーバーでどう変えるか

一番難しかったのはすでに設定ファイルがあるサーバーでした。運営者がゲーム内でモブの体力を直接変えているかもしれないからです。そこで、すべてのモジュールが同じルールで一度だけ移行するようにしました。

Python
# 各モジュールがサーバー起動時に一度だけ行う処理(実際はJava、流れだけPythonで)
if config.get("number-scale", 1) != 10:
    backup(config_file)                      # 1) 変更前にバックアップ
    for key, old_default in OLD_DEFAULTS.items():
        if config[key] == old_default:       # 2) 旧デフォルト値「そのまま」のものだけ
            config[key] = old_default * 10   #    10倍に
        else:
            log(f"{key} は運営者が変更した値なのでそのまま")
    config["number-scale"] = 10              # 3) 記録 → 次回からはもう実行しない
    save(config)

一つずつ見ていきましょう 💡

  • number-scale の記録:サーバーを2回起動しても100倍にならないようにします。
  • 旧デフォルト値だけ変更:運営者が触った値には意図があるとみなして残します。その代わりログに一覧を残して、人が直接確認できるようにします。
  • バックアップが先:移行が失敗しても元に戻せます。

実際にサーバーを一度再起動すると、core・戦闘・アイテム・レベル・モブの各モジュールがすべてログに「×10移行」を残し、エラーは0件でした。

あわせて決めた補正もあります。

項目 値
クリティカル倍率 ×1.5 → ×2.0
通常モブの体力 ランク倍率 1.0 → 0.9(通常攻撃4発で倒せるように)
モブが自分よりレベルが高いときのダメージ 差 ≤2: 100% · 3: 80% · 4: 50% · 5以上: 固定 1
ラストヒット経験値の上限 自分のレベル +4 のモブの経験値まで(高レベルモブのラストヒット稼ぎ防止)

📌 ステップ2 - 経験値曲線:1→30レベルで12時間 📈

目標は1→30レベルで約12時間、そして序盤は速くでした。序盤が遅いと人が離れていくからです。

最初はなめらかな曲線で作りましたが、企画チームAIに「区間ごとに感触が違う曲線」を改めて依頼しました。結果はこんな形です。

区間 形 意図
Lv 1〜9 人が直接決めた値、とても速い 最初の30分で何度もレベルアップ
Lv 10〜14 平坦な区間 新しい狩場に慣れる
Lv 15〜29 レベルごとに×1.2程度で上昇 成長を実感できる
Lv 30以降 5レベルごとに平坦 + 倍率が徐々に小さくなる(×1.08 → ×1.075 → …) 際限なく急にならないように
  • 結果:1→30の累計12.0時間、総経験値281,150
  • ファイルは exp_table.csv 1つだけなので、Excelで開いて直して /리로드 level(リロードコマンド)を打てばすぐ反映されます

ここにレベル差による経験値ペナルティを付けました。自分よりかなり低いレベルのモブを倒すと、経験値が減ります。

モブが自分より低いレベル差 0〜3 4 5 6 7 8 9 10+
もらえる経験値 100% 90% 60% 45% 30% 20% 15% 10%

📌 ステップ3 - 「基本武器が強すぎる」→ シミュレーション ⚖️

テストしていた人たちの間で「クラスの基本武器が強すぎる」という意見が出ました。望んでいる方向はこうでした。

武器ダメージは序盤に強く、後半は攻撃力・貫通・クラスステータスのほうがずっと重要になってほしい。

チームリーダーが計算式の草案を作り、企画チームAIにクラス6種 × レベル7段階 × ステータス配分2通り × 計算式3通り = 252通りを計算させました。

提案した計算式(草案)

Python
# 攻撃力:レベル・装備・ステータスが積み上がる側
ATK = (base_attack + growth_attack(level) + gear_flat_attack) \
      * (1 + main_stat * 0.005 + sub_stat * 0.002)

# 基準ダメージ:武器ダメージはステータスの影響を受けない
B = weapon_damage + ATK

# 防御:レベルが上がると、同じ防御力の効率が少しずつ下がる
effective_def = max(0, defense - flat_pen) * (1 - pct_pen)   # 貫通は固定値が先、次に%
K = 100 + attacker_level * 5
damage = B * K / (K + effective_def)

シミュレーション結果

項目 今の計算式 計算式だけ変更 計算式 + 攻撃速度の調整(おすすめ)
武器が占める割合 Lv1 → Lv30 100% → 14〜21% 45〜58% → 10〜16% 58% → 7%
クラス間のDPS差 −41% 〜 +43% −43% 〜 +44% −7% 〜 +11%
通常攻撃で通常モブを倒す攻撃回数 Lv15で5発 Lv15で5発 全レベルで4発

面白いのは真ん中の列です。計算式だけ変えてもDPS差はそのままなんです。原因を掘り下げてみると、計算式ではなく武器の攻撃速度でした。

  • 斧:毎秒0.8回
  • 剣・短剣:毎秒1.6回
  • 魔法弾:毎秒1.67回

一撃のダメージをいくら揃えても、斧は半分しか攻撃できないので、DPSが開くのは当然ですよね。そこでおすすめ案はまず攻撃速度を揃える(斧・弓 1.0回、剣・短剣・魔法弾 1.25回)でした。

人が「基本武器が強い」と感じたのは、実は序盤はダメージの100%が武器から出ていて、ステータスは10ポイントにつき1%しか上がらないので、武器以外に実感できるものがなかったからでした。感覚は正しかったけれど、原因は別のところにあったわけです。

⚠️ この計算式v2はまだ提案段階です。最初の統合テストは今の計算式で行い、決定したら適用する予定です。


📌 AI企画チームを使って感じたこと 💬

  1. 「感覚」を数値に翻訳するのが得意です。 「豪快に」を「Lv1で一撃101 → Lv30で1,937、通常攻撃4発」のような表に変えてくれます。
  2. 前提を必ず書かせる必要があります。 攻撃速度、装備の強化段階、狩りの速度などを自分で決めて計算するので、レポートに「前提」の表がないと結果を信じにくいです。
  3. 決めるのは人間の役目です。 AIはおすすめ案をいくつも作り、影響を受けるモジュールまで整理してくれますが、何を選ぶかはゲームを作る人が決めるべきです。

📌 まとめ

  • 数値×10は固定値だけ、移行は一度だけ、運営者が変えた値は保持
  • 経験値はExcelで直せる表1つ、1→30レベルで12時間
  • バランスへの不満の原因は、計算式ではなく攻撃速度でした — シミュレーションがなければ、計算式ばかりいじり続けていたはずです

次回は絵の話です。ChatGPTにGUI・アイコン・武器の絵を任せてClaudeが検品するパイプラインで、検品が見つけた事故(名前が入れ替わった弓、表示されない背景、ノイズが走る弓)を取り上げます。お楽しみに 🙌

この記事は私が方向性を決め、Claudeと一緒にまとめました。このサーバーは個人プロジェクトであり、マインクラフトの公式コンテンツではなく、Mojang・Microsoftとは関係ありません。

連載 · 全5回中3回目

AIチームでマイクラサーバーを作る

  1. #1AIリーダー1人 + メンバー15人でMMORPGプラグインを作る仕組み! 🤖
  2. #21つのプラグインにモジュール13個!コア構造と「1000029ダメージ」事件 🧩
  3. #3数値×10、12時間の経験値曲線、クラス6種のシミュレーション! 📊現在の記事
  4. #4ChatGPTが描いてClaudeが検品するリソースパック・パイプライン! 🎨
  5. #5Discordボットで開発チームを運営!決定フォーラム・コマンド一覧・リソースパックチャンネル 🤝

著者

Mojangcam

自分でコードを書き、サーバーを動かし、詰まったエラーを解決しながら学んだことを記録する開発・IT実践ブログ