美文网首页
python入门实战:猜数字游戏

python入门实战:猜数字游戏

作者: Lupino | 来源:发表于2020-11-12 20:42 被阅读0次

什么是猜数字游戏

百科介绍如下:
猜数字游戏 通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。
接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
猜数字游戏通常设有猜测次数的上限。根据计算机测算,如果采用严谨的猜测策略,任何数字最多7次就可猜出(即达到 4A0B)。值得注意的是,在有些地方把次数上限定义为最多几次猜测以后就可以肯定数字是几,但这时或还需要再猜一次才能得到 4A0B 的结果。

实现思路

1、由python生成四位随机不重复的数字
2、接收用户输入
3、判读用户输入的是否为四位不重复的数字
4、如果重复,提示用户数字不能重复,进入步骤 2
5、比对用户输入和生成的数字
6、计算出 ?A ?B
7、判断是否为 4A0B
8、如果是 恭喜用户猜对,进入步骤 1
9、检查猜了几次
10、若超过 8 次,提示用户 猜错了,正确答案是 XXXX
11、进入步骤 1

实现过程

1、生成四位随机不重复的数字

$ python3
>>> import random
>>> random.randint(0, 9)
5
>>> random.randint(0, 9)
6
>>> random.randint(0, 9)
7
>>> random.randint(0, 9)
1
>>> random.randint(0, 9)
4
>>> random.randint(0, 9)
4
>>> random.randint(0, 9)
2
>>> random.randint(0, 9)
7
>>>

通过交互式命令行使用 random.randint(0,9) 生成一位随机数,我们发现他会重复,我们可以通过循环多生成几次就可以得得到四位不重复的数字。

import random
def gennums():
    nums = []
    while True:
        num = random.randint(0, 9)
        if num in nums:
            continue
        nums.append(num)
        if len(nums) >= 4:
            break
    return nums
Hack Editor 2020-11-12 19-54-49.jpg

2、接收用户的输入

>>> nums = input('请输入四位不重复的数字: ')
请输入四位不重复的数字: 11234
>>> nums
'11234'
>>> nums.isdigit()
True
>>> nums = input('请输入四位不重复的数字: ')
请输入四位不重复的数字: abcdef
>>> nums
'abcdef'
>>> nums.isdigit()
False
>>>

通过交互式命令行使用 input 来接收用户的输入,这个 input 可以接受任何输入,所以我们我们需要自己过滤用户的输入,并做一些提示。

def readnums():
    while True:
        nums = input('请输入四位不重复的数字: ')
        if len(nums) != 4:
            print('只能输入4位数字')
            continue
        if not nums.isdigit():
             print('请输入正确的数字')
             continue
        tempval = []
        isrepeat = False
        for num in nums:
            if num in tempval:
                isrepeat = True
                break
            tempval.append(num)
            
        if isrepeat:
            print('错误有重复的数字')
            continue
        return nums
Hack Editor 2020-11-12 20-12-48.jpg

3、比对两数字

我们先把生成的数字转成文本

def tostr(nums):
    retval = ''
    for num in nums:
        retval += str(num)

    return retval
Hack Editor 2020-11-12 20-18-48.jpg

计算出 ?A?B

def calcab(nums1, nums2):
    b = 0
    for num in nums1:
        if nums2.find(num) > -1:
            b += 1
    a = 0
    for num1, num2 in zip(nums1, nums2):
        if num1 == num2:
            a += 1
            
    return a, b - a
Hack Editor 2020-11-12 20-25-02.jpg

4、猜一个数字

def guessnums():
    sysnums = tostr(gennums())
    guessed = False
    for _ in range(8):
        inpnums = readnums()
        a, b = calcab(sysnums, inpnums)
        print('{} {}A{}B'.format(inpnums, a, b))
        if a == 4:
            guessed = True
            break
    if guessed:
        print('恭喜你答对了')
    else:
        print('答错了,正确答案:{}'.format(sysnums))
guessnums()
Hack Editor 2020-11-12 20-36-12.jpg Hack Editor 2020-11-12 20-40-46.jpg

到这里猜数字游戏已经完成。

完整代码请查看 https://github.com/Lupino/mini-spider/blob/master/guessnumber.py

相关文章

网友评论

      本文标题:python入门实战:猜数字游戏

      本文链接:https://www.haomeiwen.com/subject/jinpbktx.html