2016-08-14 133 views
1

我从一本书中发明了这个猜测游戏的想法,Invent With Python。我不喜欢原始脚本没有涵盖重新猜测数字或错误地使用不在1-20中的数字的可能性,所以我修改了它。该程序很好用,但是,如果/ elif/else代码块只是我的头部。如果声明,避免嵌套? (Python 2.7)

我想重写脚本,而不必嵌套,如果在if中。我甚至不知道如何做到这一点。任何人都可以请帮助我 - 只有一个例子说明这个程序如何在没有嵌套的情况下工作会很棒!

下面是完整的小脚本:

from random import randint 
from sys import exit 
name = raw_input("Hello! What's your name? ") 
print "Well %s, I'm thinking of a number between 1 and 20." % name 
print "Since I'm a benevolent computer program, I'll give you 6 guesses." 
secret_number = randint(1, 20) 

guesses_left = 6 
already_guessed = [] 

while guesses_left > 0: 
    try: 
     guess = int(raw_input("Take a guess: ")) 

     if guess >= 1 and guess <= 20 and guess not in already_guessed: 
      already_guessed.append(guess) 
      guesses_left -= 1 

      if guess == secret_number: 
       print "You win! %d was my secret number!" % secret_number 
       exit(0) 
      elif guess < secret_number: 
       print "Your guess is too low!" 
      elif guess > secret_number: 
       print "Your guess is too high!" 

     elif guess in already_guessed: 
      print "You already guessed that!" 

     else: 
      print "Not a number between 1 - 20!" 
      print "Please try again!" 

     print "You have %d guesses left!" % guesses_left 

    except ValueError: 
     print "Invalid input! Please try again!"  
+1

您可以使用[的'继续'语句](https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops),这也将有助于除了输入从'try'。 – Ryan

回答

5

试试这样,使用continue退出循环的当前迭代,并在循环的顶部重新开始。

你也有一个逻辑错误的位置:

if guess <= 1 and guess >= 20 and guess not in already_guessed: 

许多不可能既小于或等于1,和大于或等于20你and应该是一个or是这样的:

if (guess <= 1 or guess >= 20) and guess not in already_guessed: 

或者简单:

if 1 <= guess <= 20 and guess not in already_guessed: 

另外,请ÿ我们try/except只左右,实际上可以产生一个异常(或不应该发生,如果发生异常的事情:

from random import randint 
import sys 

name = raw_input("Hello! What's your name? ") 
print "Well {}, I'm thinking of a number between 1 and 20.".format(name) 
print "Since I'm a benevolent computer program, I'll give you 6 guesses." 

secret_number = randint(1, 20) 
guesses_left = 6 
already_guessed = [] 

while guesses_left > 0: 
    print "You have {} guesses left!".format(guesses_left) 

    try: 
     guess = int(raw_input("Take a guess: ")) 
    except ValueError: 
     print "Invalid input! Please try again!\n" 
     continue 

    # If the number is not between 1 and 20... 
    if not (1 <= guess <= 20): 
     print "Not a number between 1 - 20!" 
     print "Please try again!\n" 
     continue 

    if guess in already_guessed: 
     print "You already guessed that!\n" 
     continue 

    guesses_left -= 1 
    already_guessed.append(guess) 

    if guess == secret_number: 
     print "You win! {} was my secret number!".format(secret_number) 
     sys.exit(0) 
    elif guess < secret_number: 
     print "Your guess is too low!\n" 
    elif guess > secret_number: 
     print "Your guess is too high!\n" 

下面是一个例子来看:

Hello! What's your name? :) 
Well :), I'm thinking of a number between 1 and 20. 
Since I'm a benevolent computer program, I'll give you 6 guesses. 
You have 6 guesses left! 
Take a guess: 2 
Your guess is too low! 

You have 5 guesses left! 
Take a guess: 2 
You already guessed that! 

You have 5 guesses left! 
Take a guess: 3 
Your guess is too low! 

You have 4 guesses left! 
Take a guess: 7 
Your guess is too high! 

You have 3 guesses left! 
Take a guess: 5 
Your guess is too high! 

You have 2 guesses left! 
Take a guess: 4 
You win! 4 was my secret number! 
+1

我喜欢这个最好的,谢谢!我特别喜欢try/except块上的指针 - 我一定误解了关于try/except块的在线Python文档 - 它看起来像是需要嵌套在其中的所有东西。 –

+0

没问题,很高兴帮助:)是的,想想'try:... except:...'as'在这个块中运行代码,并且如果这个块内的任何代码失败,立即跳转到代码在'except:'并运行它“。因此,由于'except:'(在我上面的示例中)执行了“continue”,循环中的其余代码将永远不会执行。循环其余部分的代码永远不会引发一个'ValueError'。有时候,你确实想要放置不会在'try:'块内产生错误的代码,例如,如果你不能'继续','break'或'return',并且你不想要代码继续执行。 – Will

+1

此外,如果这解决了您的问题,请单击答案旁边的复选标记以将问题标记为已解决:)谢谢! – Will

1

只要改变嵌套的if语句elif的,像这样:

from random import randint 
from sys import exit 
name = raw_input("Hello! What's your name? ") 
print "Well %s, I'm thinking of a number between 1 and 20." % name 
print "Since I'm a benevolent computer program, I'll give you 6 guesses." 
secret_number = randint(1, 20) 

guesses_left = 6 
already_guessed = [] 

while guesses_left > 0: 
    try: 
     guess = int(raw_input("Take a guess: ")) 

     if guess <= 1 and guess >= 20 and guess not in already_guessed: 
      already_guessed.append(guess) 
      guesses_left -= 1 

     elif guess == secret_number: 
      print "You win! %d was my secret number!" % secret_number 
      exit(0) 
     elif guess < secret_number: 
      print "Your guess is too low!" 
     elif guess > secret_number: 
      print "Your guess is too high!" 

     elif guess in already_guessed: 
      print "You already guessed that!" 

     else: 
      print "Not a number between 1 - 20!" 
      print "Please try again!" 

     print "You have %d guesses left!" % guesses_left 

    except ValueError: 
     print "Invalid input! Please try again!" 

这将是我看到解决您的两难困境最简单的方法

+1

这从根本上改变了程序的控制流程。 – Will