Claude Media
Claudeでゲームバランスを調整する — 敵CSVから資源収支を検算

Claudeでゲームバランスを調整する — 敵CSVから資源収支を検算

敵ステータス表とレベル表のCSVをClaudeに渡し、到達レベル別のゴールド収支を試算して赤字になる地点を探す手順です。感度の振り方と、仮置きの数値の扱いまで書きます。

RPGの経済バランスは、表を眺めているだけでは破綻点が見えません。敵を倒して得るゴールドと、回復薬や装備で出ていくゴールドを、レベルごとに積み上げて初めて「Lv2で金が足りない」と分かります。

この記事では、敵ステータスとレベル表をCSVにしてClaudeにアップロードし、コード実行で資源収支を試算させて、赤字になる地点を探す手順を書きます。表の数字はすべて説明用に作った仮のもので、実在のゲームの値ではありません。

渡す表は3つに分ける

試算に必要なのは、収入側の表、消費側の表、仮置きの係数です。ひとつの表に混ぜず、役割ごとに分けておくと、後で一部だけ差し替えて比べられます。

ファイル持たせる列役割
enemies.csv持たせる列ゾーン・敵名・出現レベル帯・経験値・ゴールド・薬ドロップ率役割収入と進行速度
levels.csv持たせる列レベル・次のレベルまでの経験値・店で買う装備の費用役割消費と必要撃破数
依頼文の係数持たせる列回復薬の単価・1体あたりの薬使用数役割仮置き(後で振る)

Claudeは、アップロードされたCSVやTSVをコード実行でデータ分析にかけられます。1ファイルの上限は、アップロードもダウンロードも30MBです。

zone,enemy,min_lv,max_lv,exp,gold,potion_drop_rate
草原,スライム,1,4,6,8,0.10
森,ウルフ,5,9,14,15,0.12
洞窟,バット,10,14,30,26,0.15
砂漠,サソリ,15,19,52,40,0.15

レベル表は、次のレベルまでの経験値と、そのレベルで買う装備の費用を並べます。装備を買わないレベルは0にします。

level,exp_to_next,shop_cost
1,40,0
2,70,60
3,110,0
4,170,150
5,260,0
6,380,300

実際には19レベルまで続く表ですが、紙面の都合で6行だけ載せています。

依頼文で計算の前提を固定する

「バランスを見て」とだけ頼むと、Claudeは自分で前提を補います。補われた前提は、結果の読み方を変えます。依頼文では、計算の式と仮置きの値を先に書いてしまいます。

添付の enemies.csv と levels.csv で、レベル1から19までの
ゴールド収支をPythonで試算してください。
 
前提:
- レベルLvの間は、min_lv〜max_lv に Lv が入る敵だけを倒す
- 必要撃破数 = exp_to_next ÷ その敵の経験値(端数は切り上げない)
- 収入 = 撃破数 × その敵のゴールド
- 回復薬の支出 = 撃破数 × 0.35 × 20(単価20、1体あたり0.35個)
- 装備の支出 = shop_cost
- 各レベルの収支と累計を表にし、累計が初めてマイナスになる
  レベルを教えてください
- 仮置きの値(0.35 と 20)は、コード内で変数にしてください

最後の1行が効きます。仮置きを変数に切り出しておけば、後から値だけ変えて同じ表を再計算できます。

試算スクリプトの形と出力

Claudeが返すコードは、おおよそ次のような形になります。ここでは外部ライブラリを使わず、標準ライブラリだけで書いた例を示します。

import csv
 
POTION_PRICE = 20        # 回復薬の単価
POTIONS_PER_KILL = 0.35  # 1体倒すごとに使う回復薬(仮置き)
 
def load(path):
    with open(path, encoding="utf-8") as f:
        return list(csv.DictReader(f))
 
enemies = load("enemies.csv")
levels = load("levels.csv")
 
balance = 0
for row in levels:
    lv = int(row["level"])
    zone = next(e for e in enemies
                if int(e["min_lv"]) <= lv <= int(e["max_lv"]))
    kills = int(row["exp_to_next"]) / int(zone["exp"])
    income = kills * int(zone["gold"])
    potion = kills * POTIONS_PER_KILL * POTION_PRICE
    net = income - potion - int(row["shop_cost"])
    balance += net
    print(lv, zone["zone"], round(kills, 1), round(net), round(balance))
