我正在为小型游戏编写一个地下城发电机。地下室由房间组成。 A room
有connections
到其他房间。红宝石和指针
room.connections = [room_a, room_b]
和
现在我需要选择一个房间由它的编号。
我这样做是先用recursive_scan
方法,没有工作,因为房间可导致成圈,这将引发StackOverflowError。所以我把一个名为already_scanned
的数组与房间号码相关联,这些数字已经被选入了方法的参数中。然后,它没有扫描所有的房间 - 顺便说一句,我不知道为什么,根据我的逻辑不可靠性,它应该起作用。
然后我试着把所有的房间都放在一个数组中,然后为想要的房间迭代数组 - 但是在这里我得到了这个问题,每个房间基本上都与其他房间相连,至少与其他房间相连;所以这个数组大到dungeon_size * array_of_rooms.length
。
我现在需要的是一个明确的指针 - 我知道几乎每红宝石var为指针,除了Fixnums和float(以及可能其他一些)。尽管数组变大了,所以我需要一个真正的指针。 (我也尝试设置一个object_id的数组,并通过ObectSpace加载它们,但令人伤心的是 - 因为我经常需要加载房间 - 具有想要的object_id的房间已经被回收了,然后如错误信息所解释的那样)。
这是我的递归扫描方法:
def room(number)
recursive_scan(@map, number, []) # @map is the entrance room
end
private
def recursive_scan(room, number, scanned)
scanned << room.room_number
if room.room_number == number
room
else
r = nil
room.connections.each do |next_room|
if !scanned.include?(next_room.room_number)
r = recursive_scan(next_room, number, scanned)
end
end
r
end
end
不,你没有。期。 – delnan 2011-05-24 20:33:18
从你描述'recursive_scan'和'already_scanned'应该可以工作,我在不久前使用了与边缘寻找算法完全相同的方法。也许发布你的代码,我们会看看它是否可以修复。 – 2011-05-24 20:41:45