【问题标题】:Guessing number game python猜数字游戏python
【发布时间】:2016-06-21 20:28:16
【问题描述】:

所以我正在开发一个猜数字游戏,其中一个要求是更新数字的“范围”,以便用户更轻松地进行猜数字。当数字太高或太低时,我创建了一个新输入。但是,我对循环不是很好,我无法弄清楚为什么我的循环只重复一次而没有一遍又一遍地粘贴代码。谁能帮忙,这样 elif 语句会重复,直到数字正确?

这是我迄今为止的代码...

import random
random_number = random.randint(1,100)
tries = 0
while tries < 800:
  guess = input("Guess a random number between 1 and 100.")       
  tries += 1
  try:
    guess_num = int(guess)
  except:
    print("That's not a whole number!")
    break

  if not guess_num > 0 or not guess_num < 101:
    print("That number is not between 1 and 100.")
    break

  elif guess_num == random_number:
    print("Congratulations! You are correct!")
    print("It took you {} tries.".format(tries))
    break

  elif guess_num > random_number:
      print("Sorry that number is too high.")
      guess_high = input("Guess a number between 0 and {} .".format(guess_num))

  elif guess_num < random_number:
      print("Sorry that number is too low.")
      guess_low = input("Guess a number between {} and 100 .".format(guess_num))

  else:
      print("Sorry, but my number was {}".format(random_number))
      print("You are out of tries. Better luck next time.")

【问题讨论】:

  • 您没有更新实际范围,而只是打印出来
  • 那么我该如何更新范围以缩小用户输入的范围?
  • 除非答案正确,否则不应中断。删除所有其他出现的break
  • 我上传的代码每次都会更新范围,对您的代码也进行了少量修改。

标签: python loops input while-loop


【解决方案1】:
import random
random_number = random.randint(1,100)
tries = 0
guess = input("Guess a random number between 1 and 100.")       
while tries < 800:
  tries += 1
  try:
    guess_num = int(guess)
  except:
    print("That's not a whole number!")
    break

  if not guess_num > 0 or not guess_num < 101:
    print("That number is not between 1 and 100.")
    break

  elif guess_num == random_number:
    print("Congratulations! You are correct!")
    print("It took you {} tries.".format(tries))
    break

  elif guess_num > random_number:
      print("Sorry that number is too high.")
      guess = input("Guess a number between 0 and {} .".format(guess_num))

  elif guess_num < random_number:
      print("Sorry that number is too low.")
      guess = input("Guess a number between {} and 100 .".format(guess_num))

else:
  print("Sorry, but my number was {}".format(random_number))
  print("You are out of tries. Better luck next time.")

【讨论】:

  • 您的代码无法工作,因为它不能处理任意范围,例如 25-30。
  • (参见我的另一篇文章)由于用户可以使用“二分搜索”进行游戏,我建议将尝试次数限制在 800 次以下(大约 8 次就足够了)。这将使测试最后一个else: 更快。
【解决方案2】:

对于哪种情况,您的循环只重复一次?

