第8讲 · 人机猜数字擂台

阶段项目:人机猜数字擂台

1电脑藏好1到20的数字,你有5次机会
2根据大小提示缩小范围,猜中立即获胜
3按项目流程制作,最后试玩并验收

成品预览:第三次猜中

guess_number_preview.py
"""第8讲阶段项目:人机猜数字擂台参考实现。"""

import random


MAX_TURNS = 5


def give_hint(secret, guess):
    if guess < secret:
        return "猜小了"
    if guess > secret:
        return "猜大了"
    return "猜对了"


def play_round(secret):
    history = []
    won = False
    print("猜数字擂台:1到20,最多5次机会。")
    for turn in range(1, MAX_TURNS + 1):
        guess = int(input(f"第{turn}次猜:"))
        history.append(guess)
        hint = give_hint(secret, guess)
        print(hint)
        if hint == "猜对了":
            won = True
            break

    if won:
        print(f"挑战成功!第{turn}次猜中。")
    else:
        print(f"挑战失败!答案是{secret}。")
    print("猜测记录:", history)
    return won


def main():
    secret = random.randint(1, 20)
    play_round(secret)


if __name__ == "__main__":
    play_round(12)
8 → 猜小了;16 → 猜大了
提示帮助玩家缩小范围
12 → 猜对了
第三次命中后不再询问第四次
1电脑的答案暂定为12,玩家依次猜8、16、12
2提示依次是猜小了、猜大了、猜对了
3第三次结束,显示胜利和猜测记录

需求分析:规则、输入与范围

1电脑在1到20之间选一个整数
2玩家最多输入5个猜测,每次得到大小提示
3猜中立即结束;用完机会则公布答案

语法拆解

输入:1到20的整数
课堂版按有效输入演示
输出:提示、输赢、猜测记录
运行后可检查的结果

验收表:先确定四种结果

1固定答案12,首猜12:第一轮获胜
2猜8、16、12:第三轮获胜并立即停止
3连续猜1到5:五轮失败并公布12

语法拆解

12
第1次猜中,只记录[12]
8 / 16 / 12
第3次猜中,不出现第4次
1 / 2 / 3 / 4 / 5
五次都错,公布答案12
8 / 16 / 10 / 11 / 12
第5次猜中仍算胜利

功能拆解:提示、回合与开局

1提示函数只负责比较大小并返回文字
2回合函数负责输入、次数、记录和输赢
3主程序负责选答案并开始一局

语法拆解

give_hint(secret, guess)
比较一次,不负责读取输入
play_round(secret)
组织最多五次的游戏过程
main()
选定答案后调用回合函数

程序设计:答案与猜测的数据流

1secret只选一次,传进play_round
2每次输入guess,加入history列表
3give_hint返回提示,回合决定继续还是结束

语法拆解

secret = random.randint(1, 20)
正式游戏开始前只生成一次
history.append(guess)
按顺序保存每次猜测
hint = give_hint(secret, guess)
用返回值决定游戏路径

V0:先打通游戏骨架

l08_guess_v0.py
def give_hint(secret, guess):
    print("提示模块已接入")

def play_round(secret):
    print("回合模块已接入")

def main():
    secret = 12
    give_hint(secret, 8)
    play_round(secret)
    print("主程序已接入")

main()
1先写三个函数的名字与参数
2用固定答案12连接调用链
3三条占位输出证明各模块已接入

V1:比较大小并返回提示

l08_guess_hints.py
def give_hint(secret, guess):
    if guess < secret:
        return "猜小了"
    if guess > secret:
        return "猜大了"
    return "猜对了"

print(give_hint(12, 8))
print(give_hint(12, 16))
print(give_hint(12, 12))
give_hint(12, 8)
猜小了
give_hint(12, 16)
猜大了
give_hint(12, 12)
猜对了
1guess小于secret,返回“猜小了”
2guess大于secret,返回“猜大了”
3剩下的情况是相等,返回“猜对了”

V2:循环给出五次机会

l08_guess_loop.py
def give_hint(secret, guess):
    if guess < secret:
        return "猜小了"
    if guess > secret:
        return "猜大了"
    return "猜对了"

def play_round(secret):
    print("猜数字擂台:1到20,最多5次机会。")
    for turn in range(1, 6):
        guess = int(input(f"第{turn}次猜:"))
        print(give_hint(secret, guess))

play_round(12)
for turn in range(1, 6)
五轮,右端6不包含
guess = int(input(...))
每轮取得一个整数猜测
1range(1, 6)产生第1到第5次机会
2每轮input后用int转换,再调用提示函数
3本阶段尚未实现猜中停止,先观察这一缺口

V3:猜中停止并记录每次猜测

l08_guess_round.py
def give_hint(secret, guess):
    if guess < secret:
        return "猜小了"
    if guess > secret:
        return "猜大了"
    return "猜对了"

def play_round(secret):
    history = []
    won = False
    print("猜数字擂台:1到20,最多5次机会。")
    for turn in range(1, 6):
        guess = int(input(f"第{turn}次猜:"))
        history.append(guess)
        hint = give_hint(secret, guess)
        print(hint)
        if hint == "猜对了":
            won = True
            break
    if won:
        print(f"挑战成功!第{turn}次猜中。")
    else:
        print(f"挑战失败!答案是{secret}。")
    print("猜测记录:", history)

play_round(12)
if hint == '猜对了': break
胜利后不再进入下一轮
history.append(guess)
列表保留真实猜测轨迹
1history.append(guess)记录输入顺序
2猜对时设置won并用break结束
3循环后输出胜负、答案或猜测记录

正式版:让电脑随机出一个数字

l08_random_secret.py
import random

secret = random.randint(1, 20)
print("电脑随机生成的数字:", secret)
import random
导入Python的随机数工具
random.randint(1, 20)
返回包含1和20的随机整数
1random.randint(1, 20)随机生成本局答案
2每次重新运行,电脑都可能给出不同数字
3正式游戏把secret传入play_round(secret)

项目复盘:从游戏规则到可运行成品

1需求清晰:数字范围、机会次数和胜负条件先写明
2函数分工:give_hint管比较,play_round管回合,main管开局
3小步运行:骨架、提示、循环、停止条件逐步接入
4固定答案验收:先稳定复现结果,再切换到随机模式

语法拆解

需求 → 设计
先定义什么算做对
设计 → 实现
把任务拆成职责清晰的函数
实现 → 验收
每完成一小步就运行核对

项目总结:一局完整的猜数字游戏

1完成的程序可以输入、判断、循环、记录并正确结束
2固定答案验收逻辑,random.randint负责正式随机出题
3项目完成的标准:能玩、能解释、能重现测试结果

语法拆解

give_hint
把一次比较封装成可复用函数
play_round
组织五次机会、记录和胜负
main
生成随机答案并启动一局游戏
课堂 Python 解释器
点击“逐步运行”后,这里会显示结果。
Python:按执行步骤显示结果。