综合练习:猜数字小游戏
这是什么:猜数字小游戏 = 一个用 random 随机出题、靠比较大小猜答案的完整小程序,前面各章的知识全用上了。
为什么用:零件都齐了:变量记数据、条件做判断、循环管重复、函数搞封装。零散练过不代表会用,把它们拧成一个真能玩的东西,才算学到位。
如何用:本章给出完整代码,先读懂再敲进去跑起来,然后自己动手改造:换范围、加次数上限。
游戏规则
电脑在 1~100 里随机想一个整数,你每猜一次,它提示"大了"或"小了",猜中为止,最后报告你一共用了几次。
完整代码
新建 guess.py,整段写入后运行:
import random
secret = random.randint(1, 100) # 电脑随机想一个 1~100 的数
count = 0 # 记录猜了几次
def check(guess):
# 比大小:猜大了返回 1,猜小了返回 -1,猜中返回 0
if guess > secret:
return 1
elif guess < secret:
return -1
else:
return 0
print("我想好了一个 1~100 的数,猜猜看!")
while True:
text = input("你猜是几?") # input 返回的永远是字符串
guess = int(text) # 转成整数才能比大小
count += 1
result = check(guess)
if result == 1:
print("大了,往小猜")
elif result == -1:
print("小了,往大猜")
else:
print(f"猜对了!答案是 {secret},你一共猜了 {count} 次")
break # 猜中,跳出循环,游戏结束
示例输入:依次输入 50、25、37(每次输完按回车)
运行效果示例
我想好了一个 1~100 的数,猜猜看!
你猜是几?50
大了,往小猜
你猜是几?25
小了,往大猜
你猜是几?37
猜对了!答案是 37,你一共猜了 3 次
(你运行时谜底是随机的,过程和次数都会不一样。)
逐段解读
| 代码段 | 用到的知识 | 作用 |
|---|---|---|
secret = random.randint(1, 100) |
变量 | 存下谜底;randint 两头都含,1 和 100 都可能被想到 |
def check(guess): ... return ... |
函数 | 把"比大小"封装起来,主循环只看结论不看细节 |
while True: + break |
循环 | 不知道几次能猜中,就一直循环,猜中了才 break 收工 |
input("你猜是几?") |
交互 | 弹出提示并等你输入,返回的永远是字符串 |
guess = int(text) |
类型转换 | 字符串转整数,才能和 secret 比较 |
if / elif / else |
条件 | 根据 check 的结论给玩家反馈 |
count += 1 |
变量 | 每猜一次计一次,最后报战绩 |
记忆口诀
谜底交给 randint,输入必须 int 转型;while True 敢死循环,break 负责收官。
❓ 常见问题
Q1:猜到一半输错成字母,程序直接崩了?
报错最后一行是:
ValueError: invalid literal for int() with base 10: 'abc'
原因:int() 只认"长得像整数"的字符串,喂它 abc 就当场罢工——注意它还把你喂的内容 'abc' 原样亮在报错里,方便对账。
修复:转换前先验货——text.isdigit() 为 True(纯数字)才交给 int(),否则 print("请输入数字呀") 好好提醒。这正是下面动手改第 2 题要你亲手修的。
举一反三:这招叫"先检查再使用"。用户的输入永远不可信——可能手滑、可能捣乱,程序要接得住任何输入,这是编程世界的防身第一课;以后你还会见到更专业的兜底写法(try/except)。
Q2:谜底是随机的,想调试怎么办?
在 secret = ... 下面临时加一行 print("(调试)谜底是", secret),看清楚谜底再玩,哪一步逻辑不对一目了然。查完记得删——这招叫打印调试,新手期最好用:不给程序加探针,你只能盯着一堆代码猜;加了探针,变量在每个关键路口的值全摊在桌面上。进阶玩法是在 check 函数里也加一行,把传入的 guess 和结论 result 一起打出来,比大小逻辑对不对当场现形。
Q3:想让玩家能输入小数(比如猜 3.5)怎么办?
先看一个翻车:
print(int("3.5"))
ValueError: invalid literal for int() with base 10: '3.5'
int() 的规矩比想象严:只认"纯整数长相"的字符串,连小数点都不要。要收小数,改用 float():
print(float("3.5"))
你会看到:
3.5
顺便记个全家福:int() 转整数、float() 转小数、str() 把数字转回字符串——三兄弟都是"类型转换器",哪个类型不对就请哪个。
Q4:while True 听着就是死循环,为什么这个游戏不会停不下来?
while True 确实是"无条件死循环",但这个游戏在猜中分支里写了 break——它就是留给循环的唯一出口。新手要养成一个检查习惯:每写一个 while True,先找找 break 在哪。忘写 break 的症状:程序反复问你"你猜是几?"永远不停,此时 Ctrl + C 救场。while True + break 胜在思路直白:什么时候该结束,就在哪里 break,一目了然;以后你还会学到给 while 换更聪明的循环条件的写法,但"先敢用、再优化"。
🎯 什么时候用它
- 真实程序的骨架:命令行工具、菜单程序、轮询下载进度,拆开看都是"while True + input + if"这套组合拳——你现在写的就是它们的迷你版。
- 猜数字的最优策略就是二分查找:每次猜区间正中(50、25、37……),最多 7 次必中——这是计算机科学里查找算法的入门思想、面试常客,你已经在游戏里亲手体验了。
- 一切"反馈式排查"的原型:程序给反馈(报错/提示),你根据反馈缩小问题范围再出手——这个游戏的玩法,正是你以后排查 bug 的思维模型。
📝 本章小结
- 变量记数据、条件做判断、循环管重复、函数搞封装——四个零件拼出一个真游戏
input()返回的永远是字符串,比大小前先int()转型;用户输入不可信,先检查再使用- 不知道循环几次时,
while True+break是标准打法;每个while True都要有出口 - 报错不是失败,是电脑在精确告诉你哪里没看懂;打印调试是新手期最好用的侦探工具
记忆锚点:这个游戏就是生活里的"你藏我猜"——电脑把答案扣在手里,你每猜一次它给一句"大了/小了"的反馈,你据此缩小包围圈;砍价时试心里价位,走的也是同一套"反馈迭代"。
动手改
- 限制最多猜 7 次,超了宣布"游戏失败"并结束(提示:在循环里判断
count >= 7) - 现在输入字母程序会崩溃(
int("abc")直接报错)——用text.isdigit()先判断是不是纯数字再转换 - 游戏结束后问"再来一局吗?y/n",输入 y 就重新开一局
🎉 Python 基础毕业! 下一站 面向对象,让代码学会"造东西" 🐸