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

news/2024/9/24 8:23:05/

🖼️ 效果展示

在这里插入图片描述

📜 游戏背景

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

🎮 游戏设计

人物与目标

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

游戏机制

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

💻 代码素材

游戏环境:

  • Python 3.10.10
  • Pygame 2.5.2

代码示例

python"># 隐藏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.ppmy.cn/news/1529727.html

相关文章

prompt攻击与防范

Prompt攻击是指通过精心设计的输入提示来操纵AI模型&#xff0c;使其产生不准确或有害的输出。这些攻击可能包括提示词注入、提示词泄露和提示词越狱等。攻击者可能会尝试通过提供包含恶意内容的输入&#xff0c;来操纵语言模型的输出&#xff0c;或者从模型的响应中提取敏感或…

设计模式推荐网站

https://refactoringguru.cn/design-patterns 前言 写最好的设计模式专栏 看云 工厂模式 - 代码学院 www.codexy.cn 以及腾讯云社区和阿里云社区等的文章

vue的插槽

具名插槽 简写&#xff1a; 作用域插槽 老版本插槽

vue/配置axios(前后端数据连通/api接口的调用)

1.创建apis文件 2.写入调用的api地址且暴露出去。 import httpInstance from /utils/http;export function getHomeNav() {return httpInstance({url: http://10.0.11.91:91/dailyreport/getdailyreportall,}) }3.创建文件编写拦截器 代码部分 //axios基础封装 import axio…

统一网关--gateway(仅供自己参考)

1、网关的概念&#xff1a; 2、网关的功能&#xff1a; &#xff08;1&#xff09;&#xff1a;身份认证和权限校验 &#xff08;2&#xff09;&#xff1a;服务路由&#xff08;具体的业务路由到具体的服务&#xff09;&#xff0c;负载均衡&#xff08;多台服务的话&#xff…

2024.9.23 Python会议室,堆的使用,用最少数量的箭引爆气球,字典遍历的操作,找到字符串中所有字母异位词,丑数

1.会议室 II 给你一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;返回 所需会议室的最小数量 。 示例 1&#xff1a; 输入&#xff1a;intervals [[0,30],[5,10],[15,20]] 输出&#xff1a;2…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

web基础—dvwa靶场(十一)CSP Bypass

CSP Bypass(CSP 绕过) 内容安全策略&#xff08;CSP&#xff09;用于定义脚本和其他资源可以从何处加载或执行&#xff0c;本模块将指导您根据开发人员犯下的常见错误来绕过该策略。 这些漏洞都不是 CSP 中的实际漏洞&#xff0c;它们都是实现 CSP 的方式中的漏洞。 绕过内容安…