我通过重新发明轮子来教自己Python,即用互连的房间写一个简单的控制台冒险游戏。我的兴趣不在于完成一个真正的游戏,而在于学习抽象和数据结构。
我定义了一些基本类,例如World
,其中包含对Rooms
的引用。这些房间有动作和物品。程序检查每个房间可用的操作,并将其显示在列表中。所有这一切都运行良好,所以我试图复杂化事情。
我有两个问题我无法理解。我试着解释一下 尽可能少的细节。
这就是我为Room
定义一个可能的Action的方法,在这个例子中,它是由Room
变量引用的main
(现在数据是在模块,稍后将从CSV
或XML
文件中读取:
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')"])]
如果某个地方有关于构建此类数据结构的文本而不会疯狂,我很乐意阅读它。
谢谢。