一、引言
本次给中职或者高职的学生做一个期末大作业。相信只要学习了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,也不用关注。拿去抄作业吧。

2364

被折叠的 条评论
为什么被折叠?



