引用尚不存在的对象

时间:2016-09-15 09:53:53

标签: python class python-3.x

我通过重新发明轮子来教自己Python,即用互连的房间写一个简单的控制台冒险游戏。我的兴趣不在于完成一个真正的游戏,而在于学习抽象和数据结构。

我定义了一些基本类,例如World,其中包含对Rooms的引用。这些房间有动作和物品。程序检查每个房间可用的操作,并将其显示在列表中。所有这一切都运行良好,所以我试图复杂化事情。

  

我有两个问题我无法理解。我试着解释一下   尽可能少的细节。

这就是我为Room定义一个可能的Action的方法,在这个例子中,它是由Room变量引用的main(现在数据是在模块,稍后将从CSVXML文件中读取:

main.actions = [Action(type = 'move',
                       result = 'west',
                       desc = 'Go to the West Room.')]

我需要定义一个动作类型,因为某些动作不是动作(例如,拾取,拉动杠杆)。我稍后会修改它以使用Action的子类,这不是问题。

' west'这里的字符串指的是动作结果的房间,即当动作执行时它将成为当前房间。

  

但是,我希望结果是 Room对象本身,而不是   字符串ID 。但是,在所有Rooms都已初始化之前,我无法做到这一点。

所以我使用World对象的以下方法解决了这个问题:

    def connect_rooms(self):
    '''
    Once all the rooms have been created,
    replace all the string reference to other rooms by the Room objects themselves.
    '''
    for room in self.rooms:
        for action in room.actions:
            if action.type == 'move':
                room_object = fetch_room(self, action.result)
                action.result = room_object

fetch_room()函数(全局范围)就是这样做的:

def fetch_room(world, shortname):
# Find a room item by its shortname
for room in world.rooms:
    if room.shortname == shortname:
        return room
return None

我确信有更好的方法可以解决这个问题,因为在节点之间创建连接似乎是一个基本的抽象概念。

另一个(相关的)问题是我试图创建内置于Actions本身的条件,以便程序仅在条件定义时向玩家提出它们在行动中得到满足。对于数据的初始构建,我无法引用任何其他内容,因为它尚未创建。我想过以字符串形式添加一个条件并稍后用exec()运行它,但它看起来非常愚蠢和丑陋:

main.actions = [Action(type = 'move',
                   result = 'west',
                   desc = 'Go to the West Room.',
                   conditions = ["player.has('smallkey')"])]

如果某个地方有关于构建此类数据结构的文本而不会疯狂,我很乐意阅读它。

谢谢。

0 个答案:

没有答案