这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253
这个作业的目标 开发"羊了个羊"类消除类小游戏,合理运用 AIGC 工具提高效率
学号 102201125

项目介绍:基于 Pygame 的“daydaymayday”游戏

github仓库

https://github.com/huos1/daydaymayday


前端设计与特色功能

在本项目中,实现了一个基于 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功能也挺强大,提升了效率,但是有些地方还是无法完全理解我的需求,需要强调好几次,才能得到正确的反馈。还有许多可以优化的地方,可以加一些背景音,然后黄圈的渲染规则对于不规则形状的,随机错位的逻辑,关卡和关卡之间的过渡等等优化点,可以进一步完善。

posted on   huos1  阅读(76)  评论(0编辑  收藏  举报



点击右上角即可分享
微信分享提示