- ベストアンサー
RPGでの雑魚敵に対する経験値の振り分け方について
またよろしくお願いします。 例えばレベル1から99まであった時に、 レベル1から2に上がるには敵との戦闘を凡そ6回必要だとします。 レベル2から3は凡そ8回だとします。 ただ、この8回はもらえる経験値が増えた状態での8回です(この必要戦闘回数決め方も知りたいです) そういうふうにレベルが上がれば敵からもらえる経験値が増え、 レベルアップに必要な戦闘回数も増えてくると思います。 ただ雑魚敵は必ずしも1体で出てくるわけではないので、 1体にどのくらいの経験値を与えてやるのかなどを考える必要があると思います。 このようなある程度決まった(プログラムで処理できる)振り分け方あるのか、 それとも手動で1つ1つやっていくものなのでしょうか? もちろん微調整などは手動だと思いますが。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★戦闘回数の意味がようやく分かりました。 >ファミコン版のドラクエ(通常RPG)と同じです。 ↑ そうなんですか。 それなら、およそn回戦って次のレベルに上がるというのは経験値を上手く設定した場合の 事ですね。ドラクエでは仲間レベルの合計とモンスターレベルを上手く使って同じ場所でも 仲間のレベルによっては出現する『雑魚敵』の数が変ります。 ・たとえば最初は1人でアリアハンのスライムと戦いますがこのとき 1~3匹しか現れません。 でも仲間が増えたり、レベルが高いと同じアリアハンでもスライムが最大で9匹も現れます。 さらに夜はモンスター・レベルが 2 つ上がるようです。これにより、レベルが低くても 夜だとスライムの出現数が増えるのです。 これは、夜の概念やモンスター・レベルを上手く利用しているわけです。 >ドラクエの場合、1匹1匹の敵の経験値は手動で決めているのでしょうか? >それとも逆算できるような計算で決めているのでしょうか? ↑ 手動で決めていると思います。 ガイドブックのデータがそのまま固定データとして持っているのでしょう。 なのでガイドブックの情報がかなり参考になると思います。 モンスターレベルもゲーム中に町の人がちゃんとメッセージで言っています。 このことから夜はモンスター・レベルが上がり、敵数が増えることがわかります。 >つまりレベル8の時に、アリアハンでスライムと戦ってたら、たくさんの戦闘回数が必要になりますよね。 ↑ これはモンスターの経験値が固定だからです。 でも仲間のレベルに応じて最初は1~3匹しか出現しなかったスライムが、レベルが高いと最大で 9匹も現れるようにプログラムで行っているようです。 ・今回の質問はレベルアップまでの次の経験値を指数的に増えるように数列を使って求めれば 良いと思います。そうすれば終盤では戦闘回数を多くしないとレベルアップできないように なります。もし、指数的ではなく正比例するような経験値だと終盤では敵の経験値が高いので 簡単にレベルアップしてしまいます。 ・この数列がゲームのバランスになります。 また、職業によっても数式を可変できるようにしておくことで『職業による特徴』を持たせる ことが出来ます。例えば、勇者はバランスよく、魔法使いは経験値をたくさん稼がないとレベルアップ しないとか、賢者は魔法使いよりももっと経験値を稼がないとレベルアップできないようにするわけです。 ・下にドラクエの次の到達経験値に近い計算が出来たサンプルを載せておきます。 #include <stdio.h> #include <stdlib.h> #define ERR (-1) /* 経験値のレベルアップを計算 */ static long Calc_Expert( int level, int begin, int sub, int div ) { unsigned long dif = 0L; unsigned long exp = 0L; unsigned long top = 2L; unsigned long bas = 1L; int lv; for ( lv = 1 ; lv < level ; lv++, exp += dif ){ if ( !((lv - sub) % div) ){ bas = (bas * 2L); top = (bas + 1L); } if ( bas == 0L ){ return( ERR ); } if ( lv == 1 ){ dif = begin; } else{ dif = (dif * top / bas); } } printf( "%3d: %10lu %10lu %10lu/%lu\n", level, dif, exp, top, bas ); return exp; } /* テスト用のメイン関数 */ int main( int argc, char *argv[] ) { static int level, begin = 12, sub = 4, div = 8; if ( argc > 1 ) begin = atoi( argv[1] ); if ( argc > 2 ) sub = atoi( argv[2] ); if ( argc > 3 ) div = atoi( argv[3] ); printf( "\n Lv: (等差) (経験値) (倍率)\n" ); for ( level = 1 ; level <= 100 ; level++ ){ Calc_Expert( level, begin, sub, div ); } return 0; } その他: ・コマンドラインから引数を与えるといろいろと経験値が変化します。 引数1…開始経験値 引数2…加速度の補正制御1 引数3…加速度の補正制御2 だったと思います。 もう10年以上前なので正確なパラメータの呼び名を忘れてしまいました。 サンプル・ソースの begin=12、sub=4、div=8 はスーパーファミコン版のドラクエIIIの 戦士のレベルアップ経験値の設定です。 勇者なら引数1を 29 で引数2、3 は忘れました。微調整して下さい。 ・以上。参考に。
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★最初に。 ・ドラクエはレベルアップするために必要な『次の到達経験値』が予め計算されています。 この計算式は数列を使っていますがかなり複雑です。昔ほぼ同じ数式を試行錯誤で探しましたので。 ドラクエの場合は『敵』からもらえる経験値が固定でレベルアップする次の『到達経験値』が 数列により変化します。また、モンスターレベルが存在して仲間のレベル合計と比較して 敵パーティの出現数(パターン)が決まります。→スーパーファミコンの『ドラクエIII』の場合。 ・今回の質問は『敵』もレベルアップに応じてもらえる経験値が変化するんですね。 この考えだと戦闘回数と経験値との対応が難しくなりませんか? どちらか一方を基準にレベルアップさせた方が良いと思います。 ・戦闘回数を基準にする場合は1つの戦闘でもらえる『全体の平均経験値』と『レベルアップまでの戦闘回数』 を掛けた値を次にレベルアップするための『到達経験値』とすれば良い。 ・経験値を基準にする場合は次のレベルアップするための『到達経験値』を先に計算します。 そして『レベルアップまでの戦闘回数』で割った数を1つの戦闘でもらえる『全体の平均経験値』と します。この平均経験値を元に『雑魚敵』の出現数(パターン)を戦闘開始時に計算します。 例えば戦闘後にもらえる平均経験値が 100 のとき 最初は 敵1…Exp=20 敵2…Exp=20 敵3…Exp=30 敵4…Exp=30←(20+20+30+30=100) となります。そしてレベルアップして敵の経験値が増大すると次の戦闘時では 敵1…Exp=25 敵2…Exp=25 敵3…Exp=40←(25+25+40=90)…100以内に出現数を計算で合わせる の3体が出現するように出現数(パターン)を計算で組み合わせます。 このようにした場合、敵のもらえる経験値もレベルに応じて簡単な数列で計算により算出するように 管理すれば良いと思います。このときの数式は敵により異なるように管理しても良いでしょう。 そうすれば 敵1はあまり経験値が増えない。 敵2はよく経験値が増える。 敵3は経験値が減少していく。 などのバリエーションを出せます。 ・もう一度、敵からもらえる経験値の管理を整理してみて下さい。 あとレベルアップする数式とかも単純に LV×100 なのか、指数的に増加させるのかも整理してみましょう。 その他: ・地形によりモンスターの出現率を設定できるようにすれば、終盤で訪れるマップには戦闘する確立が 高くなるように設定できます。また、洞窟や塔などは草原に比べてよく敵と遭遇すうようにも設定 できます。さらに発展させるとゲームイベントで一歩歩くごとに必ず敵と遭遇して戦闘状態になる設定や 全く戦闘状態にならないようにイベント命令で制御することが可能になります。 最後に: ・地形(マップ)の管理構造、ゲームイベントを制御する簡易言語なども含めてもう一度、仕様を 整理すべきだと思います。どんな演出を可能にするか、どんな戦闘方法かもきちんと決めてから プログラミングした方が効率が良いですよ。 ・以上。
お礼
ご返答ありがとうございます。 なるほど、イベントなどと絡めるとさらに考慮することが増えそうですね・・・ >・今回の質問は『敵』もレベルアップに応じてもらえる経験値が変化するんですね。 自分の説明が悪いんですけど、ここはそうではなくて別の敵(強さも経験値も以前の敵より上ですよね) になるので、その状態で戦闘回数も増えてくるということです。 ファミコン版のドラクエ(通常RPG)と同じです。 レベル1の時はアリアハンでスライム(経験値1だとします)などと凡そ5回戦って次のレベルに上がります。 レベル8ぐらいの時はロマリアでさまよう鎧(経験値10だとします)などと凡そ15回戦って次のレベルに上がります。 つまりレベル8の時に、アリアハンでスライムと戦ってたら、たくさんの戦闘回数が必要になりますよね。 >ドラクエの場合は『敵』からもらえる経験値が固定 とあるのですが、ドラクエの場合、1匹1匹の敵の経験値は手動で決めているのでしょうか? それとも逆算できるような計算で決めているのでしょうか? >どんな演出を可能にするか、どんな戦闘方法かもきちんと決めてからプログラミングした方が効率が良いですよ。 ここは自分でも身にしみて感じています・・・ 今回はプログラムの勉強だと割り切ってやっている部分もあるので、 新たな発見ができれば幸いです。
- zwi
- ベストアンサー率56% (730/1282)
前に答えたことがあった人かな。確かダメージ計算式で。 ここに書いたのは自分ならこうすると言う話であって、唯一の答えではありません。 (1)レベルアップと戦闘回数。 最初は少ない戦闘回数で上がりやすく設定します。最初戦闘パーティの人数が少ないでしょうから、敵の数も少なめで。ドラクエ的なバランスなら2~3回の戦闘でレベル上がっても良いかもしれません。 途中からは戦闘回数が増えるようにして行きますが、1レベルに必要な戦闘回数があまり増えすぎるのも問題なので、1レベルに2~1回づつ増えるぐらいでよいのでは?増え方も後半ほど少なくしたほうが良いかと思います。 例えば、 レベル1→2(3回) レベル 9→10(19回)ここら辺まで2回ずつ増える。 レベル10→11(20回)ここらから1回ずつ。 レベル19→20(30回)ここらからさらに減らします。 レベル29→30(35回)ここらからさらに減らします。 といった感じでしょうか。 プログラムで想定回数は算出できると思います。 もしクリアレベルが50ぐらいだとすれば、レベル50以降は同じ戦闘回数でレベルアップできたほうが良いと思いませんか? これはあくまで想定レベルでの戦闘回数ですので、実際にやってみると想定と印象がぜんぜん違う事がほとんどです。 あくまで最初にパラメータを決める基準だと思ってください。 (2)最終的な戦闘回数の決め方 実際には1戦闘のターン数や敵のバリエーション数で決まります。ようするに飽きない、単調にならない回数で抑えないと面白くありません。 想定した戦闘回数より少なくしないと無理がある場合は、1戦闘の経験値を増やしてやってバランスをとります。ここは手作業です。 中、大ボス前は、レベルを上がりやすくしたり、レベルの上がりやすい場所やレベルの上がりづらい場所を作ったりするもサジ加減です。 新しい土地に移った当初は、レベルが上がりやすいと気持ちよかったりしますよね。そういう緩急をつけないと味が出ません。 (3)モンスター毎の経験値の振り分け。 これも想定戦闘回数と経験値と敵パーティの構成、敵パーティの出現率から計算で求められます。ただし、モンスター毎に強さが違うでしょうから割り振る経験値は差を出せるような係数データを手作業で作っておく必要があります。
お礼
ご返答ありがとうございます。 >1レベルに2~1回づつ増えるぐらいでよいのでは?増え方も後半ほど少なくしたほうが良いかと思います。 自分の中では、終盤に進むにつれ、戦闘回数がどんどん増えてくイメージがあったのですが、 実際はそんなに増えてないかもですね。基本となる戦闘回数が多くなってるので そう思えるだけだったのかも・・・ >実際には1戦闘のターン数や敵のバリエーション数で決まります。 なるほど、ここまでは考えてなかったです。確かに考慮に入れる必要があるかも。 >割り振る経験値は差を出せるような係数データを手作業で作っておく必要があります。 なんとなくですが、方向性が見えたような気がします。ありがとうございます。
決め方は どこを基準にするか 良くあるのが Lvごとに差を取ると同じ、または一定の規則を持っているもの。 必要経験値 Lv1 … 100 (100) Lv2 … 300 (200) Lv3 … 600 (300) Lv4 … 1000 (400) この分布に従いLv帯域での平均的な強さを求め敵の強さと経験値を決定すれば良い。 差を取ると同じっていうのは、大抵はLvが上昇すると同じ獲得方法では経験値が下がるというやり方。 これはそのLvで、次へ上がるための経験値が同じなのでそのLv帯域での強さでの敵の経験値が設定しやすくなる。 必要経験値 Lv1 … 1000 (1000) Lv2 … 2000 (1000) Lv3 … 3000 (1000) ただし敵は「基本EXP / Lv」で獲得経験値を求める のようなやり方。 他にもあるけど 参考まで。
お礼
ご返答ありがとうございます。 結構いろんなやり方がありますね。 経験値が下がるというのはなんか簡単そうでいいですね。 でも下がるというのが少し抵抗があるかな、あんまりそういうRPGを見かけないので。
お礼
ご返答ありがとうございます。 >同じ場所でも仲間のレベルによっては出現する『雑魚敵』の数が変ります。 結構3やってるんですけど、自分は気づかなかったですね・・・ 今度やる時があったら注意して見てみたいと思います。 サンプルありがとうございます。 これは凄いですね・・・一覧見たときちょっと感動しました。 指数使ってるので、少し弄っただけで大きく結果が違ってきますね。 これからいろいろ調整してみたいと思います。