0

我已经开始开发基于文本的冒险游戏。该环境的行为类似于 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 来避免将未定义的名称作为参数提供。

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

4

1 回答 1

0

您应该使用类而不是字典。首先创建一个看起来像这样的通用项目类:

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[:]

copy在 self._directions[:]的定义和 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 类等。

所以类是让你的游戏更高效的关键。每个类都应该包含自己的东西,而不是将所有游戏逻辑包含在同一个函数中(或其中几个)。

编辑:既然我看到了您的代码,您可以做一些事情来使它变得更好:在您的“主要”中,使用一个函数字典,它只是根据命令而不是一长串if语句选择正确的操作(此外,您没有使用else! 这意味着在采取行动后仍会评估这些语句中的每一个),如下所示:https ://softwareengineering.stackexchange.com/questions/182093/why-store-a-function -inside-a-python-dictionary 你的类只包含 getter 函数,可以使用@property装饰器定义(@property 装饰器如何工作?

在您的房间定义中,您可以清楚地看到类如何更好:与其一遍又一遍地编写相同的字段(并希望您在任何地方都没有错字),您可以使用您定义的类来实例化它们。项目定义也是如此。您还可以创建一个consume()方法,该方法应用特定消耗品具有的任何效果,use()用于可用物品(例如您的手电筒和螺丝刀)等。

于 2015-10-29T19:35:27.827 回答