这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2024 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253 |
这个作业的目标 | 开发"羊了个羊"类消除类小游戏,合理运用 AIGC 工具提高效率 |
学号 | 102201225 |
项目展示:LET'S DESSERT! -- 一款简单轻松的消除类游戏
GitHub仓库链接:cbhhhhhh/homework2_LET_S_DESSERT at master (github.com)
写在前面
上课教加减法 作业布置微积分。从没自己做出一个完整的游戏,更没有两天内极限做出一个至少功能是完整的的游戏😭😭两天无数次利用AI实现预期功能,使用下来真的感慨只要掌握逻辑和框架,其他功能AI都可以来解决。无经验纯小白处女作。。各位老师助教手下留情😽😽
两天内最大感慨:
🍰 项目介绍与展示
🍩 游戏介绍
这是一款轻松简单的像素甜品风消除类小游戏,玩家在轻快音乐的伴随下,在甜品店环境下对美食进行消除。整个画风甜美温馨,难度适中,欢迎在闲暇时刻来甜品店消除一下~
🍩 游戏规则
1. 游戏进入主界面时,画面中随机生成3层依次遮挡的美食卡牌,每种卡牌的总数为3的整数倍。
2. 玩家通过点击选择三个卡牌进行匹配,无遮挡的卡牌可以被选中并标黄。如果连续选择三个相同卡牌,则被消除;若匹配失败则取消选择,允许玩家重新选择图案;游戏会不断检查剩余图案数量,当所有图案被成功消除时,玩家获胜。
3. 设置重排机制,根据难度设置一定数目的重排机会。玩家点击重排按钮后,画面中剩余的卡牌会重新随机排放,同时更新遮挡状态,丰富玩家游戏体验。
4. 设置倒计时机制,玩家需要在时间内完成所有图案的匹配消除,时间结束时游戏失败;玩家可以选择重新开始或退出游戏。
5. 设置难度选择机制,玩家可以根据需要选择难度,难度根据倒计时长短和重排次数进行设定。
6. 设置排行榜机制,成功完成消除后会记录完成时长,完成时长最少的前5次会被记录在排行榜当中。
🍩 游戏主菜单和难度选择
- 设计思想:因为我最近沉迷星露谷,本来是想把星露谷的主要村民头像为素材来制作游戏,但是考虑版权原因,我只保留了像素风风格,同时觉得千禧风格和甜品咖啡这样的元素很贴像素风,因此整合成了这样一个看起来有点古早的像素甜品店的感觉。因此整体风格是比较甜美复古的,以暖色调为主。
- 背景音乐:游戏全程始终导入一个非常非常非常肥肠贴切的音乐,咖啡店风格的。
- 主菜单包括游戏名称 “LET'S DESSERT!” 以及三个跳转窗口,其中玩家点击"GO!"则进入难度选择界面,“rank”进入排行榜,“BYE!”则退出游戏。
- 难度选择:该界面包括“easy”和"difficult"两个难度选择。
🍩 游戏界面
- 游戏界面左上角是倒计时,左下角的“Refresh
”指的是重排机会剩余次数,点击可以进行卡牌重新排列。右下角“exit”可以返回主菜单,“stop”可以暂停游戏,同时暂停倒计时。 - 设计思想:背景选择粉色花边,游戏界面因为像素美食堆砌可能看起来有些繁杂,但是正好贴合了我想做千禧年的那种极繁主义风格。
🍩 结束界面
- 结束界面包括成功和失败两种界面
- 同时设计back键,点击可以回到主界面
🍩 排行榜
- 排行榜会记录成功消除的情况下,消除时长最短的前5次游戏时长并进行排序
- 设置清空"clear"键和返回“back”键,清空可以清空当前的所有记录时长,back可以回到主界面
🍩 实机演示视频
🍩 素材来源
字体来源:[Selection - Google Fonts](https://fonts.google.com/selection?preview.text=LET'S DESSRT&query=pixel)
卡牌素材来源:Free Pixel foods by ghostpixxells (itch.io)
背景音乐来源:【Starbucks & Jazz】咖啡的香味沁人心脾~☕️星巴克咖啡店音乐 | Relaxing Background Music_哔哩哔哩_bilibili
背景来源于免费网站,所有素材经确认均无侵权嫌疑
💻 技术与算法实现
🎯 技术实现
- 游戏逻辑:使用Python编写游戏逻辑,通过Pygame库管理游戏的渲染和事件处理。实现了游戏的核心功能,包括卡牌排列、重排与匹配、分数统计和游戏状态管理。
- 算法设计:采用随机生成算法保证游戏中的卡片布局,同时确保每种类型的卡片数量为3的倍数,以便实现匹配功能。算法中加入了检查机制,以防止生成的卡片数量与游戏网格不匹配的问题。
🎯 卡牌三层偏移随机排列算法
- 算法描述:游戏中需要展示三层卡牌,每层卡牌的排列是随机的,且每种卡牌的数量要满足一定的规则。算法的核心目标是确保每层卡牌的排列不仅是随机的,同时每层按照一定偏移量排列,形成遮挡效果
- 实现步骤
- 加载卡牌图案:
load_patterns()
-从文件中加载卡牌图案并调整其尺寸。 - 生成每层的卡牌图案:
generate_layer_patterns()
-计算每种图案需要出现的数量,确保数量是3的倍数,使用random.shuffle()
打乱图案的顺序,以创建随机排列。 - 创建单层卡牌:
create_layer()
-根据给定的偏移量和排列,生成一层的卡牌。 - 生成所有层的卡牌:
generate_layers()
-调用generate_layer_patterns()
为每层生成随机排列的卡牌,根据每层的偏移量调用create_layer()
生成具体的卡牌层次,为所有层生成卡牌,并设置偏移量以实现遮挡效果。
- 加载卡牌图案:
- 相关代码
🎯 卡牌刷新重排算法
- 算法描述:玩家通过点击按钮对剩余图案进行重新排列,从而为玩家提供新的游戏机会。重排列的核心目标是确保图案在重新排列后依然满足游戏规则,即可以消除的图案仍然可以正确识别,且图案的遮挡状态得到更新。
- 实现步骤
- 收集所有剩余的图案:
shuffle_tiles()
-遍历所有层,收集所有未被选中的图案及其位置(tile
和rect
),保存到remaining_tiles
列表中,随机打乱列表中的图案顺序准备重排。 - 重新分配图案:
shuffle_tiles()
-遍历每一层,对每个位置的图案进行更新。从remaining_tiles
列表中取出一个图案,将其分配到当前层的相应位置。 - 更新遮挡状态:
update_blocking_status()
-遍历每一层中的每个图案,检查是否被上层的图案遮挡并更新遮挡状态。 - 处理重排按钮点击:
draw_rearrange_button()
-绘制重排按钮,并在按钮上显示剩余的重排次数。在游戏逻辑中检测到重排按钮的点击事件后,调用shuffle_tiles()
函数进行图案重排。
- 收集所有剩余的图案:
- 相关代码
🎯 卡牌消除算法
- 算法描述:设置遮挡后,需要每次更新遮挡状态,检查卡牌是否符合消除条件。处理卡牌点击事件,清除已消除的图案,并最终确定游戏是否胜利。
- 实现步骤
- 检查遮挡状态:
is_blocked()
-遍历当前图案上方的所有层,检查上层每个图案的矩形是否与当前图案的矩形重叠。 - 更新图案的遮挡状态:
check_match()
-遍历每个图案,检查其是否被上层图案遮挡,根据遮挡状态更新图案状态。 - 检查选中的图案是否符合消除条件:
check_match()
-确保选中图案的数量为 3,检查这三个图案是否相同,且未被遮挡,如果符合条件,则移除这些图案并更新图层。 - 检查并清除层中的空图案:
check_and_clear_layers()
-遍历每一层,移除已消除的图案,清除图层中空图案的位置,更新遮挡状态。 - 处理鼠标点击事件:
handle_click()
-从最上层到最下层遍历图案,找到被点击且未被选中的图案。检查该图案是否被遮挡,将图案标记为已选中,并将其添加到选中列表中,检查是否可以消除选中的图案。
- 检查遮挡状态:
- 相关代码
📊 测试样例与结果
🔎 测试代码
🔎 测试结果
运行没有问题,这表明 game_screen.py
文件即核心游戏玩法的功能运行是正常的。
🔎 其他测试反馈
实际操作中对其他性能也进行测试,反馈如下:
-
功能测试:所有核心功能运行正常,没有发现重大Bug,重排机制也没有很大问题,排行榜能够正确计入最短时长完成游戏的前5名。
-
用户体验测试:玩家反馈游戏界面简洁明了,操作直观,倒计时器和随时的退出暂停功能的设计得到了好评。
💡 AIGC使用感想
🚩 AIGC表格
子任务 | 借助何种AIGC技术 | 实现了什么功能 | 效果如何? |
---|---|---|---|
游戏逻辑设计 | AIGC代码生成(GitHub Copilot) | 生成游戏的基本逻辑代码,如图像匹配、计分系统等。并辅助实现了核心功能例如重排机制,遮挡机制 | 提高了开发效率,减少了编码时间,但需要手动检查和调整生成代码的正确性 |
图像生成处理 | AIGC图像生成(DALL·E) | 创建了游戏当中的部分背景和图标 | 有一定的成效,但是与整体风格不是很协调 |
游戏测试调试 | AIGC代码分析(ChatGPT-4o) | 自动检测代码中的潜在错误和性能问题,帮助我调试代码并修改我无法解决的bug | 提高了开发效率,减少了编码时间,但需要手动检查和调整生成代码的正确性 |
游戏功能优化 | AIGC代码生成(ChatGPT-4o) | 提供游戏优化的建议和改进方案 | 提供了有用的优化建议,但最终的实施和验证还需要开发者的判断和调整 |
🚩 AIGC优点分析
- AIGC可以帮助我快速创建游戏的基本框架和逻辑,找到游戏基本思路,然后方便我在这个框架上进行其他功能的添加。
- AIGC能够生成游戏的基本逻辑代码,如图像匹配、计分系统等。并辅助实现了核心功能例如重排机制,遮挡机制,减少很大的工作量。
- AIGC能够辅助我调试代码,并找到其中的bug并且修改。
🚩 AIGC缺点分析
- AIGC生成图像效果一般,格式化严重,对于特殊风格的需求满足性不大。
- AIGC可能不完全理解游戏的具体需求和上下文,导致生成的代码可能不符合实际需求。
📃 PSP表格与任务分解
在项目开发过程中,我使用PSP表格对任务进行了详细的分解,并记录了时间预估与实际耗时。以下是对个人作业完成过程的评价:
任务 | 时间预估 | 实际耗时 | 评价 |
---|---|---|---|
环境配置 | 30min | 2h | 环境配置耗时过长,不明确安装路径,网好差 |
需求分析 | 2h | 2h | 需求分析准确,理解了应当实现什么功能 |
设计与实现 | 8h | 10h | 一开始对于项目实现还很难上手,后面慢慢熟悉 |
测试与优化 | 6h | 10h | 后续实现了很多新的功能,并修复了BUG,耗时较长 |
文档编写与总结 | 1.5h | 3h | 文档需求丰富编写详细,超出时间预估。 |
😼个人过程性评价
- 时间把握不准确,又成为ddl战神了
- 学会了如何使用Pygame创建游戏界面、处理用户输入和绘制图形。
- 提高了 Python 编程能力,尤其是在游戏开发中的应用。
- 项目总体完整,功能实现符合预期。其中核心玩法的补充如重排机制以及分数系统、倒计时机制等附加功能如预期实现。
- 但是在某些核心功能上,比如遮挡功能一开始设计想法过于复杂,使得游戏可玩性差。
- 美工不错,选择的风格符合个人预期。素材选取贴合整体风格,同时有贴合的bgm等设计。