python-使用turtle海龟制作猜数字小游戏-期末大作业

部署运行你感兴趣的模型镜像

一、引言

本次给中职或者高职的学生做一个期末大作业。相信只要学习了Python基础的同学都会使用到turtle(海龟)这个库,他是Python自带的一个绘图工具库,作为初学者入门必备之良药,海龟真是名副其实、真是上得了台面,又下得了厨房。

二、需求

本次需求是制作一个猜数字小游戏,具体要求是:

1,游戏功能


游戏提供一个由系统随机生成的数字,玩家需要在有限次数内猜中该数字。
提供不同难度选择:
简单:范围为 1~50
中等:范围为 1~100
困难:范围为 1~200

玩家每次猜测后会提示“太大了”或“太小了”,直到猜对或机会用尽。

2,游戏规则

每次游戏最多允许 10 次猜测(max_attempts = 10)。
如果玩家输入无效内容(非整数),程序应捕获异常并提示重新输入。
若玩家在限定次数内猜中数字,则游戏胜利,并记录猜测次数到排行榜。

3、排行榜功能


排行榜(leaderboard)用于保存历史最佳成绩前五名(猜测次数越少排名越高)。
每次玩家成功猜中数字后,其使用的猜测次数将加入排行榜,并按升序排序,仅保留前5条记录。
每轮游戏开始和结束时都会显示当前排行榜信息。

三、纯控制台实现

经典的黑白面板实现猜数字游戏:

import random

# 存储排行榜的成绩(只保存前5名)
leaderboard = []

while True:
    # 打印排行榜
    print("\n=== 排行榜 ===")
    if not leaderboard:
        print("还没有成绩,快来挑战吧!")
    else:
        for i, score in enumerate(leaderboard, start=1):
            print(f"{i}. 猜测次数:{score}")
    print("==============\n")

    # 游戏开始
    print("欢迎来到猜数字游戏!请选择难度:")
    print("1. 简单(1-50)")
    print("2. 中等(1-100)")
    print("3. 困难(1-200)")
    level = input("请输入难度编号(1/2/3):")

    if level == '1':
        low, high = 1, 50
    elif level == '2':
        low, high = 1, 100
    elif level == '3':
        low, high = 1, 200
    else:
        print("无效选择,默认中等(1-100)")
        low, high = 1, 100

    secret_number = random.randint(low, high)
    max_attempts = 10  # 限制猜测次数

    print(f"\n我已经想好一个在 {low} 到 {high} 之间的数字了,你有 {max_attempts} 次机会猜测!")
    attempts = 0

    while attempts < max_attempts:
        try:
            guess = int(input("猜猜看:"))
        except ValueError:
            print("请输入一个有效的数字!")
            continue
        attempts += 1

        if guess > secret_number:
            print("太大了!")
        elif guess < secret_number:
            print("太小了!")
        else:
            print(f"恭喜你!猜对了!答案就是 {secret_number}。")
            print(f"你用了 {attempts} 次猜测。")

            # 更新排行榜
            leaderboard.append(attempts)
            leaderboard = sorted(leaderboard)[:5]  # 保持前5名
            break
    else:
        print(f"很遗憾,次数用完了。正确答案是 {secret_number}。")

    # 再次打印排行榜
    print("\n=== 排行榜 ===")
    if not leaderboard:
        print("还没有成绩,快来挑战吧!")
    else:
        for i, score in enumerate(leaderboard, start=1):
            print(f"{i}. 猜测次数:{score}")
    print("==============\n")

    # 是否继续游戏
    again = input("还要再玩一次吗?(y/n):").lower()
    if again != 'y':
        print("感谢参与!再见!")
        break

运行以上代码:

游戏过程:

没想到,数字正好是50,不好猜啊。

四、升级GUI实现。使用turtle开发界面。

使用到turtle库,另外由于turtle没有提示框,引入了tkinter库做了一下提示框,其余所有代码均为turtle实现。

# 导入必要的库
import turtle
# 导入random库,用于生成随机数
import random
# 导入tkinter库,用于显示提示框和消息框
import tkinter.messagebox as mb

# 定义全局变量
leaderboard = []  # 存储玩家的成绩
game_state = {
    "low": 1,  # 猜测范围的下限
    "high": 100,  # 猜测范围的上限
    "secret": 0,  # 随机生成的神秘数字
    "attempts": 0,  # 玩家已尝试的次数
    "max_attempts": 10,  # 最大尝试次数
    "game_over": False  # 游戏是否结束
}

# 存储难度按钮的引用
difficulty_buttons = []

# 初始化游戏界面
screen = turtle.Screen()  # 创建屏幕对象
screen.bgcolor("#333333")  # 设置背景颜色为深灰色
screen.title("数字捉迷藏小游戏-图形版")  # 设置窗口标题
screen.setup(width=800, height=600)  # 设置窗口大小

# 创建多个turtle对象用于绘制文本、输入框和按钮
text_turtle = turtle.Turtle()  # 用于绘制文本

