我正在爲小型遊戲編寫一個地下城發電機。地下室由房間組成。 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