[解決]RGSS3:○体ランダムで対象を重複させない

いおん
記事: 27
登録日時: 2020年5月18日(月) 23:57

[解決]RGSS3:○体ランダムで対象を重複させない

投稿記事by いおん » 2024年3月23日(土) 16:59

対象が敵○体ランダムの時に、出来るだけ同じ相手にかぶらないようにしたいです。
最後に編集したユーザー いおん on 2024年3月28日(木) 21:54 [ 編集 1 回目 ]

アバター
CACAO
記事: 18
登録日時: 2016年9月12日(月) 14:46
連絡を取る:

Re: RGSS3:○体ランダムで対象を重複させない

投稿記事by CACAO » 2024年3月24日(日) 15:48

いくつかパターンを作成してみました。
攻撃対象は Game_Action#targets_for_opponents で決定されています。

コード: 全て選択

if item.for_random?
  Array.new(item.number_of_targets) { opponents_unit.random_target }
Array~ の行を次のいずれかに変更してください。


1.ランダム n 体
純粋に n 体に攻撃するように変更します。
例えば「敵2体」「敵4体ランダム」の場合は、それぞれ1回ずつの合計2回攻撃し残りの2回は攻撃しません。

コード: 全て選択

opponents_unit.alive_members
  .sort_by {|member| rand * member.tgr }
  .reverse[0, item.number_of_targets]

2.ランダム n 回
敵より回数が多い場合は、敵を一巡毎に選択するように変更します。
例えば「敵2体」「敵3体ランダム」の場合の場合は、それぞれ1回ずつの対象に選んでから残りの1回をどちらにするか決めます。

コード: 全て選択

alive_members = opponents_unit.alive_members
round_count = (item.number_of_targets - 1) / alive_members.size + 1
round_count.times
  .inject([]) {|r| r.concat(alive_members.sort_by {|m| rand * m.tgr }) }
  .reverse[0, item.number_of_targets]

3.完全ランダム n 回
(2)の方法で狙われ率を無視して対象を決めます。

コード: 全て選択

alive_members = opponents_unit.alive_members
result = alive_members.shuffle
while result.size < item.number_of_targets
  result.concat(alive_members.shuffle!)
end
result[0, item.number_of_targets]


おそらく(2)の処理が希望に近いのではないでしょうか?
いおん
記事: 27
登録日時: 2020年5月18日(月) 23:57

Re: RGSS3:[解決]○体ランダムで対象を重複させない

投稿記事by いおん » 2024年3月28日(木) 21:53

CACAO様、どうもありがとうございます!
おかげさまで希望した通りに出来ました!!

“VX / Ace:質問” へ戻る