网站首页 > 基础教程 正文
本文将通过整合往期的“一学就废”基础碎片,综合运用各项基础知识,开发一个“猜数字游戏升级版”的Python程序,帮助加强基础编码能力。往期参考直达链接(末尾)。
实现功能简介
程序首先生成一个随机的四位数字作为目标数字,玩家需要猜测这个数字。
每次猜测后,程序会根据玩家的猜测给出提示,提示包括数字和位置都正确的个数(A)以及数字正确但位置错误的个数(B)。
玩家可以不断猜测,直到猜对为止,同时程序会记录玩家猜测的次数。
游戏结束后,玩家可以选择是否查看自己的猜测历史记录以及一些统计信息,如平均每次猜测花费的时间等。
代码设计
- 生成随机的四位目标整形数字。
- 利用循环(while 循环)让玩家不断输入猜测的数字,在循环内使用 try...except 处理玩家输入非数字等异常情况。
- 编写自定义函数来比较猜测数字和目标数字,返回 A 和 B 的值,函数参数包含固定的目标数字和玩家猜测的数字两个参数。
- 根据比较结果给出提示,使用 if...elif...else 判断并输出相应提示信息,利用格式化 F-string 使输出美观。
- 使用列表(List)记录玩家每次猜测的数字、猜测时间以及对应的 A 和 B 值。
- 猜对后,使用 for 循环遍历猜测历史记录列表并输出,同时计算平均每次猜测花费的时间等统计信息。
- 提供玩家是否查看历史记录的选择,使用 if 语句判断玩家选择并执行相应操作。
代码实现
以下是完整代码实现。
import random
import time
# 生成四位随机数字
def generate_target_number():
"""
该函数生成一个四位随机数字,每位数字不重复且不为0
"""
digits = list(range(1, 10)) # 生成1到9的数字列表
random.shuffle(digits) # 打乱数字列表顺序
target_number = ""
for i in range(4):
target_number += str(digits[i]) # 取前四位组成目标数字字符串
return target_number
# 比较猜测数字和目标数字,返回A和B的值
def compare_numbers(target, guess):
"""
此函数接收目标数字和玩家猜测的数字,比较后返回数字和位置都正确的个数A以及数字正确但位置错误的个数B
"""
A = 0
B = 0
target_digits = list(target)
guess_digits = list(guess)
for i in range(4):
if target_digits[i] == guess_digits[i]:
A += 1
target_digits[i] = 'X' # 标记已匹配正确位置的数字,避免重复计算
guess_digits[i] = 'Y'
for digit in guess_digits:
if digit in target_digits:
B += 1
target_digits[target_digits.index(digit)] = 'X' # 标记已匹配的数字,避免重复计算
return A, B
# 主游戏逻辑
def guessing_game():
target_number = generate_target_number()
guess_history = [] # 存储猜测历史记录的列表,每个元素是一个元组(猜测数字, 猜测时间, A, B)
guess_count = 0
start_time = 0
while True:
try:
guess = input("请输入你的四位猜测数字:")
if len(guess)!= 4 or not guess.isdigit(): # 检查输入是否为四位数字
print("请输入四位有效数字!")
continue
guess_count += 1
if guess_count == 1:
start_time = time.time() # 记录第一次猜测开始时间
current_time = time.time()
A, B = compare_numbers(target_number, guess)
guess_history.append((guess, current_time - start_time, A, B)) # 将猜测信息存入历史记录列表
if A == 4:
print(f"恭喜你,猜对了!你一共猜测了{guess_count}次。")
break
else:
print(f"提示:{A}A{B}B")
except:
print("输入有误,请重新输入!")
# 游戏结束后询问是否查看历史记录
view_history = input("是否查看猜测历史记录?(y/n):")
if view_history == 'y':
print("猜测历史记录如下:")
for guess_info in guess_history:
print(f"猜测数字:{guess_info[0]},花费时间:{guess_info[1]:.2f}秒,结果:{guess_info[2]}A{guess_info[3]}B")
total_time = sum([info[1] for info in guess_history]) # 计算总花费时间
print(f"平均每次猜测花费时间:{total_time / guess_count:.2f}秒")
if __name__ == "__main__":
guessing_game()
代码详细讲解
1.数据类型相关部分
generate_target_number 函数中,digits 是一个列表(List),存储了从 1 到 9 的数字,通过 random.shuffle 方法打乱顺序,然后取前四位组成目标数字字符串(String)。
guess_history 是一个列表,其中每个元素是一个元组(Tuple),包含了玩家猜测的数字、猜测花费的时间(数字类型,通过 time.time 函数得到的时间差)、A 的值和 B 的值。这样的数据结构方便存储和管理玩家的猜测历史信息。
在 compare_numbers 函数中,target_digits 和 guess_digits 是列表,将目标数字和猜测数字转换为列表形式,方便逐个比较数字。
2.格式化 F-string 部分
在游戏结束后输出猜测历史记录时,print(f"猜测数字:{guess_info[0]},花费时间:{guess_info[1]:.2f}秒,结果:{guess_info[2]}A{guess_info[3]}B") 运用了 F-string 格式化输出,其中 :.2f 用于格式化浮点数,保留两位小数,使输出的时间信息更加规范美观。
3.range() 函数运用
在 generate_target_number 函数中,for i in range(4): 用于控制循环四次,从打乱后的数字列表中取出四位数字组成目标数字,这里体现了 range 函数用于指定循环次数的作用。
4.自定义函数运用
generate_target_number 函数没有参数,它的功能是生成一个特定规则的四位目标数字并返回。
compare_numbers 函数有两个参数 target 和 guess,分别代表目标数字和玩家猜测的数字,通过内部的逻辑比较计算并返回 A 和 B 的值,体现了自定义函数接收参数并处理返回结果的特点。
5.map 函数和 reduce 函数运用
案例中未直接使用 map 函数,但如果后续要对猜测历史记录中的某些数据进行批量转换操作,比如将所有猜测时间转换为分钟为单位,可以使用 map 函数。例如:list(map(lambda x: x[1] / 60, guess_history)) (这里只是示例,未在实际代码中添加)。
同样未直接使用 reduce 函数,如果要计算所有猜测时间的总和(除了使用 sum 函数的方式),可以使用 reduce 函数。例如:reduce(lambda x, y: x + y[1], guess_history, 0) (这里只是示例,未在实际代码中添加)。
6.控制语法运用
if len(guess)!= 4 or not guess.isdigit(): 使用 if 语句判断玩家输入是否为四位有效数字,如果不满足条件则提示玩家重新输入,保证游戏输入的合法性。
if A == 4: 使用 if 语句判断玩家是否猜对数字,如果猜对则结束游戏循环并输出相关信息。
for guess_info in guess_history: 使用 for 循环遍历猜测历史记录列表,方便输出每条猜测记录的详细信息。
while True: 使用 while 循环让玩家不断进行猜测,直到猜对为止,循环内部通过 try...except 处理异常确保程序稳定运行。
7.异常处理
在 while 循环中的 try...except 结构,try 块内是获取玩家输入猜测数字以及后续相关操作,如果玩家输入非数字或者输入的数字格式不正确等情况,就会抛出异常,被 except 块捕获,然后输出提示信息告知玩家输入有误,让玩家重新输入,这样可以有效避免因用户错误输入导致程序崩溃。
通过以上综合案例的开发讲解,对Python基础的数据类型,控制语句,基础函数应用,异常处理等有了更进一步的理解和认识,为学习Python进阶知识打好基础,建议大家动手码一遍,加深印象。
往期回顾
猜你喜欢
- 2024-12-31 Python中8种Functools使用方法
- 2024-12-31 有效提升Python代码性能的三个层面
- 2024-12-31 Pytorch - 手写Allreduce分布式训练
- 2024-12-31 Python魔法函数(特殊函数)
- 2024-12-31 解开 Python 单行代码的魔力:高效编写代码的基本函数
- 2024-12-31 浅谈Python中骚操作
- 2024-12-31 Python:使用快速简单的 Lambda 表达式改变您的编程风格
- 2024-12-31 Python零基础入门—15个最受欢迎的Python开源框架
- 2024-12-31 用好这几个Python高阶函数!效率翻倍
- 2024-12-31 Python中级篇~函数式编程的概念和原则(匿名函数和高阶函数)
- 01-08将 Excel 表格中每三行合并到一个单元格中,用“、”隔开
- 01-08使用办公软件按表格中从上往下合并成1个TXT文档并添加分隔符号
- 01-08新歌尝鲜 3《分割线》
- 01-08怎么分割视频?这几种分割方法非常简单
- 01-08视频怎么分割?教你简单的三种方法
- 01-08分隔:整理大脑的 5 种方法
- 01-08「深度」凯文-杜兰特的九年雷霆光阴
- 01-08深度丨涅磐重生到“超级3D”球星?他还是无所不能的保罗·乔治
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)