我还是另一个编程新手,通过“学习困难的Python”,遇到了一些我不太了解的事情。
我将在前言中说,虽然我真的很享受他的课程计划,但一个不幸的副作用似乎是我不理解编程世界中涉及的很多技术讲座。 ,我花了两天时间才弄清楚“实例化”是什么,即使现在我只觉得我明白了,呵呵。所以希望我的查询的答案还没有以更具技术描述性的方式被问到,如果我抱歉是多余的话。
无论如何,我在这里要做的就是完成文本冒险,用类来描述每个房间。我实际上在做的是将我的旧作品导入到这个更新的,更“OOP”的做事方式 - 转换一个基本上是980行函数调用的程序。
所以以前我在每个功能中都有这些“房间”,可以检查你是否达到某些游戏目标来描述你的房间。例如:
def room_one():
if "flashlight" in pack:
print "You see an exit to the NORTH and a bear to the EAST."
elif "flashlight" not in pack:
print "It's too dark to see."
无聊的房间,但很容易描述。因此,在尝试使用课程时,我似乎已经碰壁了。我将向您展示我用来定义游戏“跑步者”和房间类的代码。
class Runner(object):
def __init___(self):
self.goals = [] #an array for game achievements (talked_to_king, etc)
self.pack = [] #an array for game items (flask, key, etc)
def play(self, currentroom, gamestate):
while True:
print "\n--------"
print currentroom.desc #this line prints the room description, could
cmd = raw_input("> ") #it also be part of the problem?
gamestate.state = currentroom.actions(cmd)
if gamestate.state != "SAME":
currentroom = gamestate.state
else:
pass
class Room(object):
def __init__(self):
self.desc = "null" #short room description
self.lookdesc = "super null" #longer room description for the LOOK command
def actions(self, cmd):
if 'help' in cmd:
print """
'look' -- see your surroundings, including exits.
'get' -- to pick up an item (if it can be picked up).
'inventory' -- displays your collected items
'throw' -- some objects can be thrown
'talk' -- speak to someone
Other commands, or objects to interact with, will tend to
show up IN UPPERCASE. (but still type them in lowercase!)
Cardinal directions (north, south, east, west) for movement.
"""
return "SAME"
elif 'inv' in cmd:
print "--Inventory--\n"
for items in game.pack:
print items
print "-------------\n"
return "SAME"
elif 'look' in cmd:
print self.lookdesc
return "SAME"
elif 'goals' in cmd:
for goal in game.goals:
print goal
return "SAME"
else:
print "That won't work here."
return "SAME"
class Office(Room):
def __init__(self):
super(Office, self).__init__()
# here's the part that doesn't work
if 'principal' in game.goals:
self.desc = "You're in the principal's office, and there's a zombie in here!"
else:
self.desc = "You're in the principal's office."
self.lookdesc = "The walls in here are dingy from decades of smoking.\nA door to the WEST leads back to the foyer."
def actions(self, cmd):
if "west" in cmd and not "principal" in game.goals:
print "Buck up and talk to the old prune."
return "SAME"
elif "talk" in cmd:
print "You call to the principal."
game.goals.append('principal')
next = raw_input("--Mr. Friiiiinkseseeees...--")
print "But OH MY DAMN he's actually a zombie now."
next = raw_input("--Aww weak--")
return "SAME"
return super(Office, self).actions(cmd)
要检查以确保附加“目标”数组,我确实在Room父类中添加了一个简单的目标检查功能,并且确实会附加game.goals。但我的if-else声明似乎并没有做任何事情;无论目标阵列中有什么,当我回到房间时,我总是得到其他的'desc。
公平地把if-else放在房间里就像那样在黑暗中拍摄,事实上我很惊讶我没有收到错误消息,告诉我那不是那些去的地方!但事实上它似乎并不关心game.goals数组的内容告诉我,这不是最好的方法。我应该如何实现这个?
作为一个子问题 - 使用这样的程序,如果游戏状态变化足以使房间的内容发生显着变化,那么更改房间的其他课程是否更好呢?更重要的是保持“地图”并说RoomThree(Room)总是RoomThree,无论游戏状态发生了什么变化,或者当游戏回到RoomThree时,这个地方被摧毁,抢劫,着火,充满吸血鬼和生菜的气味,这应该只是一个不同的RoomThree?我有点希望不,因为让每个房间只是“成为那个房间”似乎更合理,让像game.goals和game.pack这样的内容改变了类的实例在某些条件得到满足的情况下创建新课程。
无论如何,这是漫长的。 tl; dr - 我这样做很奇怪吗?
再次编辑:清除主要问题的代码以满足此处人员建议的新代码,还添加了父类“Room”以查看是否不是问题的一部分。仍然没有解决方案,但我相信代码的质量已经提高了:) whee
最终编辑(我希望):Aha,Stone的回答再次最有帮助。由于我向我的跑步者返回“相同”,因此它使用旧的Office实例。我需要创建一个全新的实例来让它识别变化;通过返回“Office()”而不是“SAME”我完成了这个。感谢大家不仅帮助解决手头的问题,而且让代码更容易阅读,并帮助我改变我对罗嗦if-else语句的看法。 Mwah:D
答案 0 :(得分:1)
当你有100个房间时会发生什么?你的游戏功能会有100个if语句,只是为了设置你所在的房间吗? (基本上再次设置)
将游戏状态直接设置为更改后的任何内容可能要好得多。
编辑:我只是重新阅读你现在的问题似乎很明显,除非你遗漏了重要的代码。
您似乎唯一一次将主体添加到目标是在类Office的成员函数内部。因此,当你开始将目标添加到目标时,为时已晚,Office已经初始化,除非你创建一个新的Office实例,否则不会重新初始化。添加该目标后,您需要更新会议室的说明。
答案 1 :(得分:-1)
我想是这样的:
if not 'principal' in game.goals:
你的意思是:
if 'principal' not in game.goals:
或者这个:
if not ('principal' in game.goals):
not 'somestring'
为False
,因为非空字符串始终为True
而你的目标中没有False
,所以它总是评估为{ {1}}。
创建Office对象的位置?因为您只检查对象创建的条件,然后在此之后将主体添加到目标中,所以如果再次使用相同的对象,描述将不会更改。