基本上这是我正在做的一个小字符串游戏的一部分,这让我很兴奋。玩家可以按"A"或"d"在房间里向左或向右看以收集线索。如果玩家已经看过那个地方。它会弹出"你已经来过这里了"的信息
虽然,它会去正确的点一次,然后下一个点会弹出一个消息说"你已经到过这里了"。的例子。如果我按"a"那么"d"代表"d"它会说我已经去过那里了,但我还没有。任何帮助/建议吗? ?
left = 0
right = 0
#Room 1 movements
def roomOneLeft():
global left
left = 1
print '-- You search the rubble and find some cloth'
return roomOneMoves()
def roomOneRight():
global right
right = 1
print '-- You find a pick under a wooden chair'
return roomOneMoves()
#room 1 user choose
def roomOneMoves():
global left
global right
move = raw_input("")
if left == 1:
print 'you have already been here'
return roomOneMoves()
if right == 1:
print 'you have already been here'
return roomOneMoves()
if move == 'a':
roomOneLeft()
if move == 'd':
roomOneRight()
roomOneMoves()
谢谢大家的帮助。如果我的代码看起来很令人沮丧,我很抱歉!现在修好了。
尽管你的代码中有很多东西可以说是"不确定的",但你的问题来自于left
和right
都被检查的事实,而不管玩家做出什么移动。如果你按下'a', left
变成1。在它之后按"d"将检查left
是否为1并打印消息。
遍历代码:
- 我们调用
roomOneMoves()
- 用户按下
a
,移动变为'a'
-
left
不是1
,所以我们不输入if的分支。 -
right
不是1
,所以我们不输入if的分支。 -
move
等于'a'
所以我们称roomOneLeft()
-
left
变成1
,我们打印一条消息,并再次调用roomOneMoves()
。 - 用户按下
d
,move
变为'd'
-
left
现在是1,所以我们打印一条消息并再次调用roomOneMoves()
。
换句话说,在你决定用户真正想去哪个房间之前,你要检查你是否去过一个房间并退出。
你不检查你的动作,直到为时已晚。观察:
move = raw_input("")
if left == 1:
print 'you have already been here'
return roomOneMoves()
if right == 1:
print 'you have already been here'
return roomOneMoves()
if move == 'a':
roomOneLeft()
if move == 'd':
roomOneRight()
只有当用户实际向左移动时,才需要计算left == 1
部分,不是吗?因此,应该嵌套if语句,像这样:
move = raw_input("")
if move == 'a':
if left:
print 'you have already been here'
return roomOneMoves()
roomOneLeft()
if move == 'd':
if right:
print 'you have already been here'
return roomOneMoves()
roomOneRight()
另外,您应该重新考虑您的数据结构,并使用带有布尔值或类似值的字典,而不是全局变量。此外,由于大多数Python解释器不能有效地计算尾递归,您可能希望使用迭代主循环而不是递归地调用next函数。
问题在于您的roomOneMoves
函数:
move = raw_input("")
首先从用户那里得到方向;你还没有评估它。
if left == 1:
print 'you have already been here'
return roomOneMoves()
if right == 1:
print 'you have already been here'
return roomOneMoves()
你检查用户之前是否向左或向右移动,并显示消息,更糟糕的是,你重新开始roomOneMoves
。
if move == 'a':
roomOneLeft()
if move == 'd':
roomOneRight()
只有在那之后,你才真正评估新的方向。
您应该首先评估新的方向,并且只有在评估时才检查该方向是否以前输入过一次:
move = raw_input("")
if move == 'a':
if left == 1:
print 'you have already been here'
else:
roomOneLeft()
elif move == 'd':
if right == 1:
print 'you have already been here'
else:
roomOneRight()
roomOneMoves()
另外,您可能希望在结束时无条件地重新启动方法。