如果输入的猜测值小​​于 0 或大于 100,则循环将中断(因为您在第 15 行的“if not guess_num > 0 or not guess_num

如果用户在 1 到 100 之间输入了一个错误的猜测值,那么代码会循环,因此会要求用户输入另一个数字。

虽然它确实循环,但循环并没有更新范围。 您可以做的是将 range_min 和 range_max 设置为变量,并根据猜测太低或太高来更改这些变量。 见以下代码:

import random
random_number = random.randint(1,100)
tries = 0
range_min = 0
range_max = 100
while tries < 800:
  guess = input("Guess a random number between " + str(range_min +1) + " and " +  str(range_max))       
  tries += 1
  try:
    guess_num = int(guess)
  except:
    print("That's not a whole number!")
    break

  if not guess_num > range_min or not guess_num < (range_max+1):
    print("That number is not between str(range_min +1) + " and " +      str(range_max)")
    break

  elif guess_num == random_number:
    print("Congratulations! You are correct!")
    print("It took you {} tries.".format(tries))
    break

  elif guess_num > random_number:
      print("Sorry that number is too high.")
      guess_high = input("Guess a number between 0 and {} .".format(guess_num))
range_max = guess_num

  elif guess_num < random_number:
      print("Sorry that number is too low.")
      guess_low = input("Guess a number between {} and 100 .".format(guess_num))
range_min = guess_num

  else:
      print("Sorry, but my number was {}".format(random_number))
          print("You are out of tries. Better luck next time.") 

【讨论】:

  • 我的 elif 缩小了猜测范围,以便用户可以更轻松地猜测他们的数字是否太低或低于他们的数字如果它太高,但在新输入之后它又回到猜测介于 1 到 100 之间,而不是更新后的范围
  • 我编辑了我的答案。当用户输入错误的猜测并要求新的猜测时,循环确实会循环,但是它不会更新范围。
【解决方案3】:
  1. 不要使用 break,因为它们会终止 while 循环。请参阅 python 语言参考。

  2. 您应该只询问一次guess_num。当猜测值过高或过低时删除两个input(BTW 变量名guess 不正确)。

  3. 最后一个条件(尝试次数不足)应该在while 循环之外,因为它会在尝试次数超过 800 时执行。

  4. 提示。用户可以使用相当于二分搜索的方式玩这个游戏(从 50 开始,然后根据更高/更低等猜测 25 或 75)。您应该允许大约 8 次尝试(而不是 800 次)。

【讨论】:

  • 是的,谢谢,哈哈,我有 800 个用于跟踪和错误。
【解决方案4】:

以下是更新范围的方法:

import random
random_number = random.randint(1,100)
tries = 0
low = 0
high = 100
while tries < 800:
  if(tries == 0):
    guess = input("Guess a random number between {} and {}.".format(low, high))       
  tries += 1
  try:
    guess_num = int(guess)
  except:
    print("That's not a whole number!")
    break    

  if guess_num < low or guess_num > high:
    print("That number is not between {} and {}.".format(low, high))
    break    

  elif guess_num == random_number:
    print("Congratulations! You are correct!")
    print("It took you {} tries.".format(tries))
    break    

  elif guess_num > random_number:
      print("Sorry that number is too high.")
      high = guess_num
      guess = input("Guess a number between {} and {} .".format(low, high))    

  elif guess_num < random_number:
      print("Sorry that number is too low.")
      low = guess_num
      guess = input("Guess a number between {} and {} .".format(low, high))    

  else:
      print("Sorry, but my number was {}".format(random_number))
      print("You are out of tries. Better luck next time.")

【讨论】:

  • 没问题 ;) 顺便说一句,最后的 else 检查不需要在那里并且可以在 while 循环之外发生(它永远不会到达那个代码)
【解决方案5】:

我会这样做。不确定它是否有效,但方法是:

import random

random_number = random.randint(1,100)
max_tries = 100 
tries = 0
left = 0
right = 100
found = False


def get_number():
    try:
        guess = int(input("Guss a random number between {} and {}".format(left, right)))            
        if guess > right or guess < left:
            print("That number is not between {} and {}".format(left, right))
        return guess
    except:
        print("That's not a whole number!")
        get_number()

def update_range(guess):
    if guess >= left:
        left = guess
    else:
        right = guess        

while tries <= max_tries and not found:
    guess = get_number()
    tries=+1
    if guess == random_number:
        print("Congratulations! You are correct!")
        print("It took you {} tries.".format(tries))
        found = True
    else:
        update_range(guess)

  if not found:
      print("Sorry, but my number was {}".format(random_number))
      print("You are out of tries. Better luck next time.")

如您所见,我使用 辅助函数 来减少 if/else 结构的数量。

还需要更新范围。感谢参数化字符串,我可以告诉用户范围是多少。

我还设置了一个标志以了解用户在游戏结束时是否找到了号码

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-02-01
    • 2021-05-18
    • 2021-04-29
    相关资源
    最近更新 更多