这节课你要学会

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)

接下来

游戏通关!但如果你想让电脑记住 100 个同学的名字,难道要开 100 个盒子?下一课的列表就是电脑的百宝袋——一个盒子里装一串东西。