中秋节特别游戏:给玉兔投喂月饼

🖼️ 效果展示

📜 游戏背景

在中秋这个充满诗意的节日里,玉兔因为贪玩被赶下人间。在这个温柔的夜晚,我们希望通过一个小游戏,让玉兔感受到人间的温暖和关怀。🐰🌙

🎮 游戏设计

人物与目标

  • 玉兔:使用鼠标控制左右移动,目标是接住从天而降的月饼。
  • 月饼:随机从屏幕上方降落,接住加10分,落到地面减5分。
  • 月亮:随机降落,接住减5分并减少一格生命值。

游戏机制

  • 生命值(血条):初始为3格,每接住一个月亮减少一格,归零游戏结束。
  • 开始与重来:点击开始按钮进入游戏,游戏结束后点击重来按钮重新开始。

💻 代码素材

游戏环境:

  • Python 3.10.10
  • Pygame 2.5.2

代码示例

python 复制代码
# 隐藏pygame的import欢迎显示
import os

os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = ''
import pygame
import random

pygame.init()  # 初始化pygame库
sc = pygame.display.set_mode((600, 695))  # 创建游戏窗口,尺寸为600x695
pygame.display.set_caption("玉兔吃月饼------祝大家中秋节快乐!")  # 设置窗口标题

# 加载图片资源
basket = pygame.image.load("img/basket.png")  # 加载篮子的图片
bj = pygame.image.load("img/bj.jpg")  # 加载背景图片
bomb = pygame.image.load("img/bomb.png")  # 加载炸弹图片
coin = pygame.image.load("img/coin.png")  # 加载月饼图片
start = pygame.image.load("img/start.jpg")  # 加载开始画面图片
over = pygame.image.load("img/over.jpg")  # 加载结束画面图片
ihp = pygame.image.load("img/hp.png")  # 加载生命值图标
btn_up = pygame.image.load("img/btn_up.png")  # 加载开始按钮的正常状态图片
btn_down = pygame.image.load("img/btn_down.png")  # 加载开始按钮的按下状态图片
bbtn_up = pygame.image.load("img/bbtn_up.png")  # 加载结束按钮的正常状态图片
bbtn_down = pygame.image.load("img/bbtn_down.png")  # 加载结束按钮的按下状态图片

# 加载声音资源
pygame.mixer.init()  # 初始化声音模块
coin_sound = pygame.mixer.Sound("sound/coin.mp3")  # 加载月饼音效
bomb_sound = pygame.mixer.Sound("sound/bomb.mp3")  # 加载炸弹音效
game_start_sound = pygame.mixer.Sound("sound/start.mp3")  # 加载游戏开始音效
game_over_sound = pygame.mixer.Sound("sound/game_over.mp3")  # 加载游戏结束音效

word = "HP"  # 生命值文字
font = pygame.font.SysFont("", 32)  # 创建字体对象,大小为32
text = font.render(word, True, (75, 217, 65))  # 渲染生命值文字,颜色为绿色
score = 0  # 初始化分数为0
text1 = font.render(str(score), True, (255, 255, 255))  # 渲染分数,颜色为白色
bx = 0  # 初始化篮子的x坐标
lx, ly = [], []  # 月饼的x和y坐标列表
fx, fy = [], []  # 炸弹的x和y坐标列表
speedy = 1  # 初始速度
hp = 4  # 初始化生命值为4

# 初始化月饼的位置
for i in range(0, 4):
    tx = random.randint(0, 586)  # 随机生成月饼的x坐标
    ty = (i - 1) * 150  # 计算月饼的y坐标
    lx.append(tx)  # 将x坐标添加到列表
    ly.append(ty)  # 将y坐标添加到列表

# 初始化炸弹的位置
for i in range(0, 2):
    x = random.randint(0, 586)  # 随机生成炸弹的x坐标
    y = (i - 1) * 300  # 计算炸弹的y坐标
    fx.append(x)  # 将x坐标添加到列表
    fy.append(y)  # 将y坐标添加到列表


