0

所以我一直在试图找出一种方法来编写一个程序,让计算机尝试猜测我正在考虑的数字,而不是让你猜测计算机选择的数字。它在大多数情况下都有效,但是在某些情况下,它确实会在链中重复数字,即使我之前已经告诉过它,例如我正在考虑的值高于“7”。在某些情况下,即使我告诉它更高或更低,它也会再次重复相同的数字。如果更有经验的人可以看看这个并告诉我我在这些循环中缺少什么,那将有很大帮助。

#computer enters a value x
#lower - computer guesses lower than x
#higher - computer guesses higher than x
#when string "You got it!" - game over

import random

lowBound = 0
highBound = 100
randomNumber = random.randint(lowBound,highBound)

print ("Is it ", randomNumber, " ?")
response = input()

while response != "You got it!":
    if response == "higher":
        lowBound = randomNumber    
        randomNumber = random.randint (lowBound, highBound)
        print ("Is it ", randomNumber, " ?")
        response = input()

    elif response == "lower":
        highBound = randomNumber
        randomNumber = random.randint (lowBound, highBound)
        print ("Is it ", randomNumber, " ?")
        response = input()

    if response == "You got it!":

        print ("Woohooo, I'm so bitchin'")
4

5 回答 5

3

random.randint是包容性的,所以:

if response == 'higher':
    lowBound = randomNumber + 1

if response == 'lower':
    highBound = randomNumber - 1

此外,如果用户没有输入有效的响应,input()将永远不会被再次调用,程序将陷入无限循环。

更强大的东西,但不处理骗子:

import random

lowBound = 0
highBound = 100
response = ''
randomNumber = random.randint(lowBound,highBound)

while response != "yes":
    print ("Is it ", randomNumber, " ?")
    response = input()
    if response == "higher":
        lowBound = randomNumber + 1   
        randomNumber = random.randint(lowBound,highBound)
    elif response == "lower":
        highBound = randomNumber - 1
        randomNumber = random.randint(lowBound,highBound)
    elif response == "yes":
        print ("Woohooo, I'm so bitchin'")
        break
    else:
        print ('Huh? "higher", "lower", or "yes" are valid responses.')
于 2013-02-15T01:55:22.457 回答
1

random.randint(a, b)返回一个介于 和 之间的数字,包括ab。生成新的随机数时,您应该使用random.randint(lowBound+1, highBound-1)

于 2013-02-15T01:54:52.717 回答
0

在提到的其他问题中,您的一个问题是在这些方面:

highBound = randomNumber
randomNumber = random.randint (lowBound, highBound)

您正在设置一个新的界限,这很好,但是您正在选择另一个随机数!

您应该做的是将界限减半,并从那里询问用户更高或更低。看看二进制搜索算法。

highBound = randomNumber
randomNumber = randomNumber / 2

您的程序仍然可以工作(这里提到的其他更改),但这会在大多数情况下更快地猜出您的号码。

实际上在维基百科上有一个这个游戏的例子。

于 2013-02-15T01:58:10.340 回答
0

这是 Michael Dawson 书中的这个练习的版本,我试图尽量减少计算机使用的尝试次数。我知道代码看起来很狡猾,这只是我的第二天:)


answer=""
guess=50
counter=3
x=25

print("hi, guess the number from 1 too 100")
input("\n")

print ("i will try to guess it")
print ("is it ", guess, "?")

while answer not in ("y","l","s"):
    print ("sorry, i didn't understand \n")
    answer=input("type in: (Y) for yes, or (L) if it is to large, or (S) if it is to small:")

if answer in ("s","l"):
    while answer!="y":

        if answer=="l":
            guess=int(guess-x)
            print ("how about", guess,"?")
            answer=input("\nis it? type in: (Y) for yes, or (L) if it is to large, or (S) if it is to small:")
            x=100/2**counter
            counter=counter+1
            if x<1:
                x=1

        elif answer=="s":
            guess=int(guess+x)
            print ("how about", guess,"?")
            answer=input("\nis it? type in: (Y) for yes, or (L) if it is to large, or (S) if it is to small:")
            x=100/2**counter
            counter=counter+1
            if x<1:
                x=1

        elif answer=="y":
            break
else:
    pass

print("\ngreat! the number that you guessed is", guess)
print("i can read your mind with no guesses!")
input("\n")
于 2014-10-13T16:47:15.827 回答
-1

你会得到两次数字,因为random.randint的边界是包容性的;random.randint(1, 3)可以返回 1,2 或 3。请注意,如果响应既不是“更高”、“更低”或“你知道了!”,您还应该继续询问人类:

import random
lowBound = 0
highBound = 100

while True:
    randomNumber = random.randint(lowBound, highBound)
    print ("Is it ", randomNumber, " ?")
    response = input()

    if response == "higher":
        lowBound = randomNumber + 1
    elif response == "lower":
        highBound = randomNumber - 1

    if response == "You got it!":
        print ("Woohooo, I'm so bitchin'")
        break
于 2013-02-15T01:55:06.113 回答