Python猜数字游戏完整代码示例
猜数字游戏是学习编程控制流与交互逻辑的经典项目。程序的运行机制由计算机生成一个指定区间(例如 1 到 100)的保密随机整数,随后接收玩家在控制台输入的猜测值,对比两者大小并输出“猜大了”、“猜小了”或“猜中了”的反馈提示,直至玩家命中目标数字退出循环。本文提供该游戏从零开始的基础版、容错强化版以及限制尝试次数的完整代码与工程实现细节。
一、游戏规则与核心执行流程
在编写代码前,需要明确程序在生命周期中处理的各项逻辑任务。一个标准控制台猜数字游戏包含四个基础阶段:
- 秘密数字生成:程序启动时调用内置模块生成随机目标数,并在整个游戏会话期间保持该数值不变。
- 循环输入等待:启动无限循环(
while True),提示玩家输入整数,并通过控制台读取文本。 - 数值比较与反馈:将输入文本转换为数值,与目标数进行三向条件判断(
<、>、==)。 - 终止与结算:当数字相等时打破循环,并输出玩家本轮游戏的总尝试次数。
二、基础版本完整代码与逐行解析
下面是用 Python 实现猜数字游戏的基础完整代码。该版本遵循最简可运行原则,便于初学者理解基本控制语句的应用:
import random
def guess_number_basic():
# 1. 在 [1, 100] 闭区间内随机选取一个目标整数
target_number = random.randint(1, 100)
guess_count = 0
print("========================================")
print(" 欢迎来到 Python 猜数字游戏 ")
print("系统已选定 1 到 100 之间的一个数字,请猜!")
print("========================================")
# 2. 持续循环,直到猜中数字时显式退出
while True:
user_input = input("请输入您猜测的数字:")
guess = int(user_input)
guess_count += 1
# 3. 三向逻辑分支比对
if guess < target_number:
print("太小了,请往大一点猜!\n")
elif guess > target_number:
print("太大了,请往小一点猜!\n")
else:
print(f"恭喜您猜对了!目标数字正是 {target_number}。")
print(f"您总共尝试了 {guess_count} 次。")
break
if __name__ == "__main__":
guess_number_basic()
核心技术要点解析
random.randint(1, 100):Python 的random模块提供的randint(a, b)函数生成闭区间[a, b]内的随机整数,即边界值 1 和 100 均有可能被抽取到。while True无限循环:由于无法预先获知玩家需要多少次才能猜中,因此使用无固定次数的while循环维持游戏进程。break语句:当guess == target_number条件成立时,执行break强制跳出循环,避免程序陷入死循环。int(user_input):input()函数返回的数据类型固定为字符串(str),必须通过int()显式转换为整数后才能参与大小比较运算。
三、容错强化:拦截非数字输入与范围越界
基础版本的代码存在一个显著的脆弱点:若玩家在控制台输入了字母(如 abc)、标点符号或直接敲击回车,执行 int(user_input) 将直接引发 ValueError 异常,导致程序崩溃终止。此外,如果玩家输入了 -5 或 200,虽不会报错,但显然超出了既定范围。
要让程序具备工业级健壮性,必须在处理核心逻辑前加入两道防线:
- 类型转换防护:使用
try...except ValueError语句捕获非整数字符。 - 业务边界防护:使用条件判断过滤不在有效区间的数值。
四、进阶版本完整代码:增加猜测限制与胜负判定
为了使游戏更具趣味性与挑战性,进阶版本增加了最大猜测次数限制。从信息论与二分查找算法可知,在 1 到 100 之间猜一个数字,最坏情况下只需 $\lceil \log_2(100) \rceil = 7$ 次即可必定命中。因此,将最大猜测次数设定为 7 次,可以有效检验玩家的二分搜索策略。
import random
def guess_number_advanced(min_val=1, max_val=100, max_attempts=7):
"""
Python 猜数字游戏进阶版
:param min_val: 目标数字最小值
:param max_val: 目标数字最大值
:param max_attempts: 允许猜测的最大次数
"""
secret_number = random.randint(min_val, max_val)
attempts_used = 0
print("==================================================")
print(f" Python 猜数字挑战赛 (限定 {max_attempts} 次机会) ")
print(f" 范围:{min_val} ~ {max_val} 之间,合理使用二分策略获胜! ")
print("==================================================\n")
# 循环条件:已用次数小于限定次数
while attempts_used < max_attempts:
remaining_attempts = max_attempts - attempts_used
prompt_text = f"[第 {attempts_used + 1} 轮 | 剩余 {remaining_attempts} 次机会] 请输入数字: "
user_input = input(prompt_text).strip()
# 1. 防御性检查:非数字输入拦截
try:
guess = int(user_input)
except ValueError:
print("【输入无效】检测到非整数输入,请输入合法数字!(本次输入不消耗机会)\n")
continue
# 2. 边界检查:越界数值拦截
if guess < min_val or guess > max_val:
print(f"【范围越界】请输入 {min_val} 到 {max_val} 之间的数字!(不消耗机会)\n")
continue
# 输入合法,正式消耗一次猜测机会
attempts_used += 1
# 3. 核心比对分支
if guess < secret_number:
print(f"【偏小】你猜的数字 {guess} 太小了!目标数字更大。\n")
elif guess > secret_number:
print(f"【偏大】你猜的数字 {guess} 太大了!目标数字更小。\n")
else:
print("**************************************************")
print(f"恭喜胜利!您在第 {attempts_used} 轮成功猜中秘密数字:{secret_number}!")
print("**************************************************")
return True
# 超过限制次数仍未猜中
print("--------------------------------------------------")
print("游戏结束!很遗憾,您的尝试次数已全部用尽。")
print(f"本次电脑设定的秘密数字是:{secret_number}")
print("不要气馁,建议下次采用二分查找法(每次猜区间中间值)!")
print("--------------------------------------------------")
return False
if __name__ == "__main__":
guess_number_advanced()
二分查找策略提示:在面对 1 到 100 的区间时,第一轮先猜中间值
50。若提示偏大,则目标必然在 1 ~ 49;第二轮猜 25;若提示偏小,则目标在 26 ~ 49,第三轮猜 37。依此类推,每次都能将候选范围削减一半,7 次以内必定能够锁定正确答案。
示例交互运行输出
以下展示该程序在控制台实际运行的一次完整测试记录(示例数据):
==================================================
Python 猜数字挑战赛 (限定 7 次机会)
范围:1 ~ 100 之间,合理使用二分策略获胜!
==================================================
[第 1 轮 | 剩余 7 次机会] 请输入数字: 50
【偏小】你猜的数字 50 太小了!目标数字更大。
[第 2 轮 | 剩余 6 次机会] 请输入数字: abc
【输入无效】检测到非整数输入,请输入合法数字!(本次输入不消耗机会)
[第 2 轮 | 剩余 6 次机会] 请输入数字: 75
【偏大】你猜的数字 75 太大了!目标数字更小。
[第 3 轮 | 剩余 5 次机会] 请输入数字: 62
【偏小】你猜的数字 62 太小了!目标数字更大。
[第 4 轮 | 剩余 4 次机会] 请输入数字: 68
【偏大】你猜的数字 68 太大了!目标数字更小。
[第 5 轮 | 剩余 3 次机会] 请输入数字: 65
**************************************************
恭喜胜利!您在第 5 轮成功猜中秘密数字:65!
**************************************************
五、工程实现总结与架构全景
通过实现猜数字游戏,开发者可以完整演练 Python 的核心语法知识:
常见问题与注意事项排查表
| 现象 / 疑问 | 背后的原因 | 正确处理规范 |
|---|---|---|
输入非数字导致 ValueError 崩溃 |
直接对未过滤的 input() 执行 int() 强转。 |
使用 try...except ValueError 包裹强转逻辑,捕获异常后 continue。 |
random.randint(1, 100) 是否会包含 100? |
会包含。randint(a, b) 是闭区间操作。 |
若需要半开半闭区间 [a, b),应改用 randrange(a, b)。 |
| 错误输入消耗了有效猜测机会 | 在输入校验前就执行了 attempts += 1。 |
确保计数器自增放在所有前置验证通过之后执行。 |
| 代码复用性与测试性不足 | 脚本代码平铺在文件顶层,无法在其他模块导入。 | 封装成函数并设置参数默认值,配合 if __name__ == '__main__': 入口调用。 |
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









