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

news2024/9/20 23:49:28

🖼️ 效果展示

在这里插入图片描述

📜 游戏背景

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

🎮 游戏设计

人物与目标

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

游戏机制

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

💻 代码素材

游戏环境:

  • Python 3.10.10
  • Pygame 2.5.2

代码示例

# 隐藏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
    pip install pygame
    
  2. 下载代码和素材:将游戏代码和所有素材下载到本地文件夹中。
  3. 运行游戏:右键或终端运行py文件。
  4. 游戏操作
    • 使用鼠标控制玉兔左右移动。
    • 点击开始按钮开始游戏。
    • 游戏过程中,接住月饼加分,接住月亮减分并减少生命值。
    • 游戏结束后,点击重来按钮重新开始。

🌟 游戏功能

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

🌟 结束语

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

👇 源码资料获取 · 技术与交流 👇
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

太阳能光伏板航拍红外图像缺陷分类数据集

太阳能光伏板航拍红外图像缺陷分类数据集 一、数据集简介 太阳能光伏板的性能直接影响到光伏发电系统的效率和可靠性。随着无人机和红外成像技术的发展&#xff0c;通过航拍红外图像对光伏板进行缺陷检测已成为一种高效且准确的方法。本数据集包含11种不同的缺陷分类&#xf…

【CPP】模板(后篇)

目录 13.1 非类型模板参数13.2 函数模板的特化13.3 类模板的特化13.4 模板的分离编译 这里是oldking呐呐,感谢阅读口牙!先赞后看,养成习惯! 个人主页:oldking呐呐 专栏主页:深入CPP语法口牙 13.1 非类型模板参数 顾名思义,非类型模板参数就是一个模板的参数,只不过不是类型,而…

第二十六篇——九地篇:九种形势的应对之道

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 地势的维度重新阐述了懂得人心的重要性&#xff0c;道久其归一为为别人。…

个人随想-gpt-o1大模型中推理链的一个落地实现

​首先祝大家中秋节快乐。 最近openai又推出了新的模型openai o1​还有它的mini版。官网的介绍&#xff0c;就是它的推理能力很强&#xff0c;比gpt-4o​有很大的提升。 最近也跟同行在聊这个o1&#xff0c;​看看落地方面有哪些可行性。在我们自己的实验上&#xff0c;把o1用…

Python画笔案例-052 绘制彩色递归六边形

1、绘制彩色递归六边形 通过 python 的turtle 库绘制 彩色递归六边形&#xff0c;如下图&#xff1a; 2、实现代码 绘制彩色递归六边形&#xff0c;以下为实现代码&#xff1a; """彩色递归六边形.py """ import turtledef draw_circle(radius,…

【自动化测试】移动app的分层测试以及自动遍历的基本概念

引言 移动应用的分层测试是一种系统化的测试方法&#xff0c;它将测试过程分解为不同的层次&#xff0c;以确保应用在每个层面上都符合设计要求和用户期望 文章目录 引言一、移动app的分层测试1.1 单元测试&#xff08;Unit Testing&#xff09;1.2 集成测试&#xff08;Integr…

甲骨文创始人埃里森:人工智能终有一天会追踪你的一举一动

9月17日消息&#xff0c;据外电报道&#xff0c;甲骨文创始人拉里埃里森在甲骨文财务分析师会议上表示&#xff0c;他预计人工智能有一天将为大规模执法监控网络提供动力。“我们将进行监督。”他说。“每一位警察都将随时受到监督&#xff0c;如果有问题&#xff0c;人工智能会…

人工智能辅助汽车造型设计

随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域的应用越来越广泛&#xff0c;汽车设计行业也不例外。尤其在车辆外观造型设计中&#xff0c;AI正在成为设计师的重要助手&#xff0c;通过提供强大的工具和独特的创意方式&#xff0c;革新了传统设…

算法之搜索--最长公共子序列LCS

最长公共子序列&#xff08;longest common sequence&#xff09;:可以不连续 最长公共子串&#xff08;longest common substring&#xff09;&#xff1a;连续 demo for (int i 1;i<lena;i){for (int j 1;j<lenb;j){if(a[i-1]b[j-1]){dp[i][j]dp[i-1][j-1]1;}el…

