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

🖼️ 效果展示

在这里插入图片描述

📜 游戏背景

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

🎮 游戏设计

人物与目标

  • 玉兔:使用鼠标控制左右移动,目标是接住从天而降的月饼。
  • 月饼:随机从屏幕上方降落,接住加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. 游戏操作
    • 使用鼠标控制玉兔左右移动。
    • 点击开始按钮开始游戏。
    • 游戏过程中,接住月饼加分,接住月亮减分并减少生命值。
    • 游戏结束后,点击重来按钮重新开始。

🌟 游戏功能

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

🌟 结束语

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Broadcast:Android中实现组件及进程间通信

目录 一&#xff0c;Broadcast和BroadcastReceiver 1&#xff0c;简介 2&#xff0c;广播使用 二&#xff0c;静态注册和动态注册 三&#xff0c;无序广播和有序广播 1&#xff0c;有序广播的使用 2&#xff0c;有序广播的截断 3&#xff0c;有序广播的信息传递 四&am…

[产品管理-15]:NPDP新产品开发 - 13 - 产品创新流程 - 具体产品的创新流程:精益生产与敏捷开发

目录 前言&#xff1a;​ 一、集成产品开发IPD模型——集成跨功能团队的产品开发 1.1 概述 1、IPD模型的核心思想 2、IPD模型的主要组成部分 3、IPD模型的实施步骤 4、IPD模型的优点 1.2 基于IPD系统的组织实践等级 1.3 IPD的优缺点 二、瀑布开发模型 1、定义与特点…

21、Tomato

难度 低(个人认为中) 目标 root权限 一个flag 使用VMware启动 kali 192.168.152.56 靶机 192.168.152.66 信息收集 端口信息收集 可以看到有个ftp服务&#xff0c;2211实际是ssh协议端口&#xff0c;80、8888是一个web服务 web测试 80端口显示一个tomato 查看源码给了一些…

opencv图像透视处理

引言 在图像处理与计算机视觉领域&#xff0c;透视变换&#xff08;Perspective Transformation&#xff09;是一种重要的图像校正技术&#xff0c;它允许我们根据图像中已知的四个点&#xff08;通常是矩形的四个角&#xff09;和目标位置的四个点&#xff0c;将图像从一个视…

软件安装攻略:EmEditor编辑器下载安装与使用

EmEditor是一款在Windows平台上运行的文字编辑程序。EmEditor以运作轻巧、敏捷而又功能强大、丰富著称&#xff0c;得到许多用户的好评。Windows内建的记事本程式由于功能太过单薄&#xff0c;所以有不少用户直接以EmEditor取代&#xff0c;emeditor是一个跨平台的文本编辑器&a…

聊城网站建设:企业如何打造高效官网

聊城网站建设&#xff1a;企业如何打造高效官网 在互联网飞速发展的今天&#xff0c;官方网站已成为企业展示形象、推广产品、与客户沟通的重要平台。尤其对于聊城地区的企业来说&#xff0c;建立一个高效的官网显得尤为重要。本文将分享一些关键步骤&#xff0c;帮助企业打造一…

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片&#xff08;block&#xff09;处理&#xff…

人工智能快速发展下的极端风险管理

文章目录 前言一、快速进步与高风险并存1、深度学习系统缺乏关键功能&#xff0c;其开发周期尚不明朗2、自主人工智能系统一旦导向不良目标&#xff0c;人类可能面临其失控风险 二、技术研发方向调整1、实现安全人工智能的基础性突破&#xff0c;确保人工智能可靠安全2、实现有…

shopro前端 短信登录只显示模板不能正常切换

删掉 换成下面的代码 // 打开授权弹框 export function showAuthModal(type smsLogin) {const modal $store(modal);setTimeout(() > {modal.$patch((state) > {state.auth type;});}, 100); }

Python酷库之旅-第三方库Pandas(123)

目录 一、用法精讲 546、pandas.DataFrame.ffill方法 546-1、语法 546-2、参数 546-3、功能 546-4、返回值 546-5、说明 546-6、用法 546-6-1、数据准备 546-6-2、代码示例 546-6-3、结果输出 547、pandas.DataFrame.fillna方法 547-1、语法 547-2、参数 547-3、…

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实&#xff0c;提供互动性强的学习体验&#xff0c;正在改变传统教育模式。AI不仅改变了传统的教学模式&#xff0c;还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务&#xff0c;AI正在全方位提升教育质量和效率。随着…

【OJ刷题】双指针问题6

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

技术周总结 09.09~09.15周日(C# WinForm WPF 软件架构)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…

Python Selenium 自动化爬虫 + Charles Proxy 抓包

一、场景介绍 我们平常会遇到一些需要根据省、市、区查询信息的网站。 1、省市查询 比如这种&#xff0c;因为全国的省市比较多&#xff0c;手动查询工作量还是不小。 2、接口签名 有时候我们用python直接查询后台接口的话&#xff0c;会发现接口是加签名的。 而签名算法我…

细胞分裂检测系统源码分享

细胞分裂检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

计算机人工智能前沿进展-大语言模型方向-2024-09-20

计算机人工智能前沿进展-大语言模型方向-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Garc’ia, Kailan…

[数据集][目标检测]智慧交通铁轨裂缝检测数据集VOC+YOLO格式4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2709 标注数量(xml文件个数)&#xff1a;2709 标注数量(txt文件个数)&#xff1a;2709 标注…

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难&#xff0c;但做到60分基本上照着SOP做到位都没问题&#xff0c;如果我们能把每件事都做到60分&#xff0c;那绝对比至少60%的人都强&#xff0c;除非你的对手不讲武德——那就是他很可能看了我这篇文章&#xff0c;不但每方面都超过及格线&#…

fiddler抓包06_抓取https请求(chrome)

课程大纲 首次安装Fiddler&#xff0c;抓https请求&#xff0c;除打开抓包功能&#xff08;F12&#xff09;还需要&#xff1a; ① Fiddler开启https抓包 ② Fiddler导出证书&#xff1b; ③ 浏览器导入证书。 否则&#xff0c;无法访问https网站&#xff08;如下图&#xff0…

将sqlite3移植到arm开发板上:

一、下载源代码 sqlite3网址&#xff1a;https://www.sqlite.org/download.html 下载&#xff1a;sqlite-autoconf-3460100.tar.gz 二、解压 在Linux家目录下创建一个sqlite3文件夹&#xff0c;将压缩包复制到该文件夹下&#xff0c;再在该目录下打开一个终端&#xff0c;执行…