小恐龙吃数字(Python)

这是一个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像素的,程序中加载图片时没有调整图片大小,因此你的图片不宜过大,否则就会像下面这样(太大了,没法玩了):

 

如果你想找小恐龙的图片,你可以登录阿里巴巴矢量图标库,那里有许多免费的小图标,下载时可以自己调整图片颜色、格式、大小,特别方便。

iconfont-阿里巴巴矢量图标库

搞完地址后,运行此程序。在这个程序中,你能够通过键盘控制小恐龙的运动: 

        ' 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)  # 将分数显示在窗口右上角

包括随机生成的数字的样式、速度,你都可以自己修改。如果你想更详细地分析这段代码,你也可以尝试使用大模型哦~

文章如有不妥之处,望大家批评指正!谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值