Я программирую Dungeon Generator для небольшой игры.
Подземелья состоят из комнат.A room
имеет connections
в другие комнаты.
room.connections = [room_a, room_b]
и
room.number = 1 # unique id
Теперь мне нужно выбрать комнату по ее номеру.
Сначала я сделал это с помощью метода recursive_scan
, который не сработал, потому что комнаты могут привести к кругу, что приводит к ошибке StackOverflowError.Поэтому я поместил массив с именем already_scanned
с номерами комнат, которые уже были выбраны в аргументы метода.Тогда он не сканировал все комнаты - кстати, я понятия не имею, почему, по моей логической непонятности, это должно было сработать.
Затем я попытался собрать все комнаты также в массив, а затем выполнить итерацию массива дляразыскиваемая комната - но здесь у меня проблема, каждая комната в основном связана с любой другой комнатой, по крайней мере, с некоторыми другими комнатами между ними;таким образом, массив становится равным dungeon_size * array_of_rooms.length
.
Теперь мне нужен явный указатель - я знаю, что почти каждая переменная в ruby является указателем, кроме Fixnums и Float (и, возможно, некоторых других).Несмотря на то, что массив становится большим, поэтому мне нужен реальный указатель.
(я также пытался настроить массив object_ids и загрузить их через 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