class Button(object):
    def __init__(self, button_up, button_down, position):
        self.btn_up = button_up  # 按钮的正常状态图
        self.btn_down = button_down  # 按钮的按下状态图
        self.position = position  # 按钮的位置(x, y)

    def is_over(self):
        point_x, point_y = pygame.mouse.get_pos()  # 获取鼠标的当前坐标
        x, y = self.position  # 按钮的位置坐标
        w, h = self.btn_down.get_size()  # 按钮的宽度和高度
        # 检查鼠标是否在按钮的水平范围内
        in_x = x - w / 2 < point_x < x + w / 2
        # 检查鼠标是否在按钮的垂直范围内
        in_y = y - h / 2 < point_y < y + h / 2
        return in_x and in_y  # 如果鼠标在按钮范围内则返回True

    def is_pressed(self):
        if event.type == pygame.MOUSEBUTTONDOWN:  # 如果检测到鼠标按下事件
            point_x, point_y = pygame.mouse.get_pos()  # 获取鼠标的当前坐标
            x, y = self.position  # 按钮的位置坐标
            w, h = self.btn_down.get_size()  # 按钮的宽度和高度
            # 检查鼠标是否在按钮的水平范围内
            in_x = x - w / 2 < point_x < x + w / 2
            # 检查鼠标是否在按钮的垂直范围内
            in_y = y - h / 2 < point_y < y + h / 2
            return True  # 如果按钮被按下则返回True

    def render(self):
        w, h = self.btn_up.get_size()  # 获取按钮的宽度和高度
        x, y = self.position  # 按钮的位置坐标
        if self.is_over():  # 如果鼠标在按钮上
            sc.blit(self.btn_down, (x - w / 2, y - h / 2))  # 绘制按下状态的按钮图
        else:
            sc.blit(self.btn_up, (x - w / 2, y - h / 2))  # 绘制正常状态的按钮图


button = Button(btn_up, btn_down, (288, 460))  # 创建开始按钮对象
over_button = Button(bbtn_up, bbtn_down, (288, 460))  # 创建结束按钮对象

