- ベストアンサー
RPGでのダメージの算出方法について
詳しい方がいそうなのでここでお願いします。 RPGゲームでダメージを計算する時に、そのまんま(味方の攻撃力-敵の防御力)じゃなくて ある程度ランダムにダメージに幅を持たせたいのですが、 その幅のよく使われている計算方法などはあるのでしょうか? 例: ダメージ = ベースダメージ(味方の攻撃力-敵の防御力) +-ある程度の幅 自分なりに考えてみたのですが、どうもしっくりこないんです。 たとえばダメージが1000ほどある場合に、この条件式をだらだら書いていくのは 違うと思いますし、何か基準となるアルゴリズムなどはあるのでしょうか? int haba(int base_damage) { int haba = 0; if(2 <= base_damage && base_damage < 10) haba = rand((base_damage/2+1)); else if(10 <= base_damage && base_damage < 20) haba = rand((base_damage/3)); else if(20 <= base_damage && base_damage < 50) haba = rand((base_damage/4)); else if(50 <= base_damage && base_damage < 100) haba = rand((base_damage/5)); else if(100 <= base_damage) haba = rand((base_damage/6)); if(rand(2) == 0) haba *= -1; return haba; } damage = (base_damage+haba(base_damage));
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
そうですね。 そういうプログラムを作ることはできます。でも、バランス調整的が難しくなったり、クリティカルヒット(必殺の一撃)のありがたみが薄れるので幅があり過ぎるのも問題かも知れませんよ。 それはそれとしてアイデアを書きます。 アイデアのひとつとして、数学的に処理します。 gccで書いた場合ですので、vcだとそのまま使えないかも知れません。 double a=(double)rand(100); double b=10.0f - sqrt(a); で、bは0.0f~10.0fの値を求めることができます。 確率は9~10が出る場合が一番低く2%未満です。 逆に0~1は20%の確率が期待できます。 平方根ではなく、三乗根を使うとさらに確率の変化をつけることができます。 おまけ: バランス調整に入る前に最初の雑魚敵と最後の雑魚敵のパラメータでテストしておいたほうが良いです。装備類を含めて。 最初から最後まで都合よく計算できるダメージ計算式はなかなか簡単には出来ないものですよ。
その他の回答 (5)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・私も回答者 No.2 さんと同じで攻撃力、防御力に乱数を組み合わせる方法が良いと思います。 あと回答者 No.3 さんのアドバイスは私が昔RPGを作ったときのアルゴリズムにかなり近いです。 ・それでもうちょっとアドバイスをすると武器以外にドラクエでいうパラメータ『ちから』や 『運』というパラメータによっても『クリティカルヒット』率が高くなるようにします。 その他ドラクエ3では『ボス戦闘時』にボスは勝手に数ポイントのHPを回復します。 この回復は当然、自動回復になります。通常の『雑魚』には設定しません。 ボスは倒しがいがあった方がよいため自動回復を毎ターンすることで簡単には倒せません。 (例:ボスの HP が 3600 でも毎ターン 50 ptもの HP を回復すると倒すのに時間がかかります) ・よって、今回の質問は (1)キャラクタのパラメータ(ちから、素早さ、運など)を乱数の範囲で使う (2)武器に対する攻撃力、防御力、クリティカルヒット率などを追加 (3)ボス時は自動回復 (4)その他、イベントによるパラメータ などを組み合わせます。 一番、実装が楽な方法は攻撃力、防御力に乱数を用いることです。 このランダム値を武器、キャラクタのパラメータによって変化させます。 ・あと装備している武器の組み合わせで特別に攻撃力が上がったり、防御率が2倍に常になる 条件をつけても面白いです。→例:プラチナシリーズで全身を装備した時の特典など ・その他、防具で『ミラーアーマー』を装備すると 50% の確率で攻撃を跳ね返すという特別な 条件もつけると武器の装備も単純に防御率で装備しなくなるため武器の特徴も考えるのも良い。 最後に: ・キャラクタが『攻撃』コマンドを選択した時の防御値と キャラクタが『防御』コマンドを選択した時の防御値は変えた方が良い。 つまり、 『防御』コマンドを選択した時は通常の『防御値』を使って 『攻撃』コマンドを選択した時は通常の『防御値÷2』の値を使います。 よって、 『攻撃』コマンド⇒『攻撃力(±10%変動) - 防御力÷2(±10%変動)』がダメージ 『防御』コマンド⇒『攻撃力(±10%変動) - 防御力÷1(±10%変動)』がダメージ という感じです。 ・実際にプログラムを組む場合はキャラクタのパラメータに『攻撃変動率』、『防御変動率』を 用意して武器を装備した時、レベルアップ時で『攻撃変動率』、『防御変動率』を設定します。 あるいは戦闘時で使用する特別な変数として管理する方法もあります。この場合は戦闘の開始時点で 計算します。また、戦闘時に武器の装備を変更したときにも計算しなおします。 ・以上。戦闘コマンド、武器(装備品)、キャラクタのパラメータより変動率を算出してばらつかせます。
お礼
ご返答ありがとうございます。 Oh-Orangeさんには毎回お世話になっています。 いつも曖昧な質問ですが、しっかり答えて頂いて感謝しています。 >このランダム値を武器、キャラクタのパラメータによって変化させます。 つまりそれ用のテーブルを用意するということですね。 今まで漠然と考えていたのですが、 たくさん考慮しなくちゃいけないことがありますね。
- gungnir7
- ベストアンサー率43% (1124/2579)
#1です。 >ドラクエ3なんかで、同じ敵、同じ条件で100前後のダメージを与えるケース RPGの戦闘様式は百家百様なので基本はと聞かれても難しい。 誰でも答えられる範囲内となると攻撃力-守備力となってしまいます。 戦闘で使われているルーチンなんていうのは通常公開してくれませんから 相当にやり込んで法則性を見つけ出していくしかないです。 それでは質問のことについて指導いたしますと、 まず、ベースダメージの置き方がよくありません。 ランダムで決める要素はもっと細かく配分した方が変化の幅が広がります。 例えば防御力を例にとりますが、 防具の防御力=rand(鎧の防御力)+rand(盾の防御力)+rand(兜の防御力) 人の防御力=rand(防御の防御力×(剣技のレベル/100)) 式の説明ですが、剣技レベルは剣技のパラメータが最高100です。 100で割っているのは割合の算出のためです。 剣技のレベルが低いと防具を正しく活用できないということで 受けるダメージが大きくなっていきます。 #3の方の言っているように防具ごとにrandの幅を持たせるのであれば、 防具のパラメータにrand幅みたいのを追加すればいいです。 武器でいえばドラクエの魔神の斧みたいな命中率の悪い武器を表現することもできます。 このようにrandを細かく配置することによってアイテムや技術といった要素にも 単なる数値の塊から、リアリティを含んだパラメータに躍動します。 設計にも柔軟性が増していますから あなたが質問したような力まかせのコードも随分減るはずです。 実際にrandを置く位置はある程度完成した時点で、 戦闘とのバランスを考えながら見直すことになります。 こうしてパラメータと与式を調整していきます。 プロジェクトなら設計もなしにプログラムに取りかかることはありませんが、 個人で研究しているようですから、どこかで設計をしっかり見直して下さい。 設計を見直すとは文書でしっかりと定義してドキュメントを残すことです。
お礼
ご返答ありがとうございます。 なるほど、ベースダメージの中の各々の値を細かく設定することで 最終的にダメージに幅が出るということですね。 >どこかで設計をしっかり見直して下さい。 たしかにこれは基本中の基本なんでしょうけど苦手で、 どうも自分は結局後から泣く泣く苦労するはめになるんですよね・・・
- zwi
- ベストアンサー率56% (730/1282)
コマンド式のRPGだとして回答します。アクション系のRPGだとあまりランダム性を持たせるとバランス調整をしずらくなるんで。 簡単に済ます方法としては、攻撃力に±10%程度のランダムの幅を持たせることで結構ダメージに変化を持たせられます。 ※ ランダムの幅も武器によって変えてやると面白いかも。 それ以外に、数%の割合でクリティカルヒットの別の計算式も用意しておくと戦いに意外性が出てきますね。 雑魚とは別にボスの時専用の計算式を用意しておくとバランス調整時に便利です。 もし細かく調整したいなら、if文でだらだらと条件を書いていくのは後々調整時にも困ると思うのでテーブル化をお勧めします。
お礼
ご返答ありがとうございます。 やっぱり幅の基本は10%前後ですよね。 でも例えばドラクエ3なんかで、同じ敵、同じ条件で100前後のダメージを与えるケースで 時たま70台とか出るときないですか?(自分の記憶違いかな?でもあったような・・) もしあったとして、そこらへんのランダムの幅を作り出すアルゴリズムというか そういうのが知りたいです。 自分の考えでは単純にさらにランダム要素を追加するぐらいしか浮ばないですけど・・・
- hi-mi-tsu
- ベストアンサー率12% (1/8)
こういうモノは全々作ったことないですが、こういうのはどうでしょうか? ダメージ = 攻撃力*ランダム値1 - 防御力*ランダム値2 ランダム値を出す方法は そのときそのときで、ビックリするようなダメージが出るのが イヤな場合は、必然的にランダム値が 1.1, 1.2 とかになると思うので 浮動小数点がいいかもしれません。
お礼
ご返答ありがとうございます。 なるほど、攻撃力、防御力、それぞれにランダムを付けるということですか。 なんとなくですが良い感じになりそうですね。
- gungnir7
- ベストアンサー率43% (1124/2579)
基本となるアルゴリズムは(味方の攻撃力-敵の防御力)しかないですよ。 これにどう肉付けしていくかはゲームの条件によって変わってきますし、 パラメータの大小はテスト(プレイ)しながら調整していくしかない。 肉付けの仕方にしても、いきなりさてと考えるのは無謀で、 大抵は他のゲームをやっていてこんなのが不満だとか、 私ならこうしてみたいという願望や構想みたいのがあるはずです。 >たとえばダメージが1000ほどある場合に、この条件式をだらだら書いていくのは 文法的な問題でいえばswitch~caseを使えば構造はすっきりします。 分岐がたくさんなのが嫌ならば少数の分岐で済む式を考えるべきです。 (普通はそうします) それが叶わないのなら、力まかせのコードもやむなしです。 設計に自信があって、その上で技術的な問題をどうしましょうと 聞いているようにもみえないのですが・・・ 設計をもう少し練り直してみてはどうでしょうか?
お礼
ご返答ありがとうございます。 たしかに設計に自信がなくて(というより勉強不足)、 それも試行錯誤しながらなのですが、いずれにしろこのままじゃ行き詰まりますね・・・ ダメージに肉付けしていく部分で、その肉付けの数値の定番(?)となる算出方法が あるのかなと思ったのですが、やっぱり最後は1つ1つ調整していくことになりそうですね。
お礼
ご返答ありがとうございます。 なるほど、平方根を使えばいいんですね。 たしかにそうすれば、いい感じにばらつきますね。 >最初から最後まで都合よく計算できるダメージ計算式はなかなか簡単には出来ないものですよ。 ええ、これは皆さんからの意見で理解しました(したいと思います) 根本はそういうことですね。 今回はどの意見も為になったので本当は全てにポイントしたいのですが、ご了承下さい。