0

所以基本上这是我正在制作的一个小字符串游戏的一部分,这真的让我兴奋不已。玩家可以按“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()

编辑:谢谢大家的帮助。如果我的代码看起来很令人沮丧,我很抱歉!现在开始工作了。但只有在你的帮助下。

4

4 回答 4

3

尽管有很多事情可以说是关于您的代码的“不确定”,但您的问题来自这样一个事实,即无论玩家采取何种行动,都会检查left两者。right如果你按'a'left变成1。按'd'之后它将检查是否为left1并打印消息。

于 2013-01-04T14:20:39.583 回答
2

浏览代码:

  1. 我们称之为roomOneMoves()
  2. 用户按下a,移动变为'a'
  3. leftis not 1,所以我们不进入 if 的那个分支。
  4. right不是1,所以我们不进入 if 的那个分支。
  5. move 我们是 'a'这样称呼的roomOneLeft()
  6. left变成1,我们打印一条消息,然后roomOneMoves()再次调用。
  7. 用户按下dmove变为'd'
  8. left现在是 1,所以我们打印一条消息并roomOneMoves()再次调用。

换句话说,在您决定用户真正想去哪个房间之前,您正在检查您是否去过一个房间并退出。

于 2013-01-04T14:23:03.033 回答
1

你不会检查你的举动,直到为时已晚。观察:

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 解释器无法有效地评估尾递归,因此您可能希望使用迭代主循环而不是递归调用下一个函数。

于 2013-01-04T14:21:42.253 回答
0

问题在于您的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()

此外,您可能希望在最后无条件地重新启动该方法。

于 2013-01-04T14:21:41.113 回答