第19集:综合练习-猜数字游戏

本集学习目标

  • 综合运用前面学到的知识:条件语句、循环、输入输出等
  • 学会设计一个完整的游戏程序
  • 掌握程序的基本结构和流程
  • 学会使用random模块生成随机数
  • 学会处理用户输入
  • 学会给出提示和反馈

项目介绍

本集我们将制作一个完整的猜数字游戏,这是一个经典的编程练习项目,能够很好地综合运用前面学到的所有知识。

游戏规则

  1. 系统随机生成一个1-100的数字
  2. 玩家有7次机会猜测
  3. 每次猜测后,系统会提示"太大"或"太小"
  4. 如果猜对了,游戏结束
  5. 如果7次都没猜对,游戏结束并显示正确答案

游戏设计思路

程序结构

开始游戏
  ↓
生成随机数(1-100)
  ↓
初始化次数(7次)
  ↓
开始循环(最多7次)
  ↓
输入猜测
  ↓
判断猜测
  ├─ 猜对了 → 赢了 → 退出循环
  ├─ 太大了 → 提示"太大"
  └─ 太小了 → 提示"太小"
  ↓
次数减1
  ↓
判断是否还有次数
  ├─ 有 → 继续循环
  └─ 没有 → 输了 → 退出循环
  ↓
游戏结束

涉及的知识点

  1. 输入输出input()print()
  2. 条件语句if-elif-else
  3. 循环for循环
  4. random模块:生成随机数
  5. 数据类型转换int()
  6. break语句:提前退出循环

完整代码

版本1:基础版本

import random

# 生成随机数(1-100)
target = random.randint(1, 100)
max_attempts = 7

print("=" * 50)
print("欢迎来到猜数字游戏!")
print("我已经想好了一个1-100的数字")
print(f"你有{max_attempts}次机会来猜!")
print("=" * 50)

# 游戏循环
for attempt in range(max_attempts):
    # 输入猜测
    guess = int(input(f"\n第{attempt + 1}次猜测,请输入你的数字:"))

    # 判断猜测
    if guess == target:
        print(f"\n恭喜你猜对了!数字就是{target}")
        print(f"你用了{attempt + 1}次就猜对了!")
        break
    elif guess < target:
        print("太小了!")
    else:
        print("太大了!")

    # 提示剩余次数
    remaining = max_attempts - attempt - 1
    if remaining > 0:
        print(f"还有{remaining}次机会")
else:
    # 循环正常结束(没有break),说明没猜对
    print(f"\n很遗憾,你没能猜对")
    print(f"正确答案是:{target}")

print("\n游戏结束!")

版本2:增强版本(输入验证)

import random

# 生成随机数(1-100)
target = random.randint(1, 100)
max_attempts = 7

print("=" * 50)
print("欢迎来到猜数字游戏!")
print("我已经想好了一个1-100的数字")
print(f"你有{max_attempts}次机会来猜!")
print("=" * 50)

# 游戏循环
for attempt in range(max_attempts):
    # 输入猜测(带验证)
    while True:
        try:
            guess = int(input(f"\n第{attempt + 1}次猜测,请输入你的数字(1-100):"))
            if 1 <= guess <= 100:
                break
            else:
                print("请输入1-100之间的数字!")
        except ValueError:
            print("请输入有效的数字!")

    # 判断猜测
    if guess == target:
        print(f"\n恭喜你猜对了!数字就是{target}")
        print(f"你用了{attempt + 1}次就猜对了!")
        break
    elif guess < target:
        print("太小了!")
    else:
        print("太大了!")

    # 提示剩余次数
    remaining = max_attempts - attempt - 1
    if remaining > 0:
        print(f"还有{remaining}次机会")
else:
    # 循环正常结束(没有break),说明没猜对
    print(f"\n很遗憾,你没能猜对")
    print(f"正确答案是:{target}")

print("\n游戏结束!")

版本3:高级版本(可重复玩)

import random

def play_game():
    """玩一局游戏"""
    # 生成随机数(1-100)
    target = random.randint(1, 100)
    max_attempts = 7

    print("=" * 50)
    print("欢迎来到猜数字游戏!")
    print("我已经想好了一个1-100的数字")
    print(f"你有{max_attempts}次机会来猜!")
    print("=" * 50)

    # 游戏循环
    for attempt in range(max_attempts):
        # 输入猜测(带验证)
        while True:
            try:
                guess = int(input(f"\n第{attempt + 1}次猜测,请输入你的数字(1-100):"))
                if 1 <= guess <= 100:
                    break
                else:
                    print("请输入1-100之间的数字!")
            except ValueError:
                print("请输入有效的数字!")

        # 判断猜测
        if guess == target:
            print(f"\n恭喜你猜对了!数字就是{target}")
            print(f"你用了{attempt + 1}次就猜对了!")
            return attempt + 1  # 返回使用的次数
        elif guess < target:
            print("太小了!")
        else:
            print("太大了!")

        # 提示剩余次数
        remaining = max_attempts - attempt - 1
        if remaining > 0:
            print(f"还有{remaining}次机会")

    # 没猜对
    print(f"\n很遗憾,你没能猜对")
    print(f"正确答案是:{target}")
    return max_attempts  # 返回使用的次数

