猜数字大战
while 循环 + 随机数,做出你的第一个游戏
这节课你要学会
1. 用 while 做"不知道重复几次"的循环;2. 用 random 造随机数(电脑掷骰子);3. 把这两样和学过的一切组合起来,做出一个真正的游戏。今天要玩很多次代码!
电脑也会掷骰子:random
游戏最需要的是什么?随机。每次玩都不一样才好玩。电脑掷骰子的本领藏在 random 模块里。模块就像一个工具箱,先打开工具箱(import),再取工具用:
import random # 打开"随机工具箱"
dice = random.randint(1, 6) # 掷一个 1 到 6 的骰子
print(f"你掷出了 {dice} 点!")
你掷出了 4 点!
randint(1, 6) 的意思是"从 1 到 6 里随机拿一个数"(这次包含 6,跟 range 不一样,别搞混)。多运行几次,每次的点数都可能不同。
动手试一试:骰子 duel
你一个骰子,电脑一个骰子,比大小:
import random
me = random.randint(1, 6)
pc = random.randint(1, 6)
print(f"你掷出 {me} 点,电脑掷出 {pc} 点")
if me > pc:
print("你赢啦!🎉")
elif me < pc:
print("电脑赢了!")
else:
print("平局!")
import + 随机数 + 上一课的 if,骰子游戏就有了。是不是感觉自己已经能做出小游戏了?
while:不知道几遍的循环
for 循环适合重复固定的次数。但"猜数字猜到对为止"——猜几次能对,谁说得准?这时用 while:它的意思是"只要条件成立,就一直做"。
count = 3
while count > 0:
print(f"还有 {count} 秒…")
count = count - 1
print("发射!🚀")
还有 3 秒… 还有 2 秒… 还有 1 秒… 发射!🚀
while 像一个死心眼的守门员:每转一圈都要看一眼条件,成立就再来一圈,不成立才放行。因为 count 每圈减 1,减到 0 时条件不成立了,循环才停。
危险:死循环
如果忘了让 count 减 1,count 永远大于 0,循环永远停不下来——这叫死循环,程序会一直转圈卡住。遇到死循环不用慌:点 Shell 里红色的停止按钮,或者按 Ctrl + C,就能强制停下来。
现在,做游戏!
万事俱备。我们来一步步搭出完整的猜数字大战:电脑随机想一个 1~100 的数,你来猜,它提示大了还是小了,看几次能猜中。
搭建计划(程序员管这叫"分解问题")
第 1 步:电脑随机想一个数,你猜一次,直接告诉答案。
第 2 步:猜错告诉你是大了还是小了。
第 3 步:套上 while,猜到对为止。
第 4 步:记次数,猜中时炫耀战绩。
第 1 步:先能猜一次
import random
answer = random.randint(1, 100)
guess = int(input("我心里想了一个 1~100 的数,你猜:"))
print(f"答案是 {answer},你猜的是 {guess}")
跑起来先玩玩——注意 answer 和 guess 是两个不同的盒子,一个是电脑想的,一个是你说的。
第 2 步:加上提示
if guess == answer:
print("猜中了!")
elif guess > answer:
print("大了,再猜!")
else:
print("小了,再猜!")
第 3 步和第 4 步:套上 while,记上次数
最后把三块拼起来。关键问题:while 的条件是什么?——"还没猜中就继续"。所以要准备一个"猜中了吗"的开关:
import random
answer = random.randint(1, 100)
count = 0 # 猜的次数
win = False # 猜中了吗?一开始没有
print("===== 猜数字大战 =====")
print("我心里想了一个 1~100 的数!")
while win == False:
guess = int(input("你猜:"))
count = count + 1
if guess == answer:
win = True # 开关打开,循环下一圈就停
print(f"猜中了!答案就是 {answer}!")
elif guess > answer:
print("大了!往小猜 👇")
else:
print("小了!往大猜 👆")
print(f"你一共猜了 {count} 次。")
if count <= 7:
print("7 次以内必中,你是天才!🌟")
else:
print("下次试试二分法:每次猜中间那个数。")
===== 猜数字大战 ===== 我心里想了一个 1~100 的数! 你猜:50 小了!往大猜 👆 你猜:75 大了!往小猜 👇 你猜:62 大了!往小猜 👇 你猜:56 猜中了!答案就是 56! 你一共猜了 4 次。 7 次以内必中,你是天才!🌟
这就是一个完整的、能玩的游戏。给它取你的名字,展示给家人玩一局吧。你从第一课的两行代码,走到了今天的 20 行游戏,只用了六课!
这场游戏里全是老朋友
随机数 random(今天学的)、input 和 int(第三课)、while(今天学的)、True 和 False(第四课)、if/elif/else(第四课)、f 字符串(第二课)、自己给自己加的 count(第五课)。没有新知识,全是组合。编程就是这样:零件不多,组合无穷。
练习:改造你的游戏
基础任务:改范围。把 1~100 改成 1~10,难度立刻下降,让家里更小的孩子也能玩。
进阶任务:限时挑战。加一个变量 limit = 7,把"最多能猜 7 次"做进游戏里:超过 7 次就宣布"游戏结束,答案是某某"。(提示:while 的条件可以写成 win == False and count < limit)
隐藏挑战:剪刀石头布。做一个三局两胜的剪刀石头布:电脑用 random.randint(1, 3) 出招,1 剪刀、2 石头、3 布,你和它对三局,最后宣布总比分。(提示:会用到 if 套 if)