第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
- 生成随机答案并启动一局游戏
1 / 13