while True:  # 主游戏循环
    for event in pygame.event.get():  # 处理所有事件
        if event.type == pygame.QUIT:  # 如果用户点击关闭按钮
            pygame.quit()  # 退出pygame
            exit()  # 退出程序

    sc.blit(start, (0, 0))  # 绘制开始画面
    over_button.render()  # 渲染结束按钮

    if over_button.is_pressed():  # 如果点击了结束按钮
        hp = 3  # 重置生命值
        score = 0  # 重置分数
        text1 = font.render(str(score), True, (255, 255, 255))  # 更新分数字符串
        game_start_sound.play()  # 播放开始游戏音效

    if 0 < hp < 4 and score >= 0:  # 游戏进行中
        sc.blit(bj, (0, 0))  # 绘制背景
        sc.blit(text, (10, 583))  # 绘制生命值文字
        sc.blit(text1, (570, 570))  # 绘制分数
        sc.blit(basket, (bx, 540))  # 绘制篮子

        # 根据分数调整掉落速度
        if score <= 50:
            speedy = 0.4
        elif score > 100:
            speedy = 0.8
        elif score > 150:
            speedy = 1.2
        elif score > 200:
            speedy = 1.6

        # 处理月饼的掉落
        for i in range(len(lx)):
            sc.blit(coin, (lx[i], ly[i] - 600))  # 绘制月饼
            ly[i] += speedy  # 更新月饼的y坐标
            if ly[i] > 610 + 600:  # 如果月饼掉出屏幕
                ly[i] = 600  # 重置月饼的y坐标
                lx[i] = random.randint(0, 540)  # 随机重置月饼的x坐标
                score -= 5  # 减少分数
                text1 = font.render(str(score), True, (255, 255, 255))  # 更新分数字符串

            # 检测月饼是否被篮子接住
            if bx < lx[i] + 24 < bx + 62 and 1120 <= ly[i] <= 1140:
                ly[i] = 600  # 重置月饼的y坐标
                lx[i] = random.randint(0, 586)  # 随机重置月饼的x坐标
                score += 10  # 增加分数
                text1 = font.render(str(score), True, (255, 255, 255))  # 更新分数字符串
                coin_sound.play()  # 播放收集月饼音效

        # 处理炸弹的掉落
        for i in range(len(fx)):
            sc.blit(bomb, (fx[i], fy[i] - 600))  # 绘制炸弹
            fy[i] += speedy  # 更新炸弹的y坐标
            if fy[i] > 610 + 600:  # 如果炸弹掉出屏幕
                fy[i] = 600  # 重置炸弹的y坐标
                fx[i] = random.randint(0, 545)  # 随机重置炸弹的x坐标

            # 检测炸弹是否击中篮子
            if bx < fx[i] + 24 < bx + 62 and 1120 <= fy[i] <= 1140:
                hp -= 1  # 生命值减少
                fy[i] = 600  # 重置炸弹的y坐标
                fx[i] = random.randint(0, 586)  # 随机重置炸弹的x坐标
                bomb_sound.play()  # 播放炸弹音效

        if event.type == pygame.MOUSEMOTION:  # 如果鼠标移动事件
            mx, my = pygame.mouse.get_pos()  # 获取鼠标位置
            bx = mx - 24  # 更新篮子的x坐标

        # 边界检测
        if bx < 0:
            bx = 0  # 确保篮子不会超出左边界
        if bx > 610 - 62:
            bx = 548  # 确保篮子不会超出右边界

        keys = pygame.key.get_pressed()  # 获取按键状态
        if keys[pygame.K_a] or keys[pygame.K_RIGHT]:  # 如果按下右键或A键
            bx += 5  # 向右移动篮子
        if keys[pygame.K_d] or keys[pygame.K_LEFT]:  # 如果按下左键或D键
            bx -= 5  # 向左移动篮子

        # 绘制生命值图标
        for i in range(0, hp):
            sc.blit(ihp, (22 * i + 40, 585))

    # 游戏结束
    if hp == 0 or score < 0:
        bx = 0  # 重置篮子位置
        speedy = 1  # 重置速度
        # 重置月饼的位置
        for i in range(len(lx)):
            lx[i] = random.randint(0, 586)  # 随机重置月饼的x坐标
            ly[i] = (i - 1) * 150  # 计算月饼的y坐标

        # 重置炸弹的位置
        for i in range(len(fx)):
            fx[i] = random.randint(0, 586)  # 随机重置炸弹的x坐标
            fy[i] = (i - 1) * 300  # 计算炸弹的y坐标

        sc.blit(over, (0, 0))  # 绘制结束画面
        button.render()  # 渲染开始按钮
        game_over_sound.play()  # 播放游戏结束音效

        if button.is_pressed():  # 如果点击了开始按钮
            hp = 3  # 重置生命值
            score = 0  # 重置分数
            text1 = font.render(str(score), True, (255, 255, 255))  # 更新分数字符串
            game_start_sound.play()  # 播放开始游戏音效

    pygame.display.update()  # 更新屏幕显示

📁 素材

  • basket.png - 玉兔图片
  • bj.jpg - 游戏背景
  • bomb.png - 月亮图片
  • coin.png - 月饼图片
  • start.jpg - 开始界面
  • over.jpg - 游戏结束界面
  • hp.png - 生命值图标
  • btn_up.png, btn_down.png - 按钮图片

🔧 如何使用

  1. 安装Pygame

    shell 复制代码
    pip install pygame
  2. 下载代码和素材:将游戏代码和所有素材下载到本地文件夹中。

  3. 运行游戏:右键或终端运行py文件。

  4. 游戏操作

    • 使用鼠标控制玉兔左右移动。
    • 点击开始按钮开始游戏。
    • 游戏过程中,接住月饼加分,接住月亮减分并减少生命值。
    • 游戏结束后,点击重来按钮重新开始。

🌟 游戏功能

  • 动态得分系统:根据接住的月饼和月亮动态计算得分。
  • 生命值管理:通过血条显示玉兔的生命值,增加游戏的挑战性。
  • 难度自适应:随着得分的增加,游戏难度会逐渐提高,增加游戏的可玩性。
  • 重新开始机制:游戏结束后,玩家可以立即重新开始,无需重新加载游戏。

🌟 结束语

"但愿人长久,千里共婵娟",在这个中秋,让我们一起通过这个游戏,传递温暖和快乐。🌕😊

👇 源码资料获取 · 技术与交流 👇

相关推荐
数据智能老司机6 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机7 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机7 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机7 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i7 小时前
drf初步梳理
python·django
每日AI新事件7 小时前
python的异步函数
python
这里有鱼汤8 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook17 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室17 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三19 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试