在基于文本的游戏中 use/gather 数据的更有效方式
A more efficient way to use/gather data in a text-based game
我已经开始开发基于文本的冒险游戏。环境表现得像 Sierra 游戏,但没有图形界面,所有命令都是文本。
目前,游戏中的任何对象(如角色、房间、物品等)都是由字典定义的。键是数据值的名称(名称、描述等),如下所示:
flash_light={
'name':'Flashlight',
'desc':'A flashlight, probably belonging to an eningeer on the ship.',
'consumable':False
}
玩家的物品栏和全局物品栏是字典,其中键是 'codename' 字符串来调用项目,项目是引用它的字典。
如果你想拿走你在房间里找到的一件物品,房间的字典有一个 属性,它以列表的形式跟踪房间的库存。此列表包含其中的项目 'codenames' 的字符串。
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]})
这些行从房间的清单列表中删除字符串,然后将键和项目添加到玩家的清单字典中。 key是你试图拿走的物体的字符串名称,item被定义为字符串名称处GLOBAL inventory中的字典。
我在这个程序周围有这么多电话的原因是,当我给字典引用其他字典(即一个房间有一个它连接到的房间的列表)时,我一直 运行 遇到问题,并且这些字典可能还没有定义。我尽可能地保持函数的通用性,并使用 string-to-call-a-dict 来避免给一些未定义的名称作为参数。
我的主要问题是:如果可能的话,我怎样才能提高效率?
或者,我构建系统的方式,是否需要进行重大重组才能改进?
你应该使用 classes 而不是 dicts。
首先制作一个看起来像这样的通用项目 class:
class Item(object):
def __init__(self, name, codename, description, is_consumable):
self._name = name
self._description = description
self._is_consumable = is_consumable
然后为每种类型的项目创建一个 class:
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()
方法。
创建一个看起来像这样的房间 class:
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')])
然后您可以添加方法,使玩家能够在房间内执行游戏允许他们执行的任何操作。
您还应该创建一个角色 class、一个玩家 class 等等。
所以 classES 是提高游戏效率的关键。每个 class 都应该包含自己的东西,而不是将所有游戏的逻辑都包含在同一个函数(或其中的几个)中。
编辑:现在我看到了你的代码,你可以做一些事情来让它变得更好:
在你的 "main" 中,使用一个根据命令选择正确动作的函数字典,而不是一长串 if
语句(而且,你没有使用 else
就做到了!那个意味着这些陈述中的每一个在采取行动之后仍然会被评估),就像这样:https://softwareengineering.stackexchange.com/questions/182093/why-store-a-function-inside-a-python-dictionary
您的 classes 仅包含 getter 函数,可以使用 @property
装饰器 (How does the @property decorator work?)
定义
在您的房间定义中,您可以清楚地看到 classes 如何更好:与其一遍又一遍地编写相同的字段(并希望您没有任何错字),您可以实例化他们使用您定义的 class。项目定义也是如此。
您还可以创建一个 consume()
方法,它应用特定消耗品的任何效果,use()
适用于可用物品(例如您的手电筒和螺丝刀)等
我已经开始开发基于文本的冒险游戏。环境表现得像 Sierra 游戏,但没有图形界面,所有命令都是文本。
目前,游戏中的任何对象(如角色、房间、物品等)都是由字典定义的。键是数据值的名称(名称、描述等),如下所示:
flash_light={
'name':'Flashlight',
'desc':'A flashlight, probably belonging to an eningeer on the ship.',
'consumable':False
}
玩家的物品栏和全局物品栏是字典,其中键是 'codename' 字符串来调用项目,项目是引用它的字典。 如果你想拿走你在房间里找到的一件物品,房间的字典有一个 属性,它以列表的形式跟踪房间的库存。此列表包含其中的项目 'codenames' 的字符串。
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]})
这些行从房间的清单列表中删除字符串,然后将键和项目添加到玩家的清单字典中。 key是你试图拿走的物体的字符串名称,item被定义为字符串名称处GLOBAL inventory中的字典。
我在这个程序周围有这么多电话的原因是,当我给字典引用其他字典(即一个房间有一个它连接到的房间的列表)时,我一直 运行 遇到问题,并且这些字典可能还没有定义。我尽可能地保持函数的通用性,并使用 string-to-call-a-dict 来避免给一些未定义的名称作为参数。
我的主要问题是:如果可能的话,我怎样才能提高效率? 或者,我构建系统的方式,是否需要进行重大重组才能改进?
你应该使用 classes 而不是 dicts。 首先制作一个看起来像这样的通用项目 class:
class Item(object):
def __init__(self, name, codename, description, is_consumable):
self._name = name
self._description = description
self._is_consumable = is_consumable
然后为每种类型的项目创建一个 class:
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()
方法。
创建一个看起来像这样的房间 class:
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')])
然后您可以添加方法,使玩家能够在房间内执行游戏允许他们执行的任何操作。 您还应该创建一个角色 class、一个玩家 class 等等。
所以 classES 是提高游戏效率的关键。每个 class 都应该包含自己的东西,而不是将所有游戏的逻辑都包含在同一个函数(或其中的几个)中。
编辑:现在我看到了你的代码,你可以做一些事情来让它变得更好:
在你的 "main" 中,使用一个根据命令选择正确动作的函数字典,而不是一长串 if
语句(而且,你没有使用 else
就做到了!那个意味着这些陈述中的每一个在采取行动之后仍然会被评估),就像这样:https://softwareengineering.stackexchange.com/questions/182093/why-store-a-function-inside-a-python-dictionary
您的 classes 仅包含 getter 函数,可以使用 @property
装饰器 (How does the @property decorator work?)
在您的房间定义中,您可以清楚地看到 classes 如何更好:与其一遍又一遍地编写相同的字段(并希望您没有任何错字),您可以实例化他们使用您定义的 class。项目定义也是如此。
您还可以创建一个 consume()
方法,它应用特定消耗品的任何效果,use()
适用于可用物品(例如您的手电筒和螺丝刀)等