Python数字猜谜游戏

时间:2013-10-02 20:22:30

标签: python while-loop python-3.3

我在网上发现了一些练习题,我让他们中的大部分都工作了,但这个让我很难过。它不是功课,所以我没有得分。但是,没有提供解决方案,因此获得答案的唯一方法是通过这样做。

任务要求你写一个问题,为数字1-100播放数字猜谜游戏。但是,这个尝试通过间隔猜测来猜测用户数,例如[1, 100],并使用first+last/2生成下一个问题。

我从网站上运行了一个示例。

  

考虑1到100(含)之间的数字   回答以下问题,字母y或Y表示是,n或N表示否   间隔:[1,100]。你的电话号码是<= 50? ÿ
  间隔:[1,50]。你的电话号码是<= 25? ÿ
  间隔:[1,25]。你的电话号码是<= 13? ÿ
  间隔:[1,13]。你的号码是&lt; = 7? ñ
  间隔:[8,13]。你的号码是&lt; = 10? ñ
  间隔:[11,13]。你的号码是&lt; = 12? ÿ
  间隔:[11,12]。你的号码是&lt; = 11? ÿ
  你的电话号码是:11

到目前为止,这是我的代码,但我甚至不知道从哪里开始,因为while循环不断给我一个无限循环。我知道“中间”数字需要是一个整数,否则它将是一个无限循环,但我似乎无法弄清楚如何做到这一点。

x = input("Is your numbr <=50?")
count = 100
while x=="y" or "Y":
    count = count/2
    x = input("Is your number <=",count,"?")
    print(count)

如果有人有任何提示,我们将不胜感激。

3 个答案:

答案 0 :(得分:2)

问题在于:

while x=="y" or "Y":

表达式“Y”将始终评估为true。

你想要

while x == "y" or x == "Y":

即使这样,当用户键入“N”时,这将结束循环。一个工作循环可能是:

finished = False
while not finished:
    if x == "y":
        upper -= (upper-lower)/2
        # prompt for input
    elif x == "n":
        lower += (upper-lower)/2
        # prompt for input
    if upper == lower or (upper - 1) == lower:
        finished = True
        # final output

你应该可以从那里填补空白。

答案 1 :(得分:1)

一个好主意是拥有一个简单的while True:循环,在其中保持最大猜测和最小猜测。然后,您询问用户他们的号码是否大于两者的平均值。如果是,请将最小猜测更新为平均值。如果没有,您将最大猜测降低到平均值。重复,直到两个猜测相等,此时你已经找到了数字,并且可以突破无限循环。

当然,您必须进行一些简单的奇偶校验,以确保您在每一轮中实际改变您的猜测。你应该真的使用raw_input()作为字符串,input()是用于python格式的数据。

答案 2 :(得分:1)

问题的全部概念是保持两个“边界”从1和100开始,每次你提出一个问题“你是数字&lt; = X”你根据答案丢弃了一半的范围,你在你目前的解决方案中没有这样做。

像这样。

lower = 1
high = 100
mid = (high + lower)/2 -> at start it will be 50

如果用户回答是,则从当前下限到范围中间的范围,否则继续从中间+ 1到结尾的范围,如下所示:

如果用户回答是:

high = mid

如果用户回答否:

lower = mid +1

这个想法的最后一部分是检测范围低 - 高仅包含2个数字,或者是这样的数字[11,12],你使用用户的最终答案来选择正确答案和程序终止,完整的代码在这里,你可以测试它:

found = False
range_lower_bound = 1
range_high_bound = 100

print "Think of a number between 1 and 100 (inclusive)."
print "Answer the following questions with letters y or Y for yes and n or N for no."

while not found:
    range_mid = (range_high_bound + range_lower_bound) / 2
    x = raw_input('interval: [%s,%s]. Is your number <= %s? ' % (range_lower_bound, range_high_bound, range_mid))
    if x.lower() == 'y':
        # Check if this is the last question we need to guess the number
        if range_mid == range_lower_bound:
            print "Your number is %s" % (range_lower_bound)
            found = True
        range_high_bound = range_mid
    # here i'm defaulting "anything" no N for simplicity
    else:
        # Check if this is the last question we need to guess the number
        if range_mid == range_lower_bound:
            print "Your number is %s" % (range_high_bound)
            found = True
        range_lower_bound = range_mid + 1

希望它有所帮助!