• ベストアンサー

RPGで誰が攻撃を受けるのかを決めたい

よくあるRPGゲームで複数パーティだと基本となる処理だと思うのですが 自分にはいまいち分かりません。 ・構造体 member_info[4]; (構造体のメンバはHP,MPなど、ここにランダムの範囲を制御するメンバを入れたほうがいい?) ・パーティは4人組 ・パーティの先頭にいる人ほど敵からの攻撃を受けやすい ・100でランダムを発生させた結果で誰が攻撃を受けるか決定する(例えば 1人目(member_info[0])の場合は0~24までの数がでれば攻撃を受ける、 同様に2人目(member_info[1])は25~49) というシステムを作りたいのですが、その場合のアルゴリズム(プログラム)は どのようになるのでしょうか? 例えば、4人均等な確率で攻撃を受けるとしたら単純に25ずつで区切っていけば 良いと思うのですが、誰かが死んで3人とかになってた場合とかも考慮しないといけないですし、 先頭にいる人ほど受けやすいのですから、ある程度偏りを作らねばなりません。 その偏りを手動じゃなくて、どうプログラムで組んでいけるのかが知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★攻撃を受ける時の『受け易さ』変数をメンバに追加する。 ・つまり、乱数で『100』が出たときに誰かが攻撃を受けるのならば、  1人目、2人目、3人目、4人目の『受け易さ』変数を  『4』、『3』、『2』、『1』とします。分かりますか? ・そして、『4 : 3 : 2 : 1』の合計10の乱数(0-9)を発生させて、  0~3(4の割合) が出たら1人目にダメージを、  4~6(3の割合) が出たら2人目にダメージを、  7~8(2の割合) が出たら3人目にダメージを、  9(1の割合) のみが出たら4人目にダメージが受ける仕組みです。 ・これで、単純に先頭にいる人ほど敵からの攻撃を受けやすくなり、  さらに『1 : 1 : 1 : 1』とすれば、4人の受ける攻撃が平均して25%の  確立で攻撃を受けます。乱数では合計の4(0-3)にします。 ・また、誰かが死んで3人とかになった場合は、死亡したメンバ以外を  『3 : 2 : 1』と書き換えて処理すればよいのです。乱数は 0-5 です。 ・他にも、『無敵』変数を追加すればそのメンバには全く攻撃を受けない  処理も出来ます。→この場合は、死亡フラグと同じで『無敵』以外の  メンバを『3 : 2 : 1』と書き換えます。分かりますか? 余談: ・昔、私もRPGゲームを作りました。 ・RPGゲームで有名な『ドラゴン・クエスト』シリーズを参考にね。 ・それで、思ったほどに『ドラゴン・クエスト』は出来が良いことに  気づきました。→自分で作ってみて大変だとか、なるほど。ってね。 ・主人公データ、その名前データ、敵名データ、魔法データ、道具データ  地形データ、イベントデータなどを用意するのが面倒でガイドブックを  参考にデータを丸写しして作っていました。→個人で使っていたので  著作権法の違反にはなりませんよね。→ネットにはアップしていないし。 ・ただ、地形データと主人公名は自分で決めましたけど。 ・以上。おわり。参考にして下さい。

takagoo100
質問者

お礼

ご返答ありがとうございます。 自分はやたら大きい値でランダムをさせて考えていましたが、 >『4 : 3 : 2 : 1』の合計10の乱数(0-9)を発生させて、 と最小の単位で無駄をなくして考えることが参考になりましたし 知りたかったところです。参考になりました。 たしかにドラクエはいいですね。 ちなみに自分は月並みになりますが3が好きです。

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

基本的なアルゴリズムは#1の方のもので不都合ないと思いますが、 隊列変更等も考えるなら、 > 『受け易さ』変数をメンバに追加する。 キャラのメンバとはせずに、隊列クラス等を別途作ってそちらに持たせてもよさそうです。 キャラの体型やクラス特性で変わる偏りならキャラのメンバでもいいでしょうし、 隊列とキャラの両方に持つ形なども考えられます。 データの持ち方はどう処理したいか、システムの方針にもよりますのでご参考までに。

takagoo100
質問者

お礼

ご返答ありがとうございます。 別々に持たせることも考えてみたいと思います。

