科创科普:用 Python 写「猜数字」小游戏——随机数、条件判断与循环的第一次合体
一、一个你肯定玩过的游戏
「我心里想了一个 1 到 100 之间的数,你来猜。猜大了我告诉你大了,猜小了我说小了,直到你猜中为止。」
这个游戏看起来简单,但它几乎用到了编程入门的全部核心零件:让电脑「心里想一个数」要用随机数,你输入答案要用输入语句,判断大了小了要用条件判断,反复猜要用循环,猜中后结束要用跳出循环。换句话说,把「猜数字」写出来,等于把编程基础课最重要的五块积木拼在了一起。这篇文章就带你从零把它写出来,并一步步改进成真正的游戏。
二、先把游戏拆成四步
写程序之前先别急着敲代码,用中文把流程写清楚:
- 电脑随机生成一个 1 到 100 的整数,存进变量 secret。
- 询问玩家猜的数是几,把玩家的输入存进变量 guess。
- 比较:如果 guess 比 secret 大,提示「大了」;如果小,提示「小了」;如果相等,提示「猜中了」并结束。
- 只要没猜中,就回到第 2 步继续问。
这四句话翻译成代码,就是下面全部的内容。养成「先用人话写流程,再翻译成代码」的习惯,比对着屏幕发呆有效得多。
三、知识准备一:让电脑随机想一个数
Python 自带了一个叫 random 的工具箱,用它之前要先「申请使用」:
import random secret = random.randint(1, 100)
randint(1, 100) 的意思是「在 1 和 100 之间随机取一个整数,两边都能取到」。每运行一次程序,这个数都不一样——这就是电脑「心里想的数」。
一个小实验:连续 print 五次 randint(1, 6),你就得到了掷五次骰子的结果。随机数在游戏里的用途极广:掷骰子、抽卡、掉落道具、洗牌,都靠它。
四、知识准备二:让玩家输入数字
guess = input("请输入你猜的数字:")
input() 会弹出提示语并等玩家打字。这里有一个新手最容易踩的坑:input() 读回来的永远是文字,不是数字。玩家输入 50,电脑拿到的是字符串 "50",而不是整数 50。字符串不能和数字比大小,会直接报错。
所以要紧跟一句类型转换:
guess = int(guess)
int() 把文字 "50" 变成真正的整数 50。这两句通常合成一句写:
guess = int(input("请输入你猜的数字:"))
如果玩家手滑输入了「abc」,int() 会报错退出。想让程序更结实,可以用后面练习里的 try 方法处理。
五、知识准备三:判断与循环
判断用 if / elif / else,从上往下依次检查条件:
if guess > secret: print("大了") elif guess < secret: print("小了") else: print("猜中了")
循环用 while。while True 表示「一直重复,直到我主动喊停」,喊停用 break:
while True: ... if guess == secret: break
为什么要用 while True 而不是 while guess != secret?因为后者需要在循环外先给 guess 一个初始值,还要小心「第一次判断时 guess 还没定义」的问题。while True + break 更适合初学者,思路也更贴合「一直猜,猜中就走」的人话。
六、完整代码(可以直接复制运行)
import random
secret = random.randint(1, 100) count = 0 # 记录猜了几次
print("我心里想了一个 1 到 100 的整数,你来猜猜看!")
while True: guess = int(input("请输入你猜的数字:")) count = count + 1
if guess > secret:
print("大了,再小一点~")
elif guess < secret:
print("小了,再大一点~")
else:
print("猜中啦!你一共用了 %d 次。" % count)
break
一行行读一遍:随机数 → 计数器归零 → 循环开始 → 读输入并转成整数 → 计数加一 → 三分支判断 → 猜中就报成绩并 break。这就是一个能玩的游戏了。
七、改造案例:让游戏更好玩
案例一:限制次数。只给 7 次机会,7 次还猜不中就算失败。1 到 100 的数字,每次猜中间值最多 7 次一定能命中(因为 2 的 7 次方是 128),这也是「二分法」的思想。改法是在循环里加一句:
if count >= 7: print("机会用完啦,答案其实是 %d。" % secret) break
案例二:缩小范围提示。把「大了」改成「大了,答案在 1 到 50 之间」。做法是维护两个变量 low = 1、high = 100:猜小了就 low = guess + 1,猜大了就 high = guess - 1,提示时打印 low 和 high。改进之后你会发现,玩家几乎是在被程序「教着」用二分法——这就是交互设计的威力。
案例三:可以玩很多轮。把整个游戏放进一个外层循环,每局结束后问「还要再来一局吗?输入 y 继续」,输入 y 就换一个新的随机数重开。这时要注意把 count 归零、把 low 和 high 重置,否则上一局的数据会串到下一局。
案例四:输入保护。玩家输入的不是数字时程序不该崩溃:
try: guess = int(input("请输入数字:")) except ValueError: print("要输入整数哦,请再试一次") continue
continue 的意思是「本轮到此为止,直接进入下一轮循环」。try / except 则是「尝试执行,出错就跳到这里处理」,是程序变得结实的关键写法。
八、常见错误对照表
| 报错或现象 | 原因 | 改法 |
|---|---|---|
| TypeError: '>' not supported between 'str' and 'int' | 忘了用 int() 转换输入 | guess = int(input(...)) |
| 程序一直重复提示,永不结束 | 忘了 break,或 break 写错缩进层级 | 把 break 放在 else 分支内、与 print 同级 |
| NameError: name 'secret' is not defined | 拼写不一致,secret 写成了 seceret | 统一变量名,大小写也要一致 |
| 每次都提示「大了」 | 输入行写在循环外面,只读了一次 | 把 input 放进 while 内部 |
| 猜中后分数不对 | count 忘了在开局归零 | 在循环前写 count = 0 |
九、小练习
练习 1:把范围从 1 到 100 改成 1 到 1000,想想最多几次一定能猜中。(提示:算 2 的几次方超过 1000。)
练习 2:不写代码,先用人话写出「10 次之内猜中得 100 分,超过 10 次得 50 分」的评分规则,再用 if / elif 翻译出来。
练习 3:用 random 改造一个「剪刀石头布」小游戏:电脑随机出 0、1、2 分别代表石头剪刀布,玩家输入 0、1、2,比较后输出胜负。
参考答案: 练习 1:2 的 10 次方是 1024,所以最多 10 次一定猜中。 练习 2:if count <= 10: print("得 100 分") else: print("得 50 分")。 练习 3:核心代码如下—— import random n = random.randint(0, 2) m = int(input("0 石头 1 剪刀 2 布:")) if n == m: print("平局") elif (n - m) % 3 == 1: print("你输了") else: print("你赢了") 原理:用 (n - m) % 3 的余数判断胜负关系,比写九条 if 简洁得多。
十、小结
猜数字这个游戏的价值不在于好玩,而在于它把随机数、输入、类型转换、条件判断、循环和 break 六件事串成了一条完整的链。试着合上文章,只凭记忆把代码敲一遍,再对照上面的完整代码找差异——那些被你漏掉的细节,恰恰就是编程能力真正增长的地方。