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

🖼️ 效果展示

在这里插入图片描述

📜 游戏背景

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

🎮 游戏设计

人物与目标

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

游戏机制

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

💻 代码素材

游戏环境:

  • Python 3.10.10
  • Pygame 2.5.2

代码示例

# 隐藏pygame的import欢迎显示
import osos.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = ''
import pygame
import randompygame.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 / 2return in_x and in_y  # 如果鼠标在按钮范围内则返回Truedef 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 / 2return True  # 如果按钮被按下则返回Truedef 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()  # 退出pygameexit()  # 退出程序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.4elif score > 100:speedy = 0.8elif score > 150:speedy = 1.2elif 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.mzph.cn/news/880174.shtml

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

相关文章

Oracle数据库的比较运算符Comparison Operators

Comparison operators compare one expression to another. The result is always either TRUE, FALSE, or NULL. If the value of one expression is NULL, then the result of the comparison is also NULL. 如果一个表达式的值为NULL&#xff0c;那么比较的结果也是NULL。 …

5、论文阅读:深水下的图像增强

深水下的图像增强 前言介绍贡献UWCNN介绍网络架构残差Residuals块 Blocks网络层密集串联网络深度减少边界伪影网络损失Loss后处理前言 水下场景中,与波长相关的光吸收和散射会降低图像的可见度,导致对比度低和色偏失真。为了解决这个问题,我们提出了一种基于卷积神经网络的…

Rust调用tree-sitter解析C语言

文章目录 一、Rust 调用 tree-sitter 解析 C 语言代码1. 设置 Rust 项目2. 添加 tree-sitter 依赖3. 编写 Rust 代码4. 运行程序5. 编译出错 二、解决步骤1. 添加 tree-sitter 构建依赖2. 添加 tree-sitter-c 源代码3. 修改 build.rs 以编译 tree-sitter-c 库4. 修改 Cargo.tom…

Ubuntu中常用的操作指令

ubuntu中常通过在命令行中输入各种指令完成操作。 文件操作指令 ls&#xff1a;列出目录内容 ls cd&#xff1a;改变当前目录 # 进入指定目录 cd /path/to/directory # 返回上一级目录 cd .. # 返回用户主目录 cd ~ cp&#xff1a;复制文件或目录 # 复制文件 …

伊犁云计算22-1 apache 安装rhel8

1 局域网网络必须通 2 yum 必须搭建成功 3 apache 必须安装 开干 要用su 用户来访问 一看httpd 组件安装完毕 到这里就是测试成功了 如何修改主页的目录 网站目录默认保存在/var/WWW/HTML 我希望改变/home/www 122 127 167 行要改

频率色散效应及其与时间选择性衰落信道的联系

频率色散效应&#xff08;Frequency Dispersion Effect&#xff09;是在无线通信中&#xff0c;由于信道中的多普勒效应引起的现象&#xff0c;它会导致接收信号频谱的扩展和频率上的变化。该效应与信道的时间变化有关&#xff0c;是时间选择性衰落信道&#xff08;time-select…

打造灵活DateTimePicker日期时间选择器组件:轻松实现时间的独立清除功能

element ui中日期和时间选择器&#xff08;DateTimePicker&#xff09;是一个常见且重要的组件。它允许用户轻松地选择日期和时间&#xff0c;极大地提升了用户体验。然而&#xff0c;在某些场景下&#xff0c;用户可能需要更细粒度的控制&#xff0c;例如单独清除已选择的时间…

Swagger 概念和使用以及遇到的问题

前言 接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变 成重中之重。接口文档固然重要,但是由于项目周期等原因后端人员经常出现无法及时更新&#xff0c; 导致前端人员抱怨接口文档和实际情况不一致。 很多人员会抱怨别人写的接口文档不…

mysql性能优化-延迟写和异步写优化

MySQL 性能优化中的延迟写和异步写优化是数据库写入操作中非常重要的技术手段。这些技术可以有效减少磁盘 I/O 操作、提高数据库的吞吐量和整体性能。尤其是在高并发写操作场景下&#xff0c;通过优化写入过程&#xff0c;减少阻塞和等待时间&#xff0c;可以大幅度提升系统的响…

