【问题标题】:How to restart a loop, in the middle, to the beginning [duplicate]如何在中间重新开始循环到开头[重复]
【发布时间】:2020-02-14 02:40:17
【问题描述】:

我正在尝试使用 def 工具制作一个基于文本的游戏来制作一个简单的循环。但是,当玩家死亡时,我无法拥有它,询问玩家是否希望再次玩,然后循环重新开始。我已经更改了代码,以便当玩家死亡时, playAgain = "n" 循环结束,但它仍然什么都不做。是因为它是一个全局变量而我试图用一个局部变量来影响它吗?如果是这样,我该如何解决?

playAgain = "y"
while playAgain == "y" or playAgain == "yes" :
    displayIntro()
    choosePath()
    checkPath()
    NextSteps()
    Reaction()
    attackCHOICE()

    if playAgain != "y" or playAgain != "yes":
        time.sleep(1)
        print()
        delayprint("Do you want to play again? ")
        playAgain = input()

【问题讨论】:

  • 我这一切都在一个函数里面?能否请您显示更多的代码结构
  • 如果您简单地运行:import time playAgain = "y" while playAgain == "y" or playAgain == "yes" : #displayIntro() #choosePath() ##checkPath() #NextSteps() #Reaction() #attackCHOICE() if playAgain != "y" or playAgain != "yes": time.sleep(1) print() #delayprint("Do you want to play again? ") playAgain = input() ,它将具有您所期望的行为。这意味着您可能遇到了上下文变量问题,正如您所说,或者您的某个函数可能正在做他们不应该做的事情
  • 它只是在一个“while”循环中

标签: python


【解决方案1】:

当我们在函数内部创建一个变量时,它是该函数的本地变量。考虑下面的代码。

playAgain = "y"  # Define a variable outside the function

def setPlayAgainToNo():
    playAgain = "no"


print(playAgain)  # value is "y"
setPlayAgainToNo()  # This modifies a local variable and not the global one
print(playAgain)  # value is still "y"

注意,如果我们在下面定义函数

def printPlayAgain():
    print(f"The value of playAgain is {playAgain}")

然后它将打印外部定义的变量的值,因为我们没有创建本地“playAgain”变量。

好的,那我该如何修改函数内部的全局值呢?

只需在你的函数中使用global variableName 来告诉python不要创建局部变量并使用外部变量。

def setPlayAgainToNo():
    global playAgain
    playAgain = "no"  # this will modify the global value

【讨论】:

  • 感谢您提供全局变量建议,但是在我的代码中,当玩家死亡时未显示我将变量设置为 #playAgain = "n" 现在可以与 #global variableName 一起使用,所以谢谢
【解决方案2】:
playAgain = "y"
while playAgain == "y" or playAgain == "yes" :
    displayIntro()
    choosePath()
    checkPath()
    NextSteps()
    Reaction()
    attackCHOICE()

    delayprint("Do you want to play again? ")
    playAgain = input()

    if playAgain != "y" or playAgain != "yes":
        time.sleep(1)
        print()

只需在 if 语句之外再次检查您的游戏。

您当前的循环将永远运行,因为最初 playAgain 始终为“y”,因此它永远不会到达您的 if 语句并询问他们是否要再次播放。

【讨论】:

  • 这行不通,因为当用户选择n 时,程序会休眠然后开始游戏,然后询问用户是否想再玩一次。期望的行为是一直询问直到用户说是,然后游戏才应该开始,而不是之前。
  • 这将工作 100%。如果用户选择 n,那么您的 if 语句将执行,并且循环将停止。游戏绝对不会再循环了。
  • 但要求是睡眠 (1),然后让用户再次播放。至少问题是这样表述的。
  • 然后只需将 sleep 命令移到您的输入上方?我的意思是这是一件微不足道的事情,甚至无法解决他的问题
【解决方案3】:

您的代码有两个问题。

  1. 除了if 语句(它永远不会触发,因为playAgain 始终是y)之外,您永远不会从用户那里收集输入
  2. playAgain 不会因为用户在任何其他函数中的选择而改变(例如在 displayIntro()displayIntro() 中),因为在 Python 中,参数是 passed by assignment,换句话说,改变函数内的变量不会不要在外部范围内更改它。

可以在here找到解释python分配的一个很好的答案

要解决这两个问题,您需要将函数返回值分配给外部范围变量playAgain 或从if 块中寻找用户的输入。

我在下面修改了您的代码以突出显示第二种方法。

playAgain = "y"
while playAgain == "y" or playAgain == "yes" :
    displayIntro()
    choosePath()
    checkPath()
    NextSteps()
    Reaction()
    attackCHOICE()
    playAgain = input()


    if playAgain != "y" or playAgain != "yes":
        time.sleep(1)
        print()
        delayprint("Do you want to play again? ")
        playAgain = input()

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多