在基于文本的游戏中使用/收集数据的更有效方式

时间:2015-10-29 18:52:12

标签: python dictionary game-engine text-based

我已开始开发基于文本的冒险游戏。环境表现得像Sierra游戏,但没有图形界面,所有命令都是文本。

目前,游戏中的任何对象(如角色,房间,物品等)都是由字典定义的。键是数据值的名称(名称,描述等),如下所示:

flash_light={
'name':'Flashlight',
'desc':'A flashlight, probably belonging to an eningeer on the ship.',
'consumable':False
}

播放器的广告资源和全局广告资源都是字典,其中密钥是“代号”'用于调用项目的字符串,该项目是引用它的字典。 如果您想要拍摄您在房间内找到的物品,房间的字典会有一个属性,可以将房间的库存作为列表进行跟踪。此列表包含“#”代号为'的字符串。对于其中的项目。

my_room={
'name':'My Room',
'codename':'my_room',
'desc':'A hot, stuffy room shared with 3 other passengers. My trunk is   here.\
The door is on the NORTH wall.',
'access':True,
'direc':{'north':'st_hall_1'},
'inven':['flashlight']
}

在命令决定你要求的项目实际上是在房间里,它运行:

current_pos.inven().remove(target)
player_inv.update({target:global_inv[target]})

这些行从房间的广告资源列表中删除字符串,然后将一个键和项添加到播放器的广告词典中。键是您尝试使用的对象的字符串名称,该项目在字符串名称的GLOBAL清单中定义为字典。

我有这么多关于该程序的调用的原因是当我给字典引用其他字典时(即房间有一个连接的房间列表),我一直遇到问题,这些字典可能没有被定义然而。我保持函数尽可能通用,并使用string-to-call-a-dict来避免给出一些未定义的名称作为参数。

我的主要问题是:如果可能,我怎样才能提高效率? 或者,我构建系统的方式,是否需要进行重大改组才能改进?

1 个答案:

答案 0 :(得分:0)

您应该使用类而不是dicts。 首先制作一个看起来像这样的通用项目类:

class Item(object):
    def __init__(self, name, codename, description, is_consumable):
        self._name = name
        self._description = description
        self._is_consumable = is_consumable

然后为每种类型的项目创建一个类:

class Flashlight(Item):
    def __init__(self, codename):
        super(Flashlight, self).__init__('Flashlight', codename,
            'A flashlight, probably belonging to an eningeer on the ship', False)

考虑为消耗品创建一个单独的项目,该项目具有处理项目消耗的consume()方法。

创建一个看起来像这样的Room类:

class Room(object):
    def __init__(self, name, codename, description, access, directions, inventory):
        self._name = name
        self._codename = codename
        self._description = description
        self._access = access
        self._directions = directions.copy()
        self._inventory = inventory[:]

我在self._directions的定义中使用copy,在self._inventory的定义中使用[:]来创建每个对象的副本,而不是使用原始对象。

为您想要的每个房间实例化它。

my_room = Room('My Room', 'my_room', 
'A hot, stuffy room shared with 3 other passengers. My trunk is here. The door is on the NORTH wall.',
True, {'north': 'st_hall_1'}, [Flashlight('flashlight')])

然后你可以添加一些方法,让玩家可以做任何游戏允许他们在房间内做的事情。 您还应该创建一个Character类,一个Player类等等。

因此,课程是提高游戏效率的关键。而不是将所有游戏的逻辑包含在同一个函数(或其中的一些)中,每个类应包含自己的东西。

编辑:现在我看到了你的代码,你可以做一些事情来改善它: 在你的" main"中,使用一个函数dict,它只根据命令选择正确的动作,而不是长链if语句(同样,你没有使用else。这意味着在执行操作后仍会评估其中的每个语句,如下所示:https://softwareengineering.stackexchange.com/questions/182093/why-store-a-function-inside-a-python-dictionary 您的类只包含getter函数,可以使用@property装饰器(How does the @property decorator work?

定义

在你的房间定义中,你可以清楚地看到课程是如何更好的:不是一遍又一遍地写相同的字段(并希望你没有在任何地方输入错字),你可以使用你的类来实例化它们。 #39;已定义。项目定义也是如此。 您还可以创建consume()方法,该方法应用特定耗材的任何效果,use()用于可用(例如手电筒和螺丝刀)等。