🐸 青蛙编程网
首页 / Python / Python 基础 / 8. 综合练习

综合练习:猜数字小游戏

这是什么:猜数字小游戏 = 一个用 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 都要有出口
  • 报错不是失败,是电脑在精确告诉你哪里没看懂;打印调试是新手期最好用的侦探工具

记忆锚点:这个游戏就是生活里的"你藏我猜"——电脑把答案扣在手里,你每猜一次它给一句"大了/小了"的反馈,你据此缩小包围圈;砍价时试心里价位,走的也是同一套"反馈迭代"。

动手改

  1. 限制最多猜 7 次,超了宣布"游戏失败"并结束(提示:在循环里判断 count >= 7)
  2. 现在输入字母程序会崩溃(int("abc") 直接报错)——用 text.isdigit() 先判断是不是纯数字再转换
  3. 游戏结束后问"再来一局吗?y/n",输入 y 就重新开一局

🎉 Python 基础毕业! 下一站 面向对象,让代码学会"造东西" 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。