我已开始开发基于文本的冒险游戏。环境表现得像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来避免给出一些未定义的名称作为参数。
我的主要问题是:如果可能,我怎样才能提高效率? 或者,我构建系统的方式,是否需要进行重大改组才能改进?
答案 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()
用于可用(例如手电筒和螺丝刀)等。