text_turtle.hideturtle()  # 隐藏turtle
text_turtle.penup()  # 抬起画笔,避免绘制线条
text_turtle.speed(0)  # 设置绘制速度为最快

# 高级烟花效果函数
def enhanced_firework():
    screen.tracer(0)  # 关闭屏幕刷新,提升绘制效率
    particles = []  # 存储粒子对象和速度
    colors = ["#FF5252", "#FFD740", "#40C4FF", "#69F0AE", "#E040FB"]  # 粒子颜色列表

    # 创建粒子
    for _ in range(100):
        p = turtle.Turtle()  # 创建粒子
        p.shape("circle")  # 设置形状为圆形
        p.shapesize(0.5)  # 设置大小
        p.color(random.choice(colors))  # 随机选择颜色
        p.penup()  # 抬起画笔
        p.goto(0, 0)  # 移动到中心
        p.setheading(random.randint(0, 360))  # 随机设置方向
        particles.append((p, random.uniform(1, 5)))  # 存储粒子和速度

    # 更新粒子位置和透明度
    for _ in range(50):
        for p, speed in particles:
            p.forward(speed)  # 移动粒子
            if len(p.color()[0]) == 4:  # 如果颜色包含透明度
                p.color(p.color()[0][0], p.color()[0][1], p.color()[0][2], max(0, p.color()[0][3] - 0.02))  # 降低透明度
            else:
                p.color(p.color()[0][0], p.color()[0][1], p.color()[0][2])  # 保持原有颜色
        screen.update()  # 更新屏幕

    # 隐藏所有粒子
    for p, _ in particles:
        p.hideturtle()
    screen.tracer(1)  # 恢复屏幕刷新

# 绘制按钮函数
def draw_button(x, y, width, height, label, callback):
    button = turtle.Turtle()  # 创建按钮对象
    button.hideturtle()  # 隐藏turtle
    button.penup()  # 抬起画笔

    # 绘制按钮背景
    button.goto(x - width / 2, y - height / 2)  # 移动到左下角
    button.pendown()  # 放下画笔
    button.color("white", "#4CAF50")  # 设置边框和填充颜色
    button.begin_fill()  # 开始填充
    for _ in range(2):
        button.forward(width)  # 绘制矩形
        button.left(90)
        button.forward(height)
        button.left(90)
    button.end_fill()  # 结束填充

    # 添加文字
    button.penup()  # 抬起画笔
    button.goto(x, y - 10)  # 移动到文字位置
    button.write(label, align="center", font=("Microsoft YaHei", 16, "bold"))  # 写入文字

    # 添加点击事件
    screen.onclick(lambda click_x, click_y: callback() if (
            click_x > x - width / 2 and
            click_x < x + width / 2 and
            click_y > y - height / 2 and
            click_y < y + height / 2
    ) else None, add=True)  # 添加add=True参数

    # 清除按钮的方法
    def clear():
        button.clear()
        button.hideturtle()

    return button, clear

# 清除难度按钮的方法
def clear_difficulty_buttons():
    """
    清除界面上的所有难度按钮。
    """
    for button_info in difficulty_buttons:  # 遍历存储的按钮信息
        if isinstance(button_info, tuple) and len(button_info) == 2:  # 确保是元组且长度为2
            button, clear_button = button_info  # 解包元组
            try:
                clear_button()  # 调用清除方法
                print(f"成功清除按钮: {button}")  # 添加调试信息
            except Exception as e:
                print(f"清除按钮失败: {button}, 错误信息: {e}")  # 捕获异常并记录
        else:
            print(f"无效的按钮信息: {button_info}")  # 记录无效数据

# 显示重玩按钮
def show_replay_button(clear_previous=True):
    if clear_previous:
        text_turtle.clear()  # 清除之前的提示信息
        clear_difficulty_buttons()  # 清除难度按钮
    # 再玩一次按钮
    button, clear_button = draw_button(0, -200, 200, 50, "再玩一次", lambda: [clear_button(),init_difficulty_selection()])  # 修改为跳转到难度选择界面并隐藏按钮

