詳しい方がいそうなのでここでお願いします。
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));
No.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%の確率が期待できます。
平方根ではなく、三乗根を使うとさらに確率の変化をつけることができます。
おまけ:
バランス調整に入る前に最初の雑魚敵と最後の雑魚敵のパラメータでテストしておいたほうが良いです。装備類を含めて。
最初から最後まで都合よく計算できるダメージ計算式はなかなか簡単には出来ないものですよ。
ご返答ありがとうございます。
なるほど、平方根を使えばいいんですね。
たしかにそうすれば、いい感じにばらつきますね。
>最初から最後まで都合よく計算できるダメージ計算式はなかなか簡単には出来ないものですよ。
ええ、これは皆さんからの意見で理解しました(したいと思います)
根本はそういうことですね。
今回はどの意見も為になったので本当は全てにポイントしたいのですが、ご了承下さい。
No.5
- 回答日時:
★アドバイス
・私も回答者 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さんには毎回お世話になっています。
いつも曖昧な質問ですが、しっかり答えて頂いて感謝しています。
>このランダム値を武器、キャラクタのパラメータによって変化させます。
つまりそれ用のテーブルを用意するということですね。
今まで漠然と考えていたのですが、
たくさん考慮しなくちゃいけないことがありますね。
No.4
- 回答日時:
#1です。
>ドラクエ3なんかで、同じ敵、同じ条件で100前後のダメージを与えるケース
RPGの戦闘様式は百家百様なので基本はと聞かれても難しい。
誰でも答えられる範囲内となると攻撃力-守備力となってしまいます。
戦闘で使われているルーチンなんていうのは通常公開してくれませんから
相当にやり込んで法則性を見つけ出していくしかないです。
それでは質問のことについて指導いたしますと、
まず、ベースダメージの置き方がよくありません。
ランダムで決める要素はもっと細かく配分した方が変化の幅が広がります。
例えば防御力を例にとりますが、
防具の防御力=rand(鎧の防御力)+rand(盾の防御力)+rand(兜の防御力)
人の防御力=rand(防御の防御力×(剣技のレベル/100))
式の説明ですが、剣技レベルは剣技のパラメータが最高100です。
100で割っているのは割合の算出のためです。
剣技のレベルが低いと防具を正しく活用できないということで
受けるダメージが大きくなっていきます。
#3の方の言っているように防具ごとにrandの幅を持たせるのであれば、
防具のパラメータにrand幅みたいのを追加すればいいです。
武器でいえばドラクエの魔神の斧みたいな命中率の悪い武器を表現することもできます。
このようにrandを細かく配置することによってアイテムや技術といった要素にも
単なる数値の塊から、リアリティを含んだパラメータに躍動します。
設計にも柔軟性が増していますから
あなたが質問したような力まかせのコードも随分減るはずです。
実際にrandを置く位置はある程度完成した時点で、
戦闘とのバランスを考えながら見直すことになります。
こうしてパラメータと与式を調整していきます。
プロジェクトなら設計もなしにプログラムに取りかかることはありませんが、
個人で研究しているようですから、どこかで設計をしっかり見直して下さい。
設計を見直すとは文書でしっかりと定義してドキュメントを残すことです。
ご返答ありがとうございます。
なるほど、ベースダメージの中の各々の値を細かく設定することで
最終的にダメージに幅が出るということですね。
>どこかで設計をしっかり見直して下さい。
たしかにこれは基本中の基本なんでしょうけど苦手で、
どうも自分は結局後から泣く泣く苦労するはめになるんですよね・・・
No.3
- 回答日時:
コマンド式のRPGだとして回答します。
アクション系のRPGだとあまりランダム性を持たせるとバランス調整をしずらくなるんで。簡単に済ます方法としては、攻撃力に±10%程度のランダムの幅を持たせることで結構ダメージに変化を持たせられます。
※ ランダムの幅も武器によって変えてやると面白いかも。
それ以外に、数%の割合でクリティカルヒットの別の計算式も用意しておくと戦いに意外性が出てきますね。
雑魚とは別にボスの時専用の計算式を用意しておくとバランス調整時に便利です。
もし細かく調整したいなら、if文でだらだらと条件を書いていくのは後々調整時にも困ると思うのでテーブル化をお勧めします。
ご返答ありがとうございます。
やっぱり幅の基本は10%前後ですよね。
でも例えばドラクエ3なんかで、同じ敵、同じ条件で100前後のダメージを与えるケースで
時たま70台とか出るときないですか?(自分の記憶違いかな?でもあったような・・)
もしあったとして、そこらへんのランダムの幅を作り出すアルゴリズムというか
そういうのが知りたいです。
自分の考えでは単純にさらにランダム要素を追加するぐらいしか浮ばないですけど・・・
No.1
- 回答日時:
基本となるアルゴリズムは(味方の攻撃力-敵の防御力)しかないですよ。
これにどう肉付けしていくかはゲームの条件によって変わってきますし、
パラメータの大小はテスト(プレイ)しながら調整していくしかない。
肉付けの仕方にしても、いきなりさてと考えるのは無謀で、
大抵は他のゲームをやっていてこんなのが不満だとか、
私ならこうしてみたいという願望や構想みたいのがあるはずです。
>たとえばダメージが1000ほどある場合に、この条件式をだらだら書いていくのは
文法的な問題でいえばswitch~caseを使えば構造はすっきりします。
分岐がたくさんなのが嫌ならば少数の分岐で済む式を考えるべきです。
(普通はそうします)
それが叶わないのなら、力まかせのコードもやむなしです。
設計に自信があって、その上で技術的な問題をどうしましょうと
聞いているようにもみえないのですが・・・
設計をもう少し練り直してみてはどうでしょうか?
ご返答ありがとうございます。
たしかに設計に自信がなくて(というより勉強不足)、
それも試行錯誤しながらなのですが、いずれにしろこのままじゃ行き詰まりますね・・・
ダメージに肉付けしていく部分で、その肉付けの数値の定番(?)となる算出方法が
あるのかなと思ったのですが、やっぱり最後は1つ1つ調整していくことになりそうですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- 英語 in the head の意味 4 2023/07/15 07:52
- 英語 When located outside the lateral wall, it is susce 1 2023/03/03 20:55
- C言語・C++・C# プログラミングの問題です。写真のプログラムの1から10を下のように入力しましたがプログラムが上手くい 3 2022/07/01 23:31
- インターネットビジネス BASEの機能の相談です 1 2023/04/23 14:58
- 英語 After exporting the planned implant position, a to 2 2022/10/31 17:48
- インターネットビジネス 超初心者です。 BASEでネットショップを考えております。(シイレル)と言う食品飼育サイトから食品食 3 2022/07/19 22:40
- その他(ネットショッピング・通販・ECサイト) クリックポストでBASEやストアー等で売れた商品の発送元をシールのラベルに印字して発送したいですが、 1 2022/06/04 23:49
- その他(車) 軽自動車に普通車のタイヤ+ホイールsetは装着可能でしょうか? 4 2022/12/10 22:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
データリーダーからのデータ読...
-
このプログラムなんですがsheet...
-
表示を標準か改ページプレビュ...
-
VBで定期的にタイムサーバに時...
-
Windowsのバッチファイルでcall...
-
VBEを開くのにコマンド名が「Vi...
-
system関数のエラー検出
-
find コマンド(Unix)
-
gmailでのimap設定
-
Visual C++からftpを使う
-
PowerShellでテキスト内にコマ...
-
ExcelVBA WorkSheet上の全てのC...
-
シリアル通信でのread関数の戻り値
-
Excelで外部のファイルの場所を...
-
PCに保存していた写真を見られ...
-
拡張子をつくる
-
MkDir パス名が無効です
-
linux duコマンドで困っています。
-
ExcelVBAでリンク先の対象のフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Teratermマクロの戻り値の取得失敗
-
Windowsのバッチファイルでcall...
-
Visual C++からftpを使う
-
テキストボックスのフォーカス...
-
system関数のエラー検出
-
ユーザーフォーム内のテキスト...
-
FlashROMにデータを書き込むに...
-
バッチ(Windows2000)での解析エ...
-
ネットワーク内のIPアドレス...
-
データリーダーからのデータ読...
-
RPGでのダメージの算出方法につ...
-
シリアル通信でのread関数の戻り値
-
コマンドプロンプトで印刷実行
-
AutoHotkey KeyWaitコマンドに...
-
表示を標準か改ページプレビュ...
-
EXCELで右クリックメニューの追加
-
コマンドボタンテキストの改行
-
C言語のコマンドの"flag"って何...
-
VBで定期的にタイムサーバに時...
-
gmailでのimap設定
おすすめ情報