神奇的Serializable接口,为什么有时候网络传输不用实现Serializable,有时候又需要?

大家好&#xff0c;这里是小奏,觉得文章不错可以关注公众号小奏技术 背景 其他大家在初学java的时候肯定是接触过Serializable接口的&#xff0c;这个接口是一个标记接口&#xff0c;没有任何方法&#xff0c;只是一个标记&#xff0c;用来标记一个类可以被序列化&#xff0c;…

深入解析代理模式:静态代理、JDK 动态代理和 CGLIB 的全方位对比!

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了对象的替身&#xff0c;即代理对象来控制对实际对象的访问。通过代理对象&#xff0c;可以在不修改目标对象的情况下&#xff0c;扩展或控制其功能。例如&#xff0c;代理模式可以用于延…

JDBC的介绍和连接MySQL数据库

目录 1. 为什么学习JDBC 1.1 数据存储​编辑​编辑 1.2 数据操作​编辑 2. JDBC概述 2.1 JDBC概念 2.2 JDBC 核心组成 3. 实现 JDBC 3.1 JDBC 搭建步骤 3.2 详细演示 3.3 核心API 3.3.1 Driver​ 3.3.2 Connection​ 3.3.3 Statament​ 3.3.4 PreparedStatement …

嵌入式单片机中can总线调试方法

大家好,今天将向大家介绍如何使用STM32F4自带的CAN控制器实现两个开发板之间的CAN通信。 1.CAN CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的…

大模型笔记03--快速体验dify

大模型笔记03--快速体验dify 介绍部署&测试部署 dify测试dify对接本地ollama大模型对接阿里云千问大模型在个人网站中嵌入dify智能客服 注意事项说明 介绍 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;…

优化 OR 条件过多导致的查询超时

优化 OR 条件过多导致的查询超时 文章目录 优化 OR 条件过多导致的查询超时背景问题分析方案分析方案一&#xff1a;入参去重方案二&#xff1a;分页或者分批查询方案三&#xff1a;UNION 代替 OR方案四&#xff1a;IN 代替 OR1. 分别对列进行 IN 查询&#xff0c;在代码中进行…

同一Python脚本中训练多个模型时的 wandb 配置错误解决方案

文章目录 摘要背景介绍报错信息wandb 模型训练名 摘要 在机器学习项目中&#xff0c;使用Python脚本训练多个模型时&#xff0c;可能会遇到WandB&#xff08;Weights and Biases&#xff09;配置错误&#xff0c;尤其是在训练多个模型参数大小不一致的情况下。 本文将介绍如何…

Vue学习记录之三(ref全家桶)

ref、reactive是在 setup() 声明组件内部状态用的&#xff0c; 这些变量通常都要 return 出去&#xff0c;除了供 < template > 或渲染函数渲染视图&#xff0c;也可以作为 props 或 emit 参数 在组件间传递。它们的值变更可触发页面渲染。 ref &#xff1a;是一个函数&…

Get包中的根组件

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"Get包简介"相关的内容&#xff0c;本章回中将介绍GetMaterialApp组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经…

Unity webgl跨域问题 unity使用nginx设置跨域 ,修改请求头

跨域 什么是跨域 跨域是指浏览器因安全策略限制&#xff0c;阻止一个域下的网页访问另一个域下的资源。 一些常见的跨域情况&#xff1a; 协议不同 从 http://example.com 请求 https://example.com。域名不同 从 http://example.com 请求 http://anotherdomain.com。端口不…

Village Exteriors Kit 中世纪乡村房屋场景模型

此模块化工具包就是你一直在寻找的适合建造所有中世纪幻想村庄和城市建筑所需要的工具包。 皇家园区 - 村庄外饰套件的模型和纹理插件资源包 酒馆和客栈、魔法商店、市政大厅、公会大厅、布莱克史密斯锻造厂、百货商店、珠宝商店、药店、草药师、银行、铠甲、弗莱切、马厩、桌…