#============================================================================== # ★ 重複なし乱数ver1.02 by USK #============================================================================== =begin イベントコマンド変数の操作のスクリプトにsingle_rand(max)と記入すると、1〜maxまで のランダムな値が、イベントを呼び出すごとに重複しないように得られます。すべての値 が出つくした場合、重複カウントがリセットされます。 イベントコマンドのスクリプトにreset_rand(max)と記入すると、single_rand(max)にお ける重複カウントがリセットされます。 single_rand(10)とsingle_rand(20)のように()の中の値が違うものどうしの重複はカウン トされません。 重複カウントはセーブデータ毎に記録され、セーブ後一旦終了してもリセットされません。 =end #============================================================================== # ■ SingleRand #============================================================================== module SingleRand #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def self.init @rand_fiber = {} end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def self.pop_rand(id) @rand_fiber[id].resume if @rand_fiber[id] end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def self.exist?(id) !@rand_fiber[id].nil? end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def self.create_rand(id, array) @rand_fiber[id] = Fiber.new do loop do array.size.times do Fiber.yield array.delete_at(rand(array.size)) end array = (1..id).to_a end end end end #============================================================================== # ■ SceneManager #============================================================================== module SceneManager #-------------------------------------------------------------------------- # ● 呼び出しスタックのクリア #-------------------------------------------------------------------------- class << self; alias srand_clear clear; end def self.clear srand_clear SingleRand.init end end #============================================================================== # ■ Game_System #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias srand_initialize initialize def initialize srand_initialize @rand_array_list = {} end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def pop_rand(max) create_rand(max) if !@rand_array_list[max] || (@rand_array_list[max].empty?) load_rand(max) unless SingleRand.exist?(max) SingleRand.pop_rand(max) end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def create_rand(max) @rand_array_list[max] = (1..max).to_a SingleRand.create_rand(max, @rand_array_list[max]) end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def load_rand(max) SingleRand.create_rand(max, @rand_array_list[max]) end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def reset_rand(max = 0) if max == 0 @rand_array_list.each_key do |key| create_rand(key) end else create_rand(max) end end end #============================================================================== # ■ Game_Interpreter #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def single_rand(max) $game_system.pop_rand(max) end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def reset_rand(max = 0) $game_system.reset_rand(max) end end