我正在写我的第一个程序,这是一个“琐事”风格的游戏。根据您选择的回合来询问问题,因此选择第一回合将为您提供列表1中的问题,第二回合则为列表2中的问题,依此类推。

我已经编写了一段代码,可以让您在游戏进行中更改回合,但是如果您这样做,则仅第一个提出的问题来自新回合,因此所有随后提出的问题都将还原为上一个回合。

所以:


我选择第一轮。
从第一轮获取问题
切换至第2轮。
在第二轮中被问一个问题。
之后的所有问题都回到第一轮。


我不确定为什么,而且似乎也找不到任何理由这样做。

有问题的代码的精简版本是:

round = raw_input ("Round?: ")

def turn(round):
    print "Current Round = " + round
    if round == "1":
        print (choice (ssq1))
        play_again = raw_input("Again?: ")
        repeat(play_again)

    elif round == "2":
        print (choice (ssq2))
        play_again = raw_input("Again?: ")
        repeat(play_again)

def repeat(play_again):

    if play_again == "Yes" or play_again == "Y":
        turn(round)

    elif play_again == "New":
        new_round = True
        new_turn(new_round)

def new_turn(new_round):
    round = raw_input("Okay, Which round?: ")
    turn(round)

from random import choice

ssq1 = ["Round1Q1", "Round1Q2", "Round1Q3"]
ssq2 = ["Round2Q1", "Round2Q2", "Round2Q3"]

turn(round)

最佳答案

round中的repeat()是全局变量,该变量在开始时设置。您需要通过本轮比赛; round中使用的本地名称turn()

repeat(play_again, round)


并在repeat()函数中将其用作附加参数:

def repeat(play_again, round):
    if play_again == "Yes" or play_again == "Y":
        turn(round)

    elif play_again == "New":
        new_round = True
        new_turn(new_round)


您的递归函数相当复杂。考虑改用while循环:

def turn(round):
    print "Current Round = " + round
    if round == "1":
        print (choice (ssq1))

    elif round == "2":
        print (choice (ssq2))

round = None

while True:
    if round is None:
        round = raw_input ("Round?: ")

    turn(round)

    play_again = raw_input("Again?: ")
    if play_again == 'New':
        # clear round so you are asked again
        round = None
    elif play_again not in ('Yes', 'Y'):
        # end the game
        break


现在,turn()函数仅处理游戏的回合。重复,要求打什么回合以及结束游戏都是在一个无尽的while循环中进行的。 break语句用于结束该循环。

您可以考虑的另一个改进是使用字典或列表来进行轮次,而不是顺序命名的变量:

round_questions = {
    "1": ["Round1Q1", "Round1Q2", "Round1Q3"],
    "2": ["Round2Q1", "Round2Q2", "Round2Q3"],
}


这消除了使用大量条件的需要。您只需按键即可检索正确的列表:

def turn(round):
    if round in round_questions:
        print "Current Round = " + round
        ssq = round_questions[round]
        print choice(ssq)

    else:
        print "No such round", round


这也使错误输入的处理变得更加容易。如果选择的回合不是字典中的键,则第一个if语句将为false,而您可以打印一条错误消息。

请注意,通过使用round作为变量名,可以屏蔽built-in function by the same name。在这里很好,您没有使用任何需要四舍五入的数学,但是如果您确实需要使用该函数,请考虑到这一点。

关于python - 新值(value)未保留,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24099673/

10-12 21:08