関連するQ&A

  • RPGの戦闘アルゴリズムについて

    このジャンルでお願いします。 例えば、ドラゴンクエストモンスターズ http://way78.com/gb/dqm2/mgc.html のような戦闘システムを再現したいと考えているのですが、 単純な攻撃特技なら耐性と照らし合わせてダメージを算出するだけだと思います。 ただ補助特技や補助特技の ・たかくとびあがる(次のターンに攻撃) ・うけながし(自分が受けた攻撃を敵か味方に受け流す) ・ふういんのいのり(自分の受けた特技を敵味方一切使えなくする) ・まねまね(敵から受けた攻撃をそのまま跳ね返す) ・きあいをためる(ターンの最後に通常の1.5倍の打撃を与える) ・せいしんとういつ(次のターンの攻撃が2回連続になる) ここらへんの処理を実装するとなるとかなり複雑になりそうです・・・(他にもややこしそうなのがありますが) 自分では考えられそうもないので、 ネットなどで戦闘システムを検索したり関連の書籍を探したりしたのですが、 簡単な戦闘システム(1対1で単純な攻撃だけとか)の説明しか今のところ見つかりませんでした・・・ 少し考えてみたのですが、キャラの状態が ・飛んでるとき ・気合を溜めてるとき ・何らかの状態異常のとき(混乱や麻痺) は攻撃ができなくて、混乱してる時は麻痺をかけられても効かないとすると、 有限ステートマシンなどのアルゴリズムを利用した方がいいのかな?と 思ったりして、でもそもそも上の3つの場合を一まとめにできるものなのか とにかくわけがわからず想像ができないです・・・ みなさんならどのようにクラス分けして処理していくか知りたいです。 またはこのような戦闘のアルゴリズムが書かれてる書籍などありましたら 紹介して頂けないでしょうか?

  • 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));

  • MMOじゃないRPGについて

    ダンジョンという響きには夢があり、RPGとは切っても切り離せない。 しかし全部の道を見て回らないとすっきりしないので、行き止まりまで行っては来た道を引き返し、場合によってはものすごく引き返さなくてはならないこともありイライラする。 そのため戦いたくもない敵と何度もエンカウントされ、それがイライラに拍車をかける。 雑魚敵が見えているゲームならそれなりに救いはあるのだが、強制の場合はたまらない。 面倒くさくなり「逃げる」を連発し、やたら逃げられない敵と出会い全滅させられたら最悪だ。逃げられても、1~2歩歩いたらまたすぐにエンカウントということもある。 妙に複雑なダンジョンになると、行ったか行ってないか分からなくなり、念のためにと思い行ったらもうすでに来た道。それだけでも腹立だしいのに、そこから戻るまでも無駄なエンカウントがいっそう憂鬱にさせてくれる。 そして、大抵のダンジョンはいい装備など稀で、ほとんどの宝箱がせいぜい回復POTだ。 楽しく夢があるはずのダンジョンなのに、ストレスの方が大きいダンジョンの方が多くないだろうか。 また、謎かけも問題だ。 製作者と違う着眼点で考えてしまうとドツボにはまる。別にありえない着眼点じゃなくても、だ。 考えても考えても答えが違っていた時、悔しいというより屈辱的ですらあり、自分にうんざりしてくる。 謎かけがそのゲームに関するものだった場合、答えやヒントを言うNPCを探し回る羽目になり、一度ダンジョンを出なければならなくなったり、セーブデータまで遡って調べることもある。 そして結局は攻略サイトのお世話になることに。 一度攻略サイトを見てしまえば、つまづいたり悩んだ時は諦めムードで即見てしまう。 そうなればゲームの面白さなど半減だ。先まで見えてしまうし、作業か流れでゲームをやってる気さえしてくる。 戦闘もほとんどが面倒くさくなり、最終的には「攻撃」を盲目クリック。魔法使いも「攻撃」のため、10ダメージとかしか与えず、いらねーこいつ。と思ってしまう。知能の高いオート機能があるゲームは別だが。 戦闘って元々は血沸き肉躍る冒険の醍醐味のはずだと思う。でも、そんなゲームにはついぞ出会えたことがない。ほとんどが作業的な行動の繰り返しだ。 魔法の綺麗だったり壮大なシーンも、何度も繰り返せば時間をとられる面倒なディレイでしかない。 雑魚敵との戦闘はしょうがないと諦めるべきなのだろうか。99%が雑魚敵との戦闘なのだが。まあ、だからこそ作業になるといわれればそれまででもある。 個人的にはRPGではなくなってしまうが、風来のシレンやトルネコシリーズのようなシステム。ダンジョンは複雑ではなく単純なのに難易度があり、アイテムには夢があり、雑魚敵との駆け引きもある。秀逸だと思う。 このような不満を持っていたためもう何年もRPGはやってきませんでしたが、最近妙にやってみたくなりました。 XPでできるフリーのRPGで、これらのような面白さももったゲームがあったら教えてください。(別にシレンのようなシステム限定というわけではなく、ダンジョンや敵との戦闘こそが面白いと思えるゲームです。ただし、複雑なダンジョンはX。ここが難しいところなんですが) また、皆さんはRPG(MMOは除外)に同じような不満を感じていませんか?

  • 構造体型のポインタ変数を含む構造体

    struct seiseki_tag { Int32 math ; Int32 english ; Int32 science; } ; typedef struct seiseki_tag SEISEKI ; struct personal_tag { Char name ; Int32 num ; SEISEKI *sptr } : typedef struct personal_tag PERSONAL ; struct info_tag { PERSONAL person_info ; } ; typedef struct info_tag INFO ; たとえば、上記のように3つの構造体があり、PERSONAL構造体のメンバーに SEISEKI構造体の型を持つポインタ変数が含まれているような場合で、下記のように INFO型のポインタ変数からSEISEKI構造体のメンバーを参照する方法を教えてください。 PERSONAL構造体メンバーのnameやnumは INFO *info ; info->person_info.name ; info->person_info.num ; のように参照すると思いますが、sptrが示すSEISEKI構造体のメンバーへの アクセスができません。下記のように参照を試みたのですがコンパイルは 通るのですが、実際に参照できていませんでした。 INFO *info ; SEISEKI *seiseki ; seiseki = info->person_info.sptr ; seiseki->math ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

  • 経験値を全員に振り分けるには…

    僕が今作っているRPGはパーティメンバーが5人以上います。 パーティには4人しか入れることができません。 パーティに入っていないメンバーも、敵を倒したら 経験値をもらう方法はあるのでしょうか? 例 AさんBさんCさんDさんでモンスターを倒す→AさんBさんCさんDさんEさんFさんGさんがそれぞれ経験値をもらう こんなことは可能ですか?教えてください!

  • 経験値を全員もらうには

    僕が今作っているRPGはパーティメンバーが5人以上います。 パーティには4人しか入れることができません。 パーティに入っていないメンバーも、敵を倒したら 経験値をもらう方法はあるのでしょうか? 例 AさんBさんCさんDさんでモンスターを倒す→AさんBさんCさんDさんEさんFさんGさんがそれぞれ経験値をもらう こんなことは可能ですか?教えてください! できれば、詳しいことを知っている人は スクリプトの説明もお願いします!

  • 構造体と構造体型の変数宣言箇所

    はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。  ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?

  • 名前のわからないゲーム、スーパーファミコンでアクションRPG

    昔友達から借りてプレイしたソフトがあるのですが、名前が思い出せません。 誰から借りたのかも思い出せなくて。 確定的なこと ・スーパーファミコン用ソフト ・昔の聖剣伝説やゼルダの伝説のような、見下ろし型のARPG(アクションRPG)。マップ上の敵を武器で攻撃していく。 ・武器はシナリオが進むにつれて替わる。(替えることもできる、の間違いかもしれません) 不確定で曖昧な記憶(こんな要素あったかも・・) ・タイトルはカタカナかローマ字 ・物語が始まると、船をおりて森か草原でスタートしたような気がする。でも物語の最初ではなかったかもしれないし、違うゲームかもしれない(すみません)。 ・魔法を使えたかも ・物語が進むと玉のようなものを手に入れたような。戦闘能力か先頭アクションに関係のある。 ・色んな種類の武器があった気がする。剣や槍。ただ、はっきりとおぼえていない。 ・長い槍で攻撃してた記憶がある。 ・鎧を着ていたかも。 ・ダンジョンはあったかわからないが、野外で闘ったことのほうが多かった 曖昧で申し訳ないです。 上の情報に少しでもかするようなソフトを挙げて頂けたら嬉しいです。 よろしくお願いします。

  • モンテカルロ法ベースのオセロプログラムを作りたいのですが

    今、C言語でモンテカルロ法ベースのオセロプログラムを作っているのですが、なかなかうまくいきません。 エラー内容: ある程度書いてみたのですが、実行すると「Segmentation fault」とでてしまいます。 アルゴリズム内容: 構造体を用意して、ランダムに手を打ち勝ったら手の内容と勝ち数をカウントして、構造体に格納します。最後に一番勝ったてを指すというプログラムを書いています。 質問点: 「Segmentation fault」とでてしまいます。何故なのでしょうか? 解決方法と理由を教えてください。 プログラム内で他にも変な場所があれば、教えてください。 それと、モンテカルロ法だけだと弱いので、何かいい手はないでしょうか? 質問が多くて申し訳ございませんが、教えていただければ幸いです。 オセロのプログラムデータは添付しています。 開発環境のOSはubuntuを使用しています。Windowsの時、文字化けする可能性があります。 なにとぞよろしくお願いします。

  • 突然シリーズ… RPG 編

    さて、どうする?(出来ればドラクエ風) 1. ソロ編、囲まれた?敵はアンデット系・ガイコツ戦士3体 自分は、ムーンナイト 使用可能魔法は、防御、浄化、回復の3つのみ。 片手剣、盾、鎧を装備している。Lv50 https://www.youtube.com/watch?v=WPSkW7jPneU 2. PT 編、塞がれた?前方にゴーレム2体、後方に暗黒魔道士系2体 PT メンバーは、4名 戦士、格闘家、僧侶、魔法使い [細かい魔法やスキルもドラクエ Lv30 PT に準ずる] https://www.youtube.com/watch?v=s4lz-HZZCA4 3. その他、状況不明、BGM、敵、ソロ or PT 好きにどうぞ? 何れの場合も勇者は居ません。悪しからず…