中秋节特别游戏:给玉兔投喂月饼
🖼️ 效果展示
📜 游戏背景
在中秋这个充满诗意的节日里,玉兔因为贪玩被赶下人间。在这个温柔的夜晚,我们希望通过一个小游戏,让玉兔感受到人间的温暖和关怀。🐰🌙
🎮 游戏设计
人物与目标
- 玉兔:使用鼠标控制左右移动,目标是接住从天而降的月饼。
- 月饼:随机从屏幕上方降落,接住加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
- 按钮图片
🔧 如何使用
- 安装Pygame
pip install pygame
- 下载代码和素材:将游戏代码和所有素材下载到本地文件夹中。
- 运行游戏:右键或终端运行py文件。
- 游戏操作:
- 使用鼠标控制玉兔左右移动。
- 点击开始按钮开始游戏。
- 游戏过程中,接住月饼加分,接住月亮减分并减少生命值。
- 游戏结束后,点击重来按钮重新开始。
🌟 游戏功能
- 动态得分系统:根据接住的月饼和月亮动态计算得分。
- 生命值管理:通过血条显示玉兔的生命值,增加游戏的挑战性。
- 难度自适应:随着得分的增加,游戏难度会逐渐提高,增加游戏的可玩性。
- 重新开始机制:游戏结束后,玩家可以立即重新开始,无需重新加载游戏。
🌟 结束语
“但愿人长久,千里共婵娟”,在这个中秋,让我们一起通过这个游戏,传递温暖和快乐。🌕😊
👇 源码资料获取 · 技术与交流 👇
相关文章:

中秋节特别游戏:给玉兔投喂月饼
🖼️ 效果展示 📜 游戏背景 在中秋这个充满诗意的节日里,玉兔因为贪玩被赶下人间。在这个温柔的夜晚,我们希望通过一个小游戏,让玉兔感受到人间的温暖和关怀。🐰🌙 🎮 游戏设计 人…...
python pdf转word或excel
python pdf转word或excel 直接上源码 main import gradio as gr import pdf2docx as p2d import Pdf2Excel as p2e import utils.id.IdUtil as idUtildef convert_pdf_to(pdf_file, pdf_pwd, pdf_to_type):if pdf_to_type "docx":# Convert PDF to DOCXcv p2d.C…...
GNU链接器(LD):位置计数器(.)功能及实例解析
0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分: (1)编译器 (2)汇编器 (3)链接器 (4)lib库 在GNU工具链中&…...

