gpt4 book ai didi

Ruby 和指针

转载 作者:数据小太阳 更新时间:2023-10-29 07:44:30 25 4
gpt4 key购买 nike

我正在为一款小游戏编写地牢生成器。

地下城由房间组成。 房间与其他房间有连接

room.connections = [room_a, room_b]

room.number = 1 # 唯一 id

现在我需要根据房间号选择房间。

我首先使用 recursive_scan 方法执行此操作,但该方法不起作用,因为房间可能会变成圆圈,从而引发 StackOverflowError。因此,我将一个名为 already_scanned 的数组放入了房间号,这些房间号已被选入该方法的参数中。然后它没有扫描所有房间 - 顺便说一句,我不知道为什么,根据我的逻辑理解它应该有效。

然后我尝试将所有房间也放在一个数组中,然后为想要的房间迭代数组 - 但在这里我遇到了问题,每个房间基本上都与其他房间相连,至少与它之间的其他房间相连;所以数组变得和 dungeon_size * array_of_rooms.length 一样大。

我现在需要的是一个显式指针——我知道 ruby​​ 中几乎每个 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

最佳答案

Ruby 中的一切都已经是引用。

为什么不只维护一个房间索引?

rooms[room.number] = room

然后你可以用 rooms[i] 得到任何东西。我会通过简单地修改 Room 的 initialize 方法来逐步更新索引。

def initialize
rooms[self.number] = self
. . .
end

这不会占用太多空间,因为数组只是一个索引,实际上并没有房间的副本。从数组获得的每个引用本质上与通过程序中的任何其他机制获得的引用是一样的,引用和经典指针之间的唯一真正区别是垃圾收集的一些开销。

如果房间曾经被删除(除了刚刚退出之前),您需要在删除时设置 rooms[x] = nil

我不明白为什么你需要先创建数据结构然后索引房间,但是 FWIW 你应该能够进行递归枚举并使用房间索引数组中的房间存在作为来过这里的标志.我不确定为什么它以前不起作用,但如果仔细编写,它确实必须起作用。

关于Ruby 和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6116386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com