不保留新价值

时间:2014-06-07 17:10:18

标签: python python-2.7

我正在编写我的第一个节目,这是一个'琐事'风格的游戏。根据您选择的轮次提出问题,因此选择第1轮可以提供列表1中的问题,列表2中的第2轮问题等。

我写了一段代码,允许你在游戏中间更换回合,但如果你这样做,只有第一个问题来自新一轮,任何后续问题都会回复到上一回合。

所以:

  1. 我选择第1轮。
  2. 从第1轮获得提问。
  3. 切换到第2轮。
  4. 从第2轮开始问一个问题。
  5. 之后的所有问题都会回到第1轮。
  6. 我不知道为什么,我似乎无法找到任何理由应该这样做。

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

    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)
    

1 个答案:

答案 0 :(得分:2)

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。在这里没问题,你没有使用任何需要舍入的数学,但如果你确实需要使用该函数,请考虑到这一点。