# 初始化难度选择界面
def init_difficulty_selection():
    global difficulty_buttons  # 确保使用全局变量
    difficulty_buttons = []  # 清空难度按钮列表

    text_turtle.clear()  # 清除之前的界面

    # 清除之前绑定的事件监听器
    screen.onclick(None)

    text_turtle.goto(0, 200)  # 移动到标题位置
    text_turtle.color("#aaffaa")  # 设置文本颜色
    text_turtle.write("选择难度", align="center", font=("Microsoft YaHei", 30, "bold"))  # 写入标题

    # 调整 update_display 的调用位置,避免与难度选择按钮重叠
    text_turtle.goto(0, 150)  # 移动到范围信息位置
    text_turtle.write(f"范围:{game_state['low']}-{game_state['high']}",  # 写入范围信息
                      align="center", font=("Microsoft YaHei", 20))

    text_turtle.goto(0, 100)  # 移动到剩余次数信息位置
    text_turtle.write(f"剩余次数:{game_state['max_attempts'] - game_state['attempts']}",  # 写入剩余次数信息
                      align="center", font=("Microsoft YaHei", 20))

    # 绘制排行榜
    text_turtle.goto(300, 200)  # 移动到排行榜标题位置
    text_turtle.write("排行榜", align="center", font=("Microsoft YaHei", 20, "underline"))  # 写入排行榜标题
    y_pos = 160  # 初始y坐标
    for i, score in enumerate(leaderboard[:5], 1):  # 遍历前5个成绩
        text_turtle.goto(300, y_pos)  # 移动到成绩位置
        text_turtle.write(f"第{i}名: {score}次", align="center", font=("Microsoft YaHei", 14))  # 写入成绩
        y_pos -= 30  # 更新y坐标

    # 绘制难度按钮,并存储引用
    difficulty_buttons = [
        draw_button(-200, 50, 150, 50, "简单 (1-50)", lambda: set_difficulty(1, 50)),  # 绘制简单难度按钮
        draw_button(0, 50, 150, 50, "中等 (1-100)", lambda: set_difficulty(1, 100)),  # 绘制中等难度按钮
        draw_button(200, 50, 150, 50, "困难 (1-200)", lambda: set_difficulty(1, 200))  # 绘制困难难度按钮
    ]

# 显示提示信息的函数
def show_hint(message):
    mb.showinfo('提示信息',message)

# 显示输入框并处理用户输入
def show_input_box():
    user_input = screen.textinput("猜数字", "请输入一个数字:")  # 获取用户输入
    if user_input is not None:  # 检查用户是否取消输入
        try:
            guess = int(user_input)  # 尝试将输入转换为整数
            check_guess(guess)  # 调用检查函数
        except ValueError:
            text_turtle.goto(0, -50)  # 移动到提示位置
            text_turtle.write("请输入有效的数字!", align="center", font=("Microsoft YaHei", 16, "bold"))  # 提示错误信息

# 初始化游戏逻辑
def start_game():
    game_state["secret"] = random.randint(game_state["low"], game_state["high"])  # 随机生成神秘数字
    game_state["attempts"] = 0  # 重置尝试次数
    game_state["game_over"] = False  # 重置游戏状态
    update_tetx()
    show_input_box()  # 调用输入框

def update_tetx():
    text_turtle.clear()  # 清除之前的界面
    text_turtle.goto(0, 200)  # 移动到标题位置
    text_turtle.write("数字捉迷藏小游戏", align="center", font=("Microsoft YaHei", 30, "bold"))  # 写入标题
    text_turtle.goto(0, 150)  # 移动到范围信息位置
    text_turtle.write(f"范围:{game_state['low']}-{game_state['high']}",  # 写入范围信息
                      align="center", font=("Microsoft YaHei", 20))
    text_turtle.goto(0, 100)  # 移动到剩余次数信息位置
    text_turtle.write(f"剩余次数:{game_state['max_attempts'] - game_state['attempts']}",  # 写入剩余次数信息
                      align="center", font=("Microsoft YaHei", 20))

# 检查用户猜测
def check_guess(guess):
    game_state["attempts"] += 1  # 增加尝试次数

    # 弹出式提示替代原有绘制逻辑
    if guess < game_state["secret"]:
        show_hint("太小了!")
    elif guess > game_state["secret"]:
        show_hint("太大了!")

    if guess == game_state["secret"]:
        show_hint("恭喜,你猜对了!")
        leaderboard.append(game_state["attempts"])  # 将尝试次数添加到排行榜
        leaderboard.sort()  # 对排行榜进行排序
        enhanced_firework()  # 调用烟花效果
        game_state["game_over"] = True  # 设置游戏结束状态
        show_replay_button()  # 显示重玩按钮

    if game_state["attempts"] >= game_state["max_attempts"] and not game_state["game_over"]:
        show_hint("很遗憾,你没有猜对。")
        game_state["game_over"] = True  # 设置游戏结束状态
        show_replay_button()  # 显示重玩按钮

    # 添加重新弹出输入框的逻辑
    if not game_state["game_over"]:
        turtle.ontimer(lambda: show_input_box(), 1000)

    # 更新剩余次数显示
    update_tetx()

def set_difficulty(low, high):
    game_state["low"] = low  # 更新范围下限
    game_state["high"] = high  # 更新范围上限
    game_state["max_attempts"] = 10 if high == 50 else (15 if high == 100 else 20)  # 根据难度设置最大尝试次数
    clear_difficulty_buttons()  # 清除难度按钮
    start_game()  # 调用新函数,初始化游戏逻辑

# 主程序入口
if __name__ == "__main__":
    init_difficulty_selection()  # 初始化难度选择界面
    turtle.done()  # 保持窗口打开,确保程序不会提前退出

代码所有逻辑均已合理实现。界面请看:

 

通过此代码可以完整学习Python基础知识以及turtle画图知识。

是一个不可多得的入门案例。

源代码已公布,不用加vip,也不用关注。拿去抄作业吧。

 

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网时光机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值