python3 sim.py

このデータで出力される収支の抜粋は次のとおりです。

Lvゾーン必要撃破数装備費そのLvの収支累計
1ゾーン草原必要撃破数6.7装備費0そのLvの収支+7累計+7
2ゾーン草原必要撃破数11.7装備費60そのLvの収支−48累計−42
3ゾーン草原必要撃破数18.3装備費0そのLvの収支+18累計−23
4ゾーン草原必要撃破数28.3装備費150そのLvの収支−122累計−145
5ゾーン森必要撃破数18.6装備費0そのLvの収支+149累計+4
6ゾーン森必要撃破数27.1装備費300そのLvの収支−83累計−79
7ゾーン森必要撃破数38.6装備費0そのLvの収支+309累計+229
14ゾーン洞窟必要撃破数100.0装備費0そのLvの収支+1,900累計+6,287
19ゾーン砂漠必要撃破数150.0装備費0そのLvの収支+4,950累計+20,093

累計がマイナスになるレベルは、Lv2・3・4・6の4か所です。

結果から読めること

数字の並びから、3つのことが言えます。

読み取り

この表が示す3つの問題

  • 序盤の赤字

    草原のスライムは1体8ゴールドで、回復薬の支出が7ゴールド分に迫ります。装備費60のLv2で、すぐに累計がマイナスに落ちます。

  • ゾーン切り替えの段差

    Lv4からLv5で、必要撃破数が28.3から18.6に下がります。森に入ると急に楽になる設計です。

  • 終盤の黒字の膨らみ

    Lv14以降は毎レベル数千ゴールドの黒字です。使い道が装備費しかなく、累計が2万に達します。

序盤の赤字は、経験値は十分なのにゴールドが足りない状態です。プレイヤーは回復薬を節約するか、同じ場所で稼ぎ直すことになります。意図した難度ならそのままで構いませんが、意図していなければ調整の候補です。

終盤の黒字は逆向きの問題です。ゴールドが余ると、装備の価格が意味を失います。金の使い道(強化、宿代、消耗品)を足すか、収入を絞るかの選択になります。

仮置きの数値を振って、効き方を見る

回復薬の使用数0.35は、設計者の勘で置いた数字です。ここを動かして、赤字の範囲がどう変わるかを見ます。依頼文に「0.2、0.35、0.5、0.7で同じ表を作り、累計がマイナスになるレベルを並べて」と添えます。

1体あたりの薬の数累計がマイナスのレベルLv19の累計
0.2累計がマイナスのレベルなしLv19の累計+23,538
0.35累計がマイナスのレベル2・3・4・6Lv19の累計+20,093
0.5累計がマイナスのレベル1〜7と9Lv19の累計+16,647
0.7累計がマイナスのレベル1〜12Lv19の累計+12,054

薬の使用数が0.5を超えると、赤字が序盤だけの問題ではなくなります。このゲームは回復薬の使用量に、収支が大きく左右される造りだと分かります。

もう一つの振り方は、赤字の原因そのものを動かすことです。スライムのゴールドを8から10に上げると、赤字はLv2とLv4に減ります。12まで上げると、赤字はなくなります。

前と後

スライムのゴールドを変えたときの赤字レベル

BEFORE

ゴールド8

累計がマイナスになるのは、Lv2・3・4・6の4か所です。

AFTER

ゴールド12

累計がマイナスになるレベルがなくなります。

Claudeの試算を鵜呑みにしないための確認

コード実行で計算させても、前提が違えば答えは違います。次の点は、毎回自分の目で確かめます。

落とし穴

仮置きの値を、Claudeが黙って埋める

依頼文に書かなかった係数は、Claudeが自分の判断で補います。出力のコードの先頭にある変数と、依頼文の数字が一致しているかを確かめます。薬の単価や使用数が、書いた覚えのない値になっていないかを見る習慣が要ります。

  • 端数の扱いは依頼文で指定します。撃破数を切り上げるかどうかで、累計が数十ゴールド変わります
  • 手元で電卓や表計算を使い、1〜2レベルだけ検算します。全行を再計算する必要はなく、式の形が合っているかが分かれば足ります
  • 試算が表すのは平均的な進行です。実際のプレイヤーは寄り道も逃走もするので、実測のプレイログとは別物として扱います
  • 同じ表を別の会話で再度計算させると、書き方が違うコードが返ることがあります。確定した計算スクリプトは、手元に保存して使い回します

