【发布时间】:2015-01-25 14:11:41
【问题描述】:
我正在学习 Python the Hard Way 中的练习 43,尝试填写作者的骨架 OOP 代码来制作一个有效的“冒险”类型游戏。在本文的最后几个练习之前,我从未做过任何类型的 OOP,所以很难做到。
我在一个类中使用__init__ 通过存储键引用的调用(经典“让你拥有case 语句”用于 Python),但这些方法需要参数(以跟踪已经看到的房间、携带库存等)——当我为参数包含变量时,我总是会得到一个错误,即“[name] 在赋值之前引用"或类似的。如果我提供空白或常量/文字参数,我不会收到该错误,但显然如果参数不是变量,我以后的调用将无法正常工作。
如果我将 dict def 移动到 Engine 类的主要方法中,一切似乎都很好,但是我必须在类的每个方法中再次定义整个 dict,对吗?这是我正在处理的课程,在主要方法中使用字典而不是 __init__ - 我怎样才能将这本字典放入 __init__ 并让它工作?
class Engine (object):
def __init__(self, scene_map):
self.scene_map = scene_map
def drop_item(self, c_list, inv, log):
pass
def goto(self, c_list, inv, log):
print c_list
pass
def take_item(self, c_list, inv, log):
pass
def inventory(self, c_list, inv, log):
pass
def show_items(self, c_list, inv, log):
pass
def set_bomb(self, c_list, inv, log):
pass
def talk_to(self, c_list, inv, log):
pass
def play(self):
next_move = []
stuff = []
seen = []
self.act = {
'drop' :self.drop_item(next_move, stuff, seen),
'enter' :self.goto(next_move, stuff, seen),
'get' :self.take_item(next_move, stuff, seen),
'go' :self.goto(next_move, stuff, seen),
'inventory' :self.inventory(next_move, stuff, seen),
'leave' :self.goto(next_move, stuff, seen),
'look' :self.show_items(next_move, stuff, seen),
'run' :self.goto(next_move, stuff, seen),
'start' :self.set_bomb(next_move, stuff, seen),
'take' :self.take_item(next_move, stuff, seen),
'tell' :self.talk_to(next_move, stuff, seen),
}
self.obj = {
'armory' :'',
'blaster' :'',
'bomb' :'',
'bridge' :'',
'cabin' :'',
'corridor':'',
'gangway' :'',
'gothon' :'',
'keypad' :'',
'pod' :'',
}
self.scene_map.opening_scene()
entry = UserEntry()
done = False
dead = False
while not done:
next_move = entry.get_input()
entry.obj [next_move (0)] (next_move)`
我正在尝试获得更多类似的东西:
def __init__(self):
self.scene_map = scene_map
self.act = {
'drop' :self.drop_item(next_move, stuff, seen),
'enter' :self.goto(next_move, stuff, seen),
'get' :self.take_item(next_move, stuff, seen),
'go' :self.goto(next_move, stuff, seen),
'inventory' :self.inventory(next_move, stuff, seen),
'leave' :self.goto(next_move, stuff, seen),
'look' :self.show_items(next_move, stuff, seen),
'run' :self.goto(next_move, stuff, seen),
'start' :self.set_bomb(next_move, stuff, seen),
'take' :self.take_item(next_move, stuff, seen),
'tell' :self.talk_to(next_move, stuff, seen),
}
self.obj = {
'armory' :'',
'blaster' :'',
'bomb' :'',
'bridge' :'',
'cabin' :'',
'corridor':'',
'gangway' :'',
'gothon' :'',
'keypad' :'',
'pod' :'',
}
建议?
【问题讨论】:
-
你希望如何使用
self.act和self.obj?他们应该怎么做? -
目前,这些是供玩家使用的有效命令词列表,附加效果是使用命令词作为
self.act中的键让我运行执行该功能的方法 - - 因此,如果玩家输入“get blaster”,我将运行self.take_item,参数将告诉take_item检查是否有爆能枪,如果有,将其添加到玩家的库存中。 -
在您的代码示例中,您应该包含您计划对
self.act和self.obj执行的操作,即使用它们的代码(即使它还不能工作)。目前尚不清楚您希望next_move和stuff和seen来自哪里。 -
我试图避免 TL;DR 影响粘贴数百行。这不是我可以减少到最低限度的复制器并仍然避免像你这样的问题的东西。短版:
next_move是用户输入的经过解析/修剪的命令行(应该只是动词和名词,如“启动炸弹”);stuff是库存列表,seen是访问位置列表(允许在第一次看到或明确的“查看”命令时给出长描述,在重访时给出更短的描述——如原始“冒险”或“巨大的洞穴”)。
标签: python class python-2.7 dictionary arguments