Cassandra 5.0 Spring Boot 3.3 CRUD

概览 因AI要使用到向量存储&#xff0c;JanusGraph也使用到Cassandra 卸载先前版本 docker stop cassandra && docker remove cassandra && rm -rf cassandra/运行Cassandra容器 docker run \--name cassandra \--hostname cassandra \-p 9042:9042 \--pri…

【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

【HarmonyOS】深入理解Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 前言 之前就Observed和ObjectLink写过一篇讲解博客【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理&#xff01; 其中就Observe监听类的使用&#xff0c;Object…

ZXing.Net:一个开源条码生成和识别器,支持二维码、条形码等

推荐一个跨平台的非常流行的条码库&#xff0c;方便我们在.Net项目集成条码扫描和生成功能。 01 项目简介 ZXing.Net是ZXing的.Net版本的开源库。支持跨多个平台工作&#xff0c;包括 Windows、Linux 和 macOS&#xff0c;以及在 .NET Core 和 .NET Framework 上运行。 解码…

硬件看门狗导致MCU启动时间慢

最近&#xff0c;在项目交付过程中&#xff0c;我们遇到了一个有趣的问题&#xff0c;与大家分享一下。 客户的需求是&#xff1a;在KL15电压上电后&#xff0c;MCU需要在200ms内发送出第一包CAN报文数据。然而&#xff0c;实际测试结果显示&#xff0c;软件需要360ms才能发送…

【通俗易懂介绍OAuth2.0协议以及4种授权模式】

文章目录 一.OAuth2.0协议介绍二.设计来源于生活三.关于令牌与密码的区别四.应用场景五.接下来分别简单介绍下四种授权模式吧1.客户端模式1.1 介绍1.2 适用场景1.3 时序图 2.密码模式2.1 介绍2.2 适用场景2.3时序图 3.授权码模式3.1 介绍3.2 适用场景3.3 时序图 4.简化模式4.1 …

第二百四十一节 JPA教程 - JPA一对一主键连接列示例、JPA一对一映射级联示例

JPA教程 - JPA一对一主键连接列示例 例子 下面的代码来自Person.java。 package cn.w3cschool.common; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.p…

MES系统如何提升制造企业的运营效率和灵活性

参考拓展&#xff1a;苏州稳联-西门子MES系统-赋能智能制造的核心引擎 制造执行系统(MES)在提升制造企业运营效率和灵活性方面发挥着关键作用。 一、MES系统的基本概念和功能 MES系统是连接企业管理层与生产现场的重要桥梁。它主要负责生产调度、资源管理、质量控制等多个方…

Dockerfile自定义制作镜像,其中10个指令的作用分析

docker容器中 做镜像是重要的技能。 docker commit只能制作比较简单的镜像&#xff0c; 要制作比较完善的镜像&#xff0c; 自定义程度比较高的&#xff0c; 就需要用到dockerfile dockerfile可以回溯历史 动态生成镜像。 FROM是基础镜像 CMD是在容器创建的时候默认的启动命令 …

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击&#xff0c;是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络&#xff0c;向目标发送大量看似合法的请求&#xff0c;从而占用大量网络资源使网络瘫痪&#xff0c;阻止用户对网络资源的正…

Android webview拦截H5的接口请求并返回处理好的数据

Android webview拦截H5的接口请求并返回处理好的数据 Android 可以通过 WebView 的 shouldInterceptRequest 方法拦截到 H5 中的网络请求。这是一个 WebViewClient 中的回调方法&#xff0c;允许开发者在 WebView 发起网络请求时对其进行处理和修改。 具体使用方法如下&#…

TMStarget学习——T1 Segmentation数据处理及解bug

最新学习季公俊老师的神器 TMStarget 的第一个模块基于结构像的靶区计算T1 segmentation。下面上步骤&#xff1a; (1)在github 上下载 TMStarget https://github.com/jigongjun/Neuroimaging-and-Neuromodulation (2)按照要求下载依赖工具软件AFQ、vistasoft、SPM12 &#…