这是一个Python程序,内容实现了一只小恐龙吃数字。
简介:由程序创建一个独立窗口,白色背景。程序随机产生0~9中的数字,并从窗口顶端匀速掉落。玩家通过键盘控制一只小恐龙,在屏幕上移动并吃掉从顶部随机掉落的数字。每吃掉一个数字,分数就会增加相应的数值。分数标签会显示在窗口的右上方。
下面,先上代码:
import tkinter as tk
from tkinter import PhotoImage
from PIL import Image, ImageTk
import random
# 创建主窗口
root = tk.Tk()
root.title("小恐龙吃数字")
# 设置窗口大小(可以根据需要调整)
window_width = 800
window_height = 600
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
position_top = int(screen_height / 2 - window_height / 2)
position_right = int(screen_width / 2 - window_width / 2)
root.geometry(f'{window_width}x{window_height}+{position_right}+{position_top}')
# 设置窗口背景颜色为白色
root.configure(bg='white')
# 加载小恐龙图片(不调整大小)
dino_image_path = r"C:\Users\yourname\Desktop\小恐龙\dinosaurs.png" # 确保图片文件与脚本在同一目录下,或者使用绝对路径
# 加载图片时给一个异常处理
try:
dino_image = Image.open(dino_image_path)
except FileNotFoundError:
print(f"错误,图片文件 {dino_image_path} 未找到!")
exit()
# dino_image = Image.open(dino_image_path)
dino_photo = ImageTk.PhotoImage(dino_image)
# 获取小恐龙的原始尺寸
dino_width, dino_height = dino_image.size
# 创建标签用于显示小恐龙,并将其放置在窗口的中下部
dino_label = tk.Label(root, image=dino_photo, bg='white') # 设置标签背景为白色以避免边缘显示
# 初始位置(中下部)
dino_x = (window_width - dino_width) // 2 # 水平居中
dino_y = window_height - dino_height # 放置在窗口底部
dino_label.place(x=dino_x, y=dino_y)
# 定义移动步长
move_step = 5 # 每次移动的像素数
# 键盘事件处理函数
def move_dino(event):
global dino_x, dino_y
if event.char == 'w': # 上移
dino_y -= move_step
elif event.char == 'a': # 左移
dino_x -= move_step
elif event.char == 's': # 下移
dino_y += move_step
elif event.char == 'd': # 右移
dino_x += move_step
# 限制小恐龙在窗口范围内
dino_x = max(0, min(dino_x, window_width - dino_width)) # 限制水平范围
dino_y = max(0, min(dino_y, window_height - dino_height)) # 限制垂直范围
# 更新小恐龙位置
dino_label.place(x=dino_x, y=dino_y)
# 绑定键盘事件
root.bind('<Key>', move_dino)
# 数字掉落相关逻辑
numbers = [] # 存储当前正在掉落的数字
score = 0 # 初始分数
# 创建分数显示标签
score_label = tk.Label(root, text=f"分数: {score}", font=("Arial", 20), bg='white')
score_label.place(x=window_width - 150, y=20) # 将分数显示在窗口右上角
# 更新分数显示
def update_score(value):
global score
score += value # 增加分数
score_label.config(text=f"分数: {score}") # 更新分数显示
# 生成随机数字并开始掉落
def generate_number():
# 随机生成一个 0~9 的数字
number = random.randint(0, 9)
# 创建标签显示数字
number_label = tk.Label(root, text=str(number), font=("Arial", 20), bg='white')
# 随机生成数字的初始 x 坐标(水平位置)
number_x = random.randint(0, window_width - 30) # 30 是数字标签的估计宽度
number_y = 0 # 从窗口顶部开始掉落
number_label.place(x=number_x, y=number_y)
# 将数字标签和其坐标存储到列表中
numbers.append({"label": number_label, "x": number_x, "y": number_y, "value": number})
# 每隔随机时间(不超过 1 秒)生成下一个数字
root.after(random.randint(600, 3000), generate_number)
# 数字掉落动画
def drop_numbers():
for number in numbers:
number["y"] += 2 # 每次掉落 2 个像素(速度稍慢)
number["label"].place(x=number["x"], y=number["y"])
# 碰撞检测:小恐龙与数字的碰撞
if (dino_x < number["x"] < dino_x + dino_width and
dino_y < number["y"] < dino_y + dino_height):
number["label"].destroy() # 数字消失
numbers.remove(number) # 从列表中移除
update_score(number["value"]) # 将该数字的值加到分数中
# 每隔 20 毫秒更新一次数字位置
root.after(20, drop_numbers)
# 开始生成数字
generate_number()
# 开始数字掉落动画
drop_numbers()
# 运行主循环
root.mainloop()
下面是运行结果:
首先,想成功运行这个程序,你要先把程序中加载小恐龙图片的地址修改成你自己的地址:
# 加载小恐龙图片(不调整大小)
dino_image_path = r"C:\Users\yourname\Desktop\小恐龙\dinosaurs.png" # 确保图片文件与脚本在同一目录下,或者使用绝对路径
我的图片是36*36像素的,程序中加载图片时没有调整图片大小,因此你的图片不宜过大,否则就会像下面这样(太大了,没法玩了):
如果你想找小恐龙的图片,你可以登录阿里巴巴矢量图标库,那里有许多免费的小图标,下载时可以自己调整图片颜色、格式、大小,特别方便。
搞完地址后,运行此程序。在这个程序中,你能够通过键盘控制小恐龙的运动:
' w '键向上移动;
' a '键向左移动;
' s '键向下移动;
' d '键向右移动。
在程序中每次移动步长为5像素(可以自行修改,但我觉得5比较合适):
# 定义移动步长
move_step = 5 # 每次移动的像素数
下面是程序的简单分析:
程序加载图片时,为防止地址错误导致程序崩溃,我加入了以下代码:
# 加载图片时给一个异常处理
try:
dino_image = Image.open(dino_image_path)
except FileNotFoundError:
print(f"错误,图片文件 {dino_image_path} 未找到!")
exit()
# dino_image = Image.open(dino_image_path)
此外,为了防止小恐龙移出窗口,给小恐龙一个限制(小恐龙只能在窗口范围内移动):
# 限制小恐龙在窗口范围内
dino_x = max(0, min(dino_x, window_width - dino_width)) # 限制水平范围
dino_y = max(0, min(dino_y, window_height - dino_height)) # 限制垂直范围
在窗口右上角有一个计分标签,font中的 'Arial' 是字体名称,20是字体大小;你也可以修改score_label.place()中 x 和 y 的值来改变计分标签的位置。
# 创建分数显示标签
score_label = tk.Label(root, text=f"分数: {score}", font=("Arial", 20), bg='white')
score_label.place(x=window_width - 150, y=20) # 将分数显示在窗口右上角
包括随机生成的数字的样式、速度,你都可以自己修改。如果你想更详细地分析这段代码,你也可以尝试使用大模型哦~
文章如有不妥之处,望大家批评指正!谢谢大家!