一个猜数字游戏的实现

这是一个猜数游戏,你要猜的是一个4位数字,可以是0开头,数字不重复。
你有10次机会,每次猜测会提示几A几B,A表示数字和位置都正确,B表示
数字正确位置不正确,输入exit或quit可中途退出游戏。
游戏当中有个彩蛋,设置一个特殊四位数,每次输入就会出现“生日快乐”图片。

这个游戏有一定的数学背景,有数学家证明了在合适的策略下平均猜对

所需次数的期望值大约是5.2次。你试试看?

源码如下:

# This is an example!
# 引用random, PIL库
import random
from PIL import Image

# 判断猜测结果,返回'*A*B',A表示数字和位置都正确,B表示数字正确位置不正确
def check(answer, guess):
    A = 0  # 猜对数字和位置的个数
    B = 0  # 猜对数字但位置错误的个数
    for i, digit in enumerate(guess):
        if int(digit) == answer[i]:
        # digit是字符串guess的枚举,是字符型,answer是数值型列表
            A += 1
        elif int(digit) in answer:
            B += 1
    return '{}A{}B'.format(A, B)

def generate():
# 用0~9的列表生成随机数,取前4位作为答案
    digits = list(range(10))
    random.shuffle(digits)
    return digits[:4]

def draw():
    img = Image.open("birthday2.gif")
    img.show()
    img.close()

# 主函数
def main():
    print('这是一个猜数游戏,你要猜的是一个4位数字,可以是0开头,数字不重复。\n'
          '你有10次机会,每次猜测会提示几A几B,A表示数字和位置都正确,B表示'
          '数字正确位置不正确,输入exit或quit可中途退出游戏。')

    # 初始化和答案猜测次数
    answer = generate()
    tries = 0
    # 循环 10 次或者直到猜对
    while tries < 10:
        # 读取用户输入
        guess = input('请输入一个4位数字:')
        if guess == 'exit' or guess == 'quit':
            print('很遗憾,你没有在规定次数内猜对。答案是:',''.join(map(str, answer)))
            break
            # 输入exit或者quit可退出游戏

        if len(guess) != 4 or len(set(guess)) != 4 or not guess.isdigit():
            print('输入不合法,请重新输入!')
            continue

        if guess == "0529":
            draw()
            # 生日彩蛋!

        tries += 1
        # 判断猜测结果并输出提示
        result = check(answer, guess)
        print('第{}次猜测:{}'.format(tries, result))

        if result == '4A0B':
            print('恭喜你猜对了!')
            print('按任意键继续...')
            input()
            answer = generate()
            tries = 0
            continue

        if tries == 10:
            print('很遗憾,你没有在规定次数内猜对。答案是:',''.join(map(str, answer)))
            # ''.join将字符串用''连接,map将列表中每个元素变成字符串元素
            print('按任意键继续...')
            input()
            answer = generate()
            tries = 0
            continue

main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值