12

我正在尝试创建一个包含 if/elif 语句的函数,并且我希望 if 中断一个 while 循环。该函数用于文本冒险游戏,是一个是/否的问题。这是我到目前为止想出的..

def yn(x, f, g):
    if (x) == 'y':
         print (f)
         break
    elif (x) == 'n'
         print (g)

name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, '+name+'. Are you ready for your adventure?'

while True:
    ready = raw_input('y/n ')
    yn(ready, 'Good, let\'s start our adventure!', 
       'That is a real shame.. Maybe next time')

现在我不确定我是否正确使用了该功能,但是当我尝试使用它时,它说我不能中断该功能。因此,如果有人可以帮助我解决这个问题,并且如果函数和调用函数本身的格式错误,如果你可以帮助我,那将非常感激。

4

6 回答 6

17

您可以处理一个例外:

class AdventureDone(Exception): pass

def yn(x, f, g):
    if x == 'y':
         print(f)
    elif x == 'n':
         print(g)
         raise AdventureDone

name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, '+name+'. Are you ready for your adventure?'

try:
    while True:
        ready = raw_input('y/n ')
        yn(ready, "Good, let's start our adventure!",
           'That is a real shame.. Maybe next time')
except AdventureDone:
    pass
    # or print "Goodbye." if you want

这会while一遍又一遍地循环循环,但是在yn()函数内部会引发一个异常,从而中断循环。为了不打印回溯,必须捕获并处理异常。

于 2013-04-18T09:44:30.540 回答
3

您需要将函数内部的中断更改为返回,并且您需要有一个else声明,以防用户没有为您提供正确的输入。最后,您需要将您的调用while loop转换为 if 语句。

如果玩家输入所需的命令,这将允许您中断 while 语句,否则它将再次询问。我还更新了您的yn功能,以允许用户使用小写和大写字符,以及是和否。

def yn(input, yes, no):
    input = input.lower()
    if input == 'y' or input == 'yes':
        print (yes)
        return 1
    elif input == 'n' or input == 'no':
        print (no)
        return 2
    else:
        return 0

name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, %s. Are you ready for your adventure?' % name

while True:
    ready = raw_input('y/n ')
    if yn(ready, 'Good, let\'s start our adventure!',
       'That is a real shame.. Maybe next time') > 0:
        break

这背后的想法很简单。该yn函数具有三种状态。用户回答是、否或无效。如果用户响应是或否,该函数将返回 1 表示是,2 表示否。如果用户没有提供有效的输入,例如空格,它将返回 0。

在循环内部,我们用一个检查函数是否返回大于 0 的数字while True:的 yn('....', '....') 函数包装。因为如果用户向我们提供有效输入,则返回 0 , 和 1 或 2 表示有效输入。if statementynyn

一旦我们得到了一个有效的响应,yn我们调用了 break,这将停止while loop并且我们完成了。

于 2013-04-18T09:45:55.803 回答
3

您需要在循环本身内跳出 while 循环,而不是从另一个函数内跳出。

像下面这样的东西可能更接近你想要的:

def yn(x, f, g):
    if (x) == 'y':
        print (f)
        return False
    elif (x) == 'n':
        print (g)
        return True

name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, '+name+'. Are you ready for your adventure?'

while True:
    ready = raw_input('y/n: ')
    if (yn(ready, 'Good, let\'s start our adventure!', 'That is a real shame.. Maybe next time')):
        break
于 2013-04-18T02:20:19.130 回答
0

一种方法是yn返回一个布尔值,然后将其用于跳出循环。否则break,函数内的 a 不能跳出调用函数中的循环。

def yn(x, f, g):
    if (x) == 'y':
        print (f)
        return True
    elif (x) == 'n'
        print (g)
        return False

name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, '+name+'. Are you ready for your adventure?'
done = False
while not done:
    ready = raw_input('y/n ')
    done = yn(ready, 'Good, let\'s start our adventure!', 'That is a real shame.. Maybe next time')
于 2013-04-18T02:17:23.303 回答
0

使用 break ,即使不满足循环结束的条件,您也可以退出循环。你不能有 break 因为 'if /elif ' 不是一个循环,它只是一个条件语句。

于 2013-04-18T02:19:23.327 回答
-1
a = True

def b():
    if input("") == "Quit":
        global a
        a == False
    else:
        pass

while a == True:
    print('Solution')
于 2017-08-01T12:56:35.547 回答