表計算の式で同様の検算を組む手順は、営業コミッションの検算で書いています。実績CSVから月次集計に落とす型は、トンキロ法のCO2排出量の記事と共通です。

結果を企画チームの表計算とグラフに渡す

試算がまとまったら、同じ会話で成果物の形を頼みます。Claudeは、Excelファイル(.xlsx)を式つきで作れます。Pythonで出した数字を貼り付けただけの表ではなく、仮置きの係数をセルに置き、収支の列をそのセルから計算する形にすれば、企画担当が手元で値を変えて試せます。

上の試算を balance.xlsx にまとめてください。
- 1枚目: 回復薬の単価と1体あたりの使用数を入力セルにする
- 2枚目: レベルごとの収支と累計を、1枚目のセルを参照する式で計算する
- 累計がマイナスの行は、表の中で色を付ける

グラフは、PNGなどの画像ファイルとして出せます。レベルを横軸、累計を縦軸にした折れ線を頼むと、序盤の落ち込みと終盤の立ち上がりが一目で見えます。会議に出す資料なら、Word文書やPDFにまとめる指示を重ねられます。

式つきのブックを受け取ったら、Claudeの数字とPythonの出力が一致するかを、先ほどの検算と同じ要領で2〜3レベルだけ確かめます。ブック側の式がPythonと食い違うときは、参照するセルのずれが多い原因です。

調整を回す順番

赤字の原因は、複数の列に分かれています。1回に動かす値を一つに絞ると、どの変更が効いたかが分かります。

手順

バランス調整の1周

  1. 1

    破綻点を特定する

    累計が初めてマイナスになるレベルと、その直前の収支を確認します。

  2. 2

    原因の列を絞る

    収入が低いのか、薬の支出が重いのか、装備費が高いのかを、列ごとに並べて見ます。

  3. 3

    1つだけ動かして再計算する

    スライムのゴールドを動かす、のように一つに絞り、同じスクリプトで表を作り直します。

  4. 4

    感度の表で境界を探す

    値を数段階に振り、赤字が消える境界を表にします。

使える条件と、扱いの注意

ファイル作成とコード実行は、Free・Pro・Maxでは既定で有効です。Teamでは組織の既定で有効ですが、オーナーが組織の設定で無効にできます。ネットワークアクセスはTeamとEnterpriseでは既定で無効で、オーナーが有効にします。CSVの試算だけなら外部への通信は要らないので、ネットワークアクセスが無効のままでも成立します。

使用量にも注意が要ります。ファイル作成の機能は、プランの使用量の枠から消費され、通常のチャットより多く消費します。表を変えて何度も再計算させると、枠の減りが早くなります。

セキュリティ面では、外部のファイルやWebサイトに仕込まれた指示で、Claudeが意図しない動作をさせられるおそれがあります。出所の分からないCSVを、社内の機密データと同じ会話に混ぜません。作業中は、Claudeが予期しないデータにアクセスしていないかを見守ります。

Claudeのコード実行環境の素性をAPI側の資料で見ると、Python 3.11のコンテナで、pandasやnumpy、matplotlibが入っています。インターネットには接続できず、実行時に追加のパッケージをインストールできません。この記事のスクリプトを標準ライブラリだけで書いたのは、この制約と無関係に手元でも動かせるようにするためです。

まとめ

ゲームの経済は、収入の表と支出の表を別に持ち、仮置きの係数を変数として外に出すと、検算が回せます。Claudeに頼む価値は、計算そのものより、係数を振った複数の表をすぐに並べられる点にあります。

赤字になるレベルが見つかったら、数値を直接動かして、赤字が消える境界を探します。境界が見えれば、設計者は「ここまでは苦しくさせたい」「ここからは許さない」を、数字で決められます。

ゲーム制作の全体像はClaude Artifactsでのゲーム制作に、攻略情報をClaudeに尋ねるときの注意はゲーム攻略情報が古い問題にあります。

この記事を共有:XはてブLinkedIn