def main():
    """主函数"""
    print("========================================")
    print("      猜数字游戏 - 综合练习")
    print("========================================\n")

    # 游戏统计
    total_games = 0
    total_attempts = 0
    wins = 0

    # 主循环
    while True:
        print("\n" + "=" * 50)
        choice = input("要开始游戏吗?(y/n):").lower()

        if choice == 'n':
            print("\n游戏结束!")
            break
        elif choice != 'y':
            print("无效的输入,请输入y或n")
            continue

        # 玩游戏
        attempts = play_game()

        # 更新统计
        total_games += 1
        total_attempts += attempts
        if attempts < 7:  # 用少于7次就猜对了
            wins += 1

        # 显示统计
        print("\n" + "=" * 50)
        print("游戏统计:")
        print(f"总局数:{total_games}")
        print(f"胜利次数:{wins}")
        print(f"总尝试次数:{total_attempts}")
        if total_games > 0:
            avg_attempts = total_attempts / total_games
            print(f"平均尝试次数:{avg_attempts:.1f}")

if __name__ == "__main__":
    main()

代码讲解

1. random模块

import random
target = random.randint(1, 100)  # 生成1-100的随机整数

说明

  • random.randint(a, b):生成a到b之间的随机整数(包括a和b)
  • 每次运行程序,生成的数字都不同

2. for循环和else子句

for attempt in range(max_attempts):
    # 循环体
    if guess == target:
        break  # 猜对了,退出循环
else:
    # 这个else只会在循环正常结束时执行(没有break)
    print("很遗憾,你没能猜对")

说明

  • for循环可以带else子句
  • else子句只会在循环正常结束时执行(即没有break)
  • 如果循环被break中断,else不会执行

3. 输入验证

while True:
    try:
        guess = int(input("请输入数字:"))
        if 1 <= guess <= 100:
            break
        else:
            print("请输入1-100之间的数字!")
    except ValueError:
        print("请输入有效的数字!")

说明

  • 使用while循环确保用户输入有效
  • try-except捕获输入错误(非数字)
  • 检查输入范围(1-100)

4. break语句

if guess == target:
    print("恭喜你猜对了!")
    break  # 退出循环

说明

  • break用于立即退出循环
  • 猜对了就退出,不再继续循环

游戏运行示例

==================================================
欢迎来到猜数字游戏!
我已经想好了一个1-100的数字
你有7次机会来猜!
==================================================

第1次猜测,请输入你的数字(1-100):50
太小了!
还有6次机会

第2次猜测,请输入你的数字(1-100):75
太大了!
还有5次机会

第3次猜测,请输入你的数字(1-100):60
太小了!
还有4次机会

第4次猜测,请输入你的数字(1-100):70
太大了!
还有3次机会

第5次猜测,请输入你的数字(1-100):65
太小了!
还有2次机会

第6次猜测,请输入你的数字(1-100):68
恭喜你猜对了!数字就是68
你用了6次就猜对了!

游戏结束!

扩展功能

扩展1:难度选择

print("选择难度:")
print("1. 简单(1-50,10次机会)")
print("2. 中等(1-100,7次机会)")
print("3. 困难(1-200,5次机会)")

difficulty = input("请选择难度(1/2/3):")

if difficulty == '1':
    max_num = 50
    max_attempts = 10
elif difficulty == '2':
    max_num = 100
    max_attempts = 7
else:
    max_num = 200
    max_attempts = 5

target = random.randint(1, max_num)

扩展2:提示范围

# 记录猜测范围
min_hint = 1
max_hint = 100

# 在每次猜测后更新范围
if guess < target:
    min_hint = max(min_hint, guess + 1)
else:
    max_hint = min(max_hint, guess - 1)

# 提示剩余范围
print(f"提示:数字在{min_hint}-{max_hint}之间")

扩展3:历史记录

# 记录所有猜测
guesses = []

# 每次猜测后记录
guesses.append(guess)

# 显示历史猜测
print(f"你的猜测:{guesses}")

本集小结

  1. 综合运用了条件语句循环输入输出
  2. 使用random模块生成随机数
  3. 使用for-else结构判断循环是否正常结束
  4. 使用try-except进行输入验证
  5. 使用break提前退出循环
  6. 使用函数封装代码,提高可读性
  7. 添加输入验证,增强程序的健壮性
  8. 添加游戏统计,提升用户体验

课后练习

练习1:修改游戏范围

将数字范围改为1-200,尝试次数改为10次。

练习2:添加提示功能

在每次猜测后,提示数字在哪个范围内。

练习3:添加历史记录

记录并显示玩家的所有猜测。

练习4:难度选择

添加简单、中等、困难三个难度级别。

练习5:记分系统

根据猜测次数给出评分:

  • 1-2次:S级
  • 3-4次:A级
  • 5-6次:B级
  • 7次:C级

下集预告

恭喜你完成了第一阶段的20集学习!你已经掌握了Python的基础语法、条件语句、循环等重要知识点。下一阶段我们将学习数据结构:字符串、列表、元组、字典、集合等。

继续加油!

« 上一篇 循环嵌套 下一篇 » 文件操作与异常处理