题目描述
提供一个由 0-9 数字组成的不重复的随机位置的 4 位数。用户进行输入猜测。每次猜测后提供提示信息 A 和 B 的数量,其中,A 表示数字存在在 4 位数之间并且摆放位置正确的数字的个数。B 表示数字存在在 4 位数之间但位置摆放不正确的数字个数。
例如:假设答案是 7365
输入 0123 则提示信息应该为 0 A 1 B
输入 3756 则提示信息应该为 0 A 4 B
输入 7356 则提示信息应该为 2 A 2 B
输入 7365 则提示信息应该为 4 A 0 B
代码:
# 导入所需模块
import random
import string
import time
flag = 1 # 初始化flag为1
while flag: # 进入循环
guess_time = 1 # 初始化猜的次数为1
print("\n根据提示在有限次数内猜测出一串0-9组成有特定位置的4位数字\n提示方式:")
print(" A 数字存在并且位置正确的数字个数")
print(" B 数字存在的个数但位置摆放不正确的数字个数")
print("------------------------游戏加载------------------------")
scale = 50 # 进度条大概的宽度
# print("游戏加载".center(scale, "-")) # .center() 控制输出的样式,宽度为 25,汉字居中,两侧填充 -
start = time.perf_counter() # 调用一次 perf_counter(),从计算机系统里随机选一个时间点A,计算其距离当前时间点B1有多少秒。当第二次调用该函数时,默认从第一次调用的时间点A
# 算起,距离当前时间点B2有多少秒。两个函数取差,即实现从时间点B1到B2的计时功能。
for i in range(scale + 1):
a = '*' * i # i 个长度的 * 符号
b = '.' * (scale - i) # scale-i个长度的 . 符号 符号 * 和 . 总长度为50
c = (i / scale) * 100 # 显示当前进度,百分之多少
dur = time.perf_counter() - start # 计时,计算进度条走到某一百分比的用时
print("\r{:^3.0f}%[{}->{}] 加载花费:{:.2f}s".format(c, a, b, dur),
end='') # \r用来在每次输出完成后,将光标移至行首,这样保证进度条始终在同一行输出,即在一行不断刷新的效果;{:^3.0f},输出格式为居中,占3位,小数点后0位,浮点型数,对应输出的数为c;{
# },对应输出的数为a;{},对应输出的数为b;{:.2f},输出有两位小数的浮点数,对应输出的数为dur;end='',用来保证不换行,不加这句默认换行。
time.sleep(0.2) # 在输出下一个百分之几的进度前,停止0.2秒
# print("\n" + "开始游戏".center(scale, '-')) # .center() 控制输出的样式,宽度为 25,汉字居中,两侧填充 -
print("\n------------------------开始游戏------------------------")
print("这是由0-9组成的有特定位置4位数字,你有10次机会去猜对它")
seeds = string.digits # string.digits是一个定义好的数字字符串,范围为"0123456789"。
random_str = random.sample(seeds, k=4) # sample方法生成的4个随机数是不会重复的。
random_number = "".join(random_str) # 无分隔符连接随机生成的4个数字字符
print(random_number) # 查看答案
for t in range(10): # 循环10次
a = 0 # 初始化A的个数为0
b = 0 # 初始化B的个数为0
print("\n第%d次尝试:" % guess_time) # 打印第几次输入
guess_number = input() # 用户输入猜测的数字
for i, j in zip(guess_number, random_number): # 将guess_number和random_number中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
if i == j: # 数字存在并且位置正确时
a += 1 # A的个数加1
if i in random_number and i != j: # 数字存在但位置摆放不正确的数字个数
b += 1 # B的个数加1
guess_time += 1 # 猜测次数加1
print("{'A':%d, 'B':%d}" % (a, b)) # 打印AB的值作为提示
if guess_number == random_number: # 当猜的数字为随机数字时,执行下面程序
print("恭喜你!猜对啦!") # 打印“恭喜你!猜对啦!”
print("是否再玩一次呢?(是/否)") # 打印“是否再玩一次呢?(是/否)”
input_result = input() # 接收用户输入
if input_result == "是" or input_result == "是的": # 当用户输入“是”或者“是的”时,执行下面程序
break # 结束循环
elif input_result == "否":
flag = 0 # 把0赋给flag
break # 结束循环
if guess_time == 11: # 若猜数次数为11,打印“非常遗憾!你的机会用光啦!”
print("非常遗憾!你的机会用光啦!") # 打印“非常遗憾!你的机会用光啦!”