Python:第13天:小实战 —— 猜数字游戏(综合运用)
·
🎯 今日目标
-
综合运用前12天学过的所有知识点
-
完成一个完整的、可运行的猜数字游戏
-
学会项目结构设计(函数拆分)
-
体验“从需求到代码”的完整开发流程
-
增加游戏难度、历史记录、排行榜等进阶功能
🎮 一、项目需求分析
我们来设计一个完整的猜数字游戏,包含以下功能:
| 功能 | 说明 |
|---|---|
| 随机生成数字 | 每轮游戏生成一个1-100之间的随机整数 |
| 用户猜测 | 用户输入数字,程序给出“大了/小了/猜对了”的提示 |
| 记录猜测次数 | 统计用户猜对用了多少次 |
| 多轮游戏 | 猜完后询问是否继续玩下一轮 |
| 最高分记录 | 记录历史最少猜测次数,保存在文件中 |
| 输入校验 | 用户输入非数字或超出范围时给出友好提示 |
| 难度选择 | 支持简单(1-50)、普通(1-100)、困难(1-200)三种难度 |
🧱 二、代码结构设计
我们把代码拆分成几个函数,每个函数负责一个独立的功能:
text
guess_game.py ├── get_difficulty() # 获取难度选择 ├── get_random_number() # 根据难度生成随机数 ├── get_user_guess() # 获取用户输入(带校验) ├── play_round() # 玩一轮游戏 ├── load_high_score() # 加载历史最高分 ├── save_high_score() # 保存最高分 └── main() # 主程序(游戏循环)
💡 这种“一个函数做一件事”的设计原则叫 单一职责原则,让代码更清晰、更易维护。
📝 三、逐步编写代码
3.1 导入需要的模块
python
import random import os
-
random:生成随机数 -
os:检查文件是否存在
3.2 获取难度选择
python
def get_difficulty():
"""
让用户选择难度,返回对应的数字范围
返回:
tuple: (最低值, 最高值)
"""
print("\n" + "=" * 40)
print(" 选择难度")
print("=" * 40)
print("1. 简单(1-50)")
print("2. 普通(1-100)")
print("3. 困难(1-200)")
while True:
choice = input("请输入数字选择难度(1-3): ")
if choice == "1":
return 1, 50
elif choice == "2":
return 1, 100
elif choice == "3":
return 1, 200
else:
print("❌ 无效选择,请输入 1、2 或 3")
3.3 生成随机数
python
def get_random_number(min_num, max_num):
"""
在指定范围内生成随机整数
参数:
min_num: 最小值
max_num: 最大值
返回:
int: 随机数
"""
return random.randint(min_num, max_num)
3.4 获取用户猜测(带校验)
python
def get_user_guess(min_num, max_num):
"""
获取用户输入的猜测数字,带输入校验
参数:
min_num: 最小值(用于提示和校验)
max_num: 最大值(用于提示和校验)
返回:
int: 用户猜测的数字
"""
while True:
try:
guess = input(f"请输入你的猜测({min_num}-{max_num}): ")
guess_num = int(guess)
if guess_num < min_num or guess_num > max_num:
print(f"❌ 数字必须在 {min_num}-{max_num} 之间,请重新输入")
continue
return guess_num
except ValueError:
print("❌ 请输入有效的整数")
3.5 玩一轮游戏
python
def play_round(min_num, max_num):
"""
玩一轮猜数字游戏
参数:
min_num: 最小值
max_num: 最大值
返回:
int: 本轮猜测次数
"""
secret = random.randint(min_num, max_num)
attempts = 0
max_attempts = 10 # 最多猜测次数
print("\n" + "=" * 40)
print(f" 猜数字游戏({min_num}-{max_num})")
print("=" * 40)
print(f"你有 {max_attempts} 次机会,猜一个 {min_num}-{max_num} 之间的数字")
while attempts < max_attempts:
attempts += 1
remaining = max_attempts - attempts + 1
print(f"\n第 {attempts} 次猜测(剩余 {remaining} 次)")
guess = get_user_guess(min_num, max_num)
if guess < secret:
print("📈 太小了,再大一点")
elif guess > secret:
print("📉 太大了,再小一点")
else:
print(f"🎉 恭喜!你用了 {attempts} 次猜对了!答案就是 {secret}")
return attempts
print(f"💔 很遗憾,{max_attempts} 次机会已用完,正确答案是 {secret}")
return max_attempts + 1 # 返回最大次数+1表示失败
3.6 加载历史最高分
python
HIGH_SCORE_FILE = "high_score.txt"
def load_high_score():
"""
从文件加载历史最高分(最少猜测次数)
返回:
int: 历史最高分,如果没有记录则返回 None
"""
if not os.path.exists(HIGH_SCORE_FILE):
return None
try:
with open(HIGH_SCORE_FILE, "r", encoding="utf-8") as f:
data = f.read().strip()
if data:
return int(data)
except (ValueError, IOError):
pass
return None
3.7 保存最高分
python
def save_high_score(score):
"""
保存最高分到文件
参数:
score: 当前最高分
"""
try:
with open(HIGH_SCORE_FILE, "w", encoding="utf-8") as f:
f.write(str(score))
print(f"🏆 新的最高分记录已保存: {score} 次")
except IOError:
print("⚠️ 保存最高分时出错")
3.8 主程序
python
def main():
"""
游戏主程序
"""
print("=" * 40)
print(" 🎮 猜数字游戏")
print("=" * 40)
print("规则:我随机想一个数字,你来猜!")
# 加载历史最高分
high_score = load_high_score()
if high_score is not None:
print(f"🏆 当前最高分(最少猜测次数): {high_score} 次")
else:
print("📝 暂无历史记录,等你来创造!")
# 游戏主循环
total_games = 0
total_attempts = 0
while True:
# 1. 选择难度
min_num, max_num = get_difficulty()
# 2. 玩一轮
attempts = play_round(min_num, max_num)
# 3. 统计
total_games += 1
if attempts <= 10: # 只统计成功的游戏
total_attempts += attempts
# 4. 更新最高分
if attempts <= 10 and (high_score is None or attempts < high_score):
high_score = attempts
save_high_score(high_score)
# 5. 显示统计信息
print("\n" + "=" * 40)
print(" 本轮统计")
print("=" * 40)
print(f"本轮猜测次数: {attempts if attempts <= 10 else '失败'}")
print(f"总游戏场次: {total_games}")
if total_games > 0:
avg = total_attempts / total_games
print(f"平均猜测次数: {avg:.1f}")
print(f"最高分记录: {high_score if high_score is not None else '无'}")
# 6. 是否继续
again = input("\n再来一局?(y/n): ").lower()
if again != 'y' and again != 'yes':
print("\n👋 感谢游玩,再见!")
break
print("\n" + "=" * 40)
print(" 新的一局!")
print("=" * 40)
3.9 程序入口
python
if __name__ == "__main__":
main()
💡
if __name__ == "__main__":的作用是:当这个文件被直接运行时,执行main();当它被作为模块导入时,不自动执行。这是Python的常见写法。
📋 四、完整代码
以下是完整的 guess_game.py 代码:
python
"""
第13天实战项目:猜数字游戏
综合运用:变量、条件判断、循环、函数、文件操作、异常处理、随机数
"""
import random
import os
HIGH_SCORE_FILE = "high_score.txt"
def get_difficulty():
"""
让用户选择难度,返回对应的数字范围
返回:
tuple: (最低值, 最高值)
"""
print("\n" + "=" * 40)
print(" 选择难度")
print("=" * 40)
print("1. 简单(1-50)")
print("2. 普通(1-100)")
print("3. 困难(1-200)")
while True:
choice = input("请输入数字选择难度(1-3): ")
if choice == "1":
return 1, 50
elif choice == "2":
return 1, 100
elif choice == "3":
return 1, 200
else:
print("❌ 无效选择,请输入 1、2 或 3")
def get_user_guess(min_num, max_num):
"""
获取用户输入的猜测数字,带输入校验
参数:
min_num: 最小值(用于提示和校验)
max_num: 最大值(用于提示和校验)
返回:
int: 用户猜测的数字
"""
while True:
try:
guess = input(f"请输入你的猜测({min_num}-{max_num}): ")
guess_num = int(guess)
if guess_num < min_num or guess_num > max_num:
print(f"❌ 数字必须在 {min_num}-{max_num} 之间,请重新输入")
continue
return guess_num
except ValueError:
print("❌ 请输入有效的整数")
def play_round(min_num, max_num):
"""
玩一轮猜数字游戏
参数:
min_num: 最小值
max_num: 最大值
返回:
int: 本轮猜测次数(如果失败返回 max_attempts + 1)
"""
secret = random.randint(min_num, max_num)
attempts = 0
max_attempts = 10
print("\n" + "=" * 40)
print(f" 猜数字游戏({min_num}-{max_num})")
print("=" * 40)
print(f"你有 {max_attempts} 次机会,猜一个 {min_num}-{max_num} 之间的数字")
while attempts < max_attempts:
attempts += 1
remaining = max_attempts - attempts + 1
print(f"\n第 {attempts} 次猜测(剩余 {remaining} 次)")
guess = get_user_guess(min_num, max_num)
if guess < secret:
print("📈 太小了,再大一点")
elif guess > secret:
print("📉 太大了,再小一点")
else:
print(f"🎉 恭喜!你用了 {attempts} 次猜对了!答案就是 {secret}")
return attempts
print(f"💔 很遗憾,{max_attempts} 次机会已用完,正确答案是 {secret}")
return max_attempts + 1
def load_high_score():
"""
从文件加载历史最高分(最少猜测次数)
返回:
int: 历史最高分,如果没有记录则返回 None
"""
if not os.path.exists(HIGH_SCORE_FILE):
return None
try:
with open(HIGH_SCORE_FILE, "r", encoding="utf-8") as f:
data = f.read().strip()
if data:
return int(data)
except (ValueError, IOError):
pass
return None
def save_high_score(score):
"""
保存最高分到文件
参数:
score: 当前最高分
"""
try:
with open(HIGH_SCORE_FILE, "w", encoding="utf-8") as f:
f.write(str(score))
print(f"🏆 新的最高分记录已保存: {score} 次")
except IOError:
print("⚠️ 保存最高分时出错")
def main():
"""
游戏主程序
"""
print("=" * 40)
print(" 🎮 猜数字游戏")
print("=" * 40)
print("规则:我随机想一个数字,你来猜!")
# 加载历史最高分
high_score = load_high_score()
if high_score is not None:
print(f"🏆 当前最高分(最少猜测次数): {high_score} 次")
else:
print("📝 暂无历史记录,等你来创造!")
# 游戏主循环
total_games = 0
total_attempts = 0
while True:
# 1. 选择难度
min_num, max_num = get_difficulty()
# 2. 玩一轮
attempts = play_round(min_num, max_num)
# 3. 统计
total_games += 1
if attempts <= 10:
total_attempts += attempts
# 4. 更新最高分
if attempts <= 10 and (high_score is None or attempts < high_score):
high_score = attempts
save_high_score(high_score)
# 5. 显示统计信息
print("\n" + "=" * 40)
print(" 本轮统计")
print("=" * 40)
print(f"本轮猜测次数: {attempts if attempts <= 10 else '失败'}")
print(f"总游戏场次: {total_games}")
if total_games > 0 and total_attempts > 0:
avg = total_attempts / total_games
print(f"平均猜测次数: {avg:.1f}")
print(f"最高分记录: {high_score if high_score is not None else '无'}")
# 6. 是否继续
again = input("\n再来一局?(y/n): ").lower()
if again != 'y' and again != 'yes':
print("\n👋 感谢游玩,再见!")
break
print("\n" + "=" * 40)
print(" 新的一局!")
print("=" * 40)
if __name__ == "__main__":
main()
🎮 五、运行结果演示
启动游戏:
text
========================================
🎮 猜数字游戏
========================================
规则:我随机想一个数字,你来猜!
📝 暂无历史记录,等你来创造!
========================================
选择难度
========================================
1. 简单(1-50)
2. 普通(1-100)
3. 困难(1-200)
请输入数字选择难度(1-3): 2
游戏中:
text
========================================
猜数字游戏(1-100)
========================================
你有 10 次机会,猜一个 1-100 之间的数字
第 1 次猜测(剩余 10 次)
请输入你的猜测(1-100): 50
📈 太小了,再大一点
第 2 次猜测(剩余 9 次)
请输入你的猜测(1-100): 75
📉 太大了,再小一点
第 3 次猜测(剩余 8 次)
请输入你的猜测(1-100): 62
📈 太小了,再大一点
第 4 次猜测(剩余 7 次)
请输入你的猜测(1-100): 68
🎉 恭喜!你用了 4 次猜对了!答案就是 68
游戏结束:
text
========================================
本轮统计
========================================
本轮猜测次数: 4
总游戏场次: 1
平均猜测次数: 4.0
最高分记录: 4
🏆 新的最高分记录已保存: 4 次
再来一局?(y/n): n
👋 感谢游玩,再见!
🎯 今日总结
今天你通过一个完整的项目 —— 猜数字游戏,综合运用了:
| 知识点 | 用在什么地方 |
|---|---|
| 变量和数据类型 | 存储随机数、猜测次数、统计数据 |
if-elif-else | 判断猜大了/小了/猜对了 |
for/while 循环 | 游戏主循环、猜测循环 |
| 列表/字典 | (可以拓展用于历史记录) |
| 函数 | 每个独立功能封装成函数 |
| 文件操作 | 保存和读取最高分 |
| 异常处理 | 输入校验(非数字处理) |
import | random、os 模块 |
| 模块化设计 | 一个函数做一件事 |
更多推荐


所有评论(0)