这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2024 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253 |
这个作业的目标 | 开发"羊了个羊"类消除类小游戏,合理运用 AIGC 工具提高效率 |
学号 | 102201125 |
项目介绍:基于 Pygame 的“daydaymayday”游戏
github仓库
前端设计与特色功能
在本项目中,实现了一个基于 Pygame 的互动游戏 "daydayymayday",基本规则与“羊了个羊”类似。游戏整体采用简洁明快的图形设计,图像设计来自于五月天元素,使用了圆形图案和多层次的网格布局。图案显示在 6x6 和 9x9 的网格中,玩家需要通过点击图案来完成消除。
前端设计:
1. 主菜单界面:
包括 "开始游戏"、"排行榜"、"退出游戏" 选项。
2. 模式选择:
玩家可以在六种模式中选择不同的图案集。每种模式对应不同的图片集合,让游戏的图案具有多样性,同时我通过游戏图案的颜色,以此来增加难度,到后几个模式,图案颜色一样,只有细节不同。
3. 游戏界面:
图案采用圆形,并且错位显示,以增加视觉上的层次感。每个图案都被分配到不同的层次上,确保下层图案被上层图案遮挡时无法点击。每次消除成功时,三消的相同图案将会从槽中被移除。
4. 光圈效果:
当鼠标悬停在可点击的图案上时,该图案会显示黄色光圈,帮助玩家识别可以操作的区域。
5. 游戏结束界面:
游戏根据结果(成功或失败)显示不同的背景图片,提供了用户友好的反馈机制。
特色功能:
1. 分层以及错位摆放图案:
图案的层次摆放,使得上层图案必须被消除后,才能点击下层图案,同时错位这一设计增加了游戏的复杂性。
2. 动态大小调整:
第二关图案稍微缩小(有点费眼睛),关卡难度提升,带给玩家新的挑战。槽宽度和图案背景会动态调整,保证视觉上的一致性。
3. 排行榜功能:
通过记录玩家通关时间来进行排序,玩家可以在排行榜中查看自己的成绩并与其他玩家对比。
4. 键盘操作:
通过 R 键刷新当前关卡,U 键直接清除槽位的图案,算是加入一些特殊功能。
使用的技术和特殊算法:
1. 字体和图片加载
- 加载支持中文的字体,并指定路径为 STKAITI.TTF。
- 加载了多个背景图片,分别用于菜单、游戏、结束场景等,并通过 pygame.transform.scale 调整这些图片以适应屏幕尺寸,不用这个函数图案和界面不匹配,非常奇怪。
- 图案加载函数 load_patterns,这个函数根据选择的模式,加载指定文件夹中的图案图片(每个模式有 6 个图案),并根据 block_size 调整图案大小,将它们存储在 patterns 列表中。
2. Block 类
- 定义了 Block 类,用于表示游戏中的每个图案方块。
- 方块的位置有一定的随机偏移,通过 offset_x 和 offset_y 实现,使得图案在显示时有些许随机性。
- 使用 pygame.mask.from_surface 来为每个图案生成遮罩,用于后续的遮挡检测,这个还是调试了很久,有点难实现。
3. 主菜单 main_menu界面
- 主菜单包含三个选项:“开始游戏”,“排行榜”,和“退出游戏”。通过 pygame.font.Font.render() 渲染文本,并显示在屏幕上。
- 使用 pygame.MOUSEBUTTONDOWN 事件来检测玩家点击,如果玩家点击了对应选项,则进入不同的功能逻辑(游戏、排行榜、退出)。
4. 显示排行榜 show_leaderboard
- 在 show_leaderboard() 函数中,排行榜会按照玩家完成游戏的时间进行排序,排行榜最多显示前 5 名玩家的时间。
5. 模式选择 mode_selection
- 玩家可以从 6 种模式中进行选择,选择不同的模式会加载不同的图案集合,通过 selected_mode 记录玩家的选择,随后用于加载相应模式下的图案。
6. 遮挡检测 is_clickable
- 使用 pygame.mask 进行图案的遮挡检测。
- 如果某个图案的遮罩和上方图案的遮罩有重叠,则该图案不可点击。
- 黄圈的显示是为了让玩家知道哪些图案是可以点击。黄圈的大小与图案匹配,并且只有在鼠标悬停在可点击的图案上时才会显示。也是利用了这个is_clickable函数和block.rect.collidepoint(mouse_pos)检测,然后pygame.draw.circle匹配我使用的圆形图案
7. 消除方块 remove_matched_blocks
- 检查玩家选中的图案是否有 3 个相同的图案,如果满足条件,则消除这些图案,这个地方调试了很久,有各种各样的bug
8. 结束画面 end_screen
- 当游戏结束时(成功通关或时间用尽),显示结束页面,提示玩家是否重新开始游戏。
- 根据游戏结果(成功或失败),显示不同的背景图片。
9. 生成网格 create_grid(最难实现的一部分)
- 这个函数会根据关卡的不同,生成 6x6 或 9x9 的网格,并将图案位置向屏幕中心对齐。
- 通过随机打乱图案组合,使得每次游戏图案的分布都不一样,增加游戏的随机性和可玩性。
- 同时使用偏移量,实现图案的错位显示
10. 功能键
- 按下 R 键时,会刷新关卡,重置时间并重新生成图案。
- 按下 U 键时,会清空当前槽中的图案。
(具体代码看我仓库)
游戏展示
素材
这里素材都是五月天粉丝自行创造,允许使用,不涉及版权问题, 寻找素材是真麻烦,不过发现了手机软件可以自动抠图抠出主体这个功能还是很赞的
主菜单
模式选择(不同模式对于不同难度)
排行榜
关卡一
消除逻辑展示以及黄圈显示(压缩的有点糊)
关卡二
成功界面
失败界面(时间超时和槽数量达到)
功能键展示(这里我开始狂点U,消除,后面狂点R,一直刷新)
测试过程·调试难点
1. 存放图案的槽
- 最开始我是用颜色来测试,最开始要解决的问题是,我点击完一个颜色方块,我原来位置的方块不会消失,然后槽里也会显示,接着改代码想让原来位置的方块消失,后面就是两个地方都不显示了,最后发现是渲染顺序的问题,调整后解决
- 槽的大小会随着我的图案的尺寸变化,通过引入参数,全局变量,来计算这个槽的大小去适应我的图案的大小。
2. 图案点击测试
- 测试是否能够正确点击图案,且图案是否必须在上层图案移除后才能点击,这个地方是最难实现的,最开始重叠的地方点一下,会把那个地方重叠的图案全部点进去,后面通过ai,采用遮罩的方式解决,这个地方应该可以在优化。
3. 光圈效果测试
- 测试鼠标悬停时,光圈是否正确显示在可点击的图案上,这个也是和图案点击测试差不多的问题,重叠的地方的每个图案都会显示出光圈,通过is_clickable函数来解决,但是有些地方还是会有这样的问题,大概是因为我生成图案的逻辑问题,需要进一步调整。
4. 关卡切换测试
- 在游戏中通过第一关后,检查是否进入第二关,图案和槽是否大小正常。在第二关之后重新开始的第一关的图案和槽的大小是否正常,这个bug也卡了很久,后面再这个函数里调整的尺寸来适应。
过程性展示
copilot安装
AIGC 表格
学习内容 | 收获 |
---|---|
Pygame 框架使用 | 掌握了如何通过 Pygame 渲染图像、处理事件和键盘交互 |
图案加载与动态调整 | 了解了如何动态加载图案并调整大小,使界面自适应调整 |
分层与遮挡检测 | 学会了如何使用遮罩进行碰撞检测,确保正确的分层点击逻辑 |
键盘快捷操作 | 实现了通过键盘刷新关卡和清空槽位的功能,简化了玩家操作 |
排行榜功能实现 | 理解了排行榜数据的存储和排序逻辑,并成功应用在项目中 |
图案分布随机性优化 | 通过随机分布算法优化了图案分布,避免相同图案过于集中 |
- 心得体会
生成长代码会有各种各样的错误,需要一步一步调试,才能得到正确结果,不过解决这种简单小游戏的bug和问题,它可以很快的找到错误并且给出建议,还是很帮助的。
PSP表格
PSP 阶段 | 任务内容 | 预估时间(小时) | 实际时间(小时) | 说明与评价 |
---|---|---|---|---|
计划 | 制定游戏开发计划 | 1 | 1.5 | 计划合理,但细节方面预估不够准确 |
需求分析 | 分析游戏需求与功能 | 2 | 2 | 完成了所有核心功能需求的分析 |
设计 | 设计界面与功能逻辑 | 3 | 4 | 设计图案分布和分层逻辑时花费较多时间 |
开发 | 实现游戏逻辑与功能 | 8 | 10 | 实现了所有核心功能,调试时间较长 |
测试 | 编写测试用例与测试 | 5 | 6 | 测试发现了部分逻辑问题,并及时修复 |
文档编写 | 编写项目文档与总结 | 2 | 1.5 | 文档编写顺利,时间控制较好 |
优化与改进 | 界面与交互优化 | 3 | 3 | 完成了图案随机分布和光圈优化 |
总结 | 项目总结与反思 | 1 | 1 | 体验丰富,收获颇多 |
总结和可优化的地方
这一整个过程还是挺久的,一大部分代码,一些特殊功能的交互还有一些工具的使用ai都发挥了巨大作用,一些逻辑上的问题和具体的框架它还是一眼就看出来了,比如背景的渲染次序问题,有些时候还是震惊它功能的强大,大部分用的chatgpt,也安装了copilot功能也挺强大,提升了效率,但是有些地方还是无法完全理解我的需求,需要强调好几次,才能得到正确的反馈。还有许多可以优化的地方,可以加一些背景音,然后黄圈的渲染规则对于不规则形状的,随机错位的逻辑,关卡和关卡之间的过渡等等优化点,可以进一步完善。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步