🎯 今日目标

  • 综合运用前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 循环游戏主循环、猜测循环
列表/字典(可以拓展用于历史记录)
函数每个独立功能封装成函数
文件操作保存和读取最高分
异常处理输入校验(非数字处理)
importrandomos 模块
模块化设计一个函数做一件事

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