Python数字游戏

时间:2013-12-03 20:24:43

标签: python

这是一段允许用户选择号码的代码,计算机会猜出号码。但是,当计算机猜测时,它有时会猜不到同一个数字。如何阻止计算机猜测已经猜到的数字。

import random

print('This is a game where the user chooses\n' +
  'a number for the computer to guess.')

guess = random.randint(1, 50)

number = int(input('\n\nChoose a number between 1 and 50: '))

while guess != number:
    if guess > number:
        guess = random.randint(number, 50)


    else: guess < number
    guess = random.randint(1, number)

print(guess)
input('Enter to see the next number')




print('The computer guessed your number:', guess,'!')


input('\n\n\nPress enter to exit!')

6 个答案:

答案 0 :(得分:2)

不重写游戏的其他方面......

尝试这样做两次不选择相同的数字:

numbers = range(1,51)
ind = random.randint(0, len(numbers)-1)
guess = numbers[ind]
numbers.remove(ind+1)

numbers将仅包含要猜测的未编辑的数字列表

(如果您有49个猜测的号码列表,则不会永远找到未经编号的号码!)

[编辑]并从以下评论中获取:

numbers = range(1,51)
guess = numbers.pop(random.randint(0,len(numbers)-1))

答案 1 :(得分:1)

您可以保留计算机猜到的所有数字的缓存。也许使用dictlist或其他内容。

但是,这并不能阻止计算机猜出相同的数字(只是意味着如果已经看到它就会选择另一个数字)。

如果您想永远不要猜两次相同的数字,您需要从固定的数字组中随机抽取数字,然后从集合中删除该数字。这可以保证您永远不会选择两次相同的号码。但是,根据候选人的数量,这可能是也可能不是可行的解决方案(例如,如果存在无限多种可能性)。

答案 2 :(得分:1)

问题是你只保留最后的猜测信息并猜测它与总范围的最大值或最小值之间。这将保持相同的方法,但基于已经知道其已经猜到的更高或更低的数字来限制猜测。

max_guess = 50
min_guess = 1

guess = random.randint(min_guess, max_guess)

while guess != number:
    if guess > number:
         max_guess = guess - 1
    else:
        min_guess = guess + 1         
    guess = random.randint(min_guess, max_guess)

答案 3 :(得分:0)

您想要真正的随机数并且您已连接到互联网吗? https://pypi.python.org/pypi/randomdotorg/

我建议也玩random.seed或/和random.choice(范围(分钟,最大))

答案 4 :(得分:0)

你可以试试这个:

#!/usr/bin/env python
import random
print('This is a game where the user chooses a number for the computer to guess.')

guesses = range(1,51)
random.shuffle(guesses)

number = int(input('\n\nChoose a number between 1 and 50: '))

while True:
  guess=guesses[0]
  print "The computer guessed %d" % (guess)
  if guess > number:
    guesses=[x for x in guesses if x<guess]
  elif guess < number:
    guesses=[x for x in guesses if x>guess]
  else:
    break

print('The computer guessed your number!')

我们将存储所有可能的猜测并随机化他们的订单。然后我们将使用来自用户的信息逐步消除潜在的猜测。我们不必重新洗牌或随意选择随机数,因为从随机排序的数组中删除元素会维持我们将从中拉出的下一个元素的“随机性”。

虽然修复random.randint()电话的范围也可以解决问题(并且更清洁),我描述的方法提供了一种更通用的替代方法(例如,如果用户突然告诉你他们的号码很奇怪。

答案 5 :(得分:0)

由于这似乎是“大于,小于”的游戏,我建议通过修复用于提供给随机生成器的范围的逻辑来解决该问题。

计算机不应该从相同的范围两次猜测计算机所做的任何选择将始终与所寻求的数字“更高”或“更低”或“相等” - 此信息应用于更新选择下一个随机数的范围。更新范围排除之前的随机猜测。

在随机范围选择中使用number是错误的,因为它与猜测无关;它正是所寻求的。您可能需要两个额外的变量minGuessmaxGuess,它们会在每个循环中更新,并用于限制随机值的范围。

尝试与另一个人玩游戏 - 如何快速“猜出”正确的号码?如果您正在玩最小的“猜测”,您将始终将范围直接分成两半,但您可以从剩余范围中随机选择 ,就像计算机那样(或应该)。