学习记录:js算法(四十三):翻转二叉树
文章目录 翻转二叉树我的思路网上思路递归栈 总结 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点 图一: 图二: 示例 1:(如图一) 输入:root [4,2,7,1…...
关于 SQL 的 JOIN 操作
关于 SQL 的 JOIN 操作 在关系型数据库中,数据通常分布在多个表中。为了进行有效的数据检索,我们需要从不同的表中组合数据,这时就需要使用 JOIN 操作。本文将深入探讨 SQL 中不同类型的 JOIN 及其用法,以帮助你在数据库查询中更…...

聊聊AUTOSAR:基于Vector MICROSAR的TC8测试开发方案
技术背景 车载以太网技术作为汽车智能化和网联化的重要组成部分,正逐步成为现代汽车网络架构的核心,已广泛应用于汽车诊断(如OBD)、ECU软件更新、智能座舱系统、高清摄像头环视泊车系统等多个领域。 在这个过程中,ET…...
ES6中迭代器与生成器知识浅析
ES5及以下版本对JS几种集合,要存取数据一般需要用循环语句来遍历,就要初始化一个或多个变量来记录每一次循环在数据集合中的位置或数据值。这里容易出现超出边界问题,造成程序出错。另外,对于多次循环也需要跟踪理清各个变量关系及…...

unix中的vfork函数
一、前言 本文介绍unix中的vfork函数,vfork函数功能和fork函数类似,也是用于创建新的进程,只不过调用vfork函数创建的子进程将共享父进程的进程空间,且只有当子进程调用exec()或者exit()函数后,父进程才会继续运行。 …...
Android 用线程池实现一个简单的任务队列(Kotlin)
关于线程池,Kotlin和java的使用方式一样 在Android中,很多人喜欢用Handler的postDelayed() 去实现延时任务. 要使用postDelayed(),去实现延时任务队列,就不可避免要使用递归. 但是这样做,代码的简洁性,和书写的简易,就远不如使用线程池. 使用线程池的简单程度: private val…...
遨游信息技术的浩瀚宇宙:探索MySQL的深邃奥秘
遨游信息技术的浩瀚宇宙:探索MySQL的深邃奥秘 在信息技术的浩瀚宇宙中,MySQL犹如一颗璀璨的星辰,以其稳定、高效、灵活的特性,照亮了无数开发者与数据管理者的前行之路。作为关系型数据库管理系统的佼佼者,MySQL不仅承…...

【Bug解决】Nacos启动成功,但却无法访问(提示:无法访问此网站,192.168.10.88的响应时间过长)
项目场景: 在虚拟机上通过Docker创建Nacos容器,已经创建成功,查看Nacos启动日志也是成功。但通过端口号加8848/nacos(如:http://IP:8848/nacos)无法访问到Nacos管理页面。 愿意分析一: 先检查好…...

【AI创作组】工程方向的硕士研究生学习Matlab的路径
1. MATLAB软件概述 1.1 MATLAB发展历程 MATLAB自20世纪70年代诞生以来,已经经历了多次重要的版本更新和功能扩展。 初始版本:MATLAB的前身只是一个简单的交互式矩阵计算器,由Cleve B. Moler博士在1970年代初期开发,目的是为了方便学生和研究人员使用线性代数软件包LINPAC…...
Mac使用Nginx设置代理,并禁用自带Apache
Mac自带Apache服务,并占用80端口,如果需要使用Nginx,需要禁用Apache并自己安装Nginx 一、禁用自带Apache 1.关闭Apache sudo apachectl -k stop 如果出现如下报错:httpd: Could not reliably determine the server’s fully q…...

AlmaLinux 安裝JDK8
在 AlmaLinux 上安装 JDK 8 可以通过包管理器 dnf 来完成。AlmaLinux 是基于 RHEL 的一个开源发行版,因此其包管理系统和 RHEL 类似。以下是详细的步骤来安装 OpenJDK 8 1. 更新系统包列表 sudo dnf update -y 2. 安装 OpenJDK 8 使用 dnf 安装 OpenJDK 8。你可…...

Set 和 Map 的模拟实现
1、引言 在数据结构与算法的学习与实践中,关联容器(associative containers)是不可忽视的重要工具。作为高效管理数据的一类容器,C 标准库中的 set 和 map 在现代软件开发中扮演着关键角色。这两个容器通过平衡二叉搜索树&#x…...
深度学习自编码器 - 预测稀疏分解(PSD)篇
序言 在数据科学与机器学习的广阔领域中,深度学习作为一股不可忽视的力量,正引领着技术革新的浪潮。其中,自编码器( Autoencoder \text{Autoencoder} Autoencoder)作为一种特殊的神经网络结构,以其独特的自…...
如何检测出来这个ip是共享ip不安全
检测一个IP是否为共享IP以及其安全性可以通过以下几种方法和工具来进行分析。共享IP通常是指多个用户共享一个IP地址,常见于公共代理服务器、VPN服务或数据中心IP。如果你想评估一个IP是否为共享IP以及其安全性,以下方法和工具可以帮助你进行检测和分析。…...

TMStarget学习——T1 Segmentation数据处理及解bug
最新学习季公俊老师的神器 TMStarget 的第一个模块基于结构像的靶区计算T1 segmentation。下面上步骤: (1)在github 上下载 TMStarget https://github.com/jigongjun/Neuroimaging-and-Neuromodulation (2)按照要求下载依赖工具软件AFQ、vistasoft、SPM12 &#…...
锁策略, cas 和 synchronized 优化过程
1.1 常見的鎖策略 預測鎖衝突概率 樂觀鎖:加鎖的時候,假設出現鎖衝突的概率不大。圍繞加鎖做的工作會更少。 悲觀鎖:加鎖的時候,假設鎖出現衝突的概率很大。圍繞加鎖做的工作會更多。 synchronized “自適應” 初始是樂觀的。鎖…...

【HTML5】html5开篇基础(2)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...