软工第二次个人作业
软工第二次个人作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2024 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253 |
这个作业的目标 | 使用Python编写一个“羊了个羊”风格的消除类小游戏 |
学号 | 102202106 |
一.使用AICG工具生成需要图片
AICG工具:豆包AI
美工图片展示
二.任务规划
1.任务一
构思游戏功能,设计两个难度模式,设计游戏主菜单
2.任务二
设计游戏主体,实现图案的生成与分层摆放,确保图案能够被合理匹配和消除,实现三个相同图像消除
3.任务三
设置计时器,需要在规定时间内消除所有图像
4.任务四
设置计分器,每消除3个图像则积1分
三.游戏展示
1.静态展示
主页面
游戏主体
游戏胜利
游戏失败
2.动态展示
选择难度模式
游戏主要部分
四.项目介绍
实现思路
- 初始化设置
导入库:导入pgzrun、pygame和random库。
常量定义:定义倒计时、窗口尺寸、牌的尺寸等常量。
初始化pygame:初始化pygame并设置定时器事件。
全局变量:定义游戏状态、计分、鼠标位置等全局变量。 - 游戏初始化函数initialize_game()
重置游戏状态:重置牌组、牌堆、分数、游戏结束标志和倒计时。
生成牌组:根据难度模式生成不同数量的牌,并随机打乱。
设置牌的位置和状态:根据层数和难度模式设置牌的位置和状态。
设置定时器:每秒触发一次定时器事件,用于倒计时。 - 游戏更新函数update(dt)
更新鼠标位置:获取当前鼠标位置。
更新倒计时:如果游戏开始且未结束,减少倒计时。如果时间用完,设置游戏结束标志并调用game_over()函数。 - 游戏结束函数game_over()
显示结束画面:在屏幕上显示结束画面。 - 绘制函数
绘制倒计时draw_time():在屏幕上显示剩余时间。
绘制分数draw_score():在屏幕上显示当前分数。
主绘制函数draw():
清屏并绘制背景。
如果游戏未开始,绘制标题和难度选择按钮。
如果游戏开始,绘制牌组和牌堆,并根据游戏状态显示胜利或失败画面。
绘制倒计时和分数。 - 鼠标点击响应函数on_mouse_down(pos)
难度选择:如果游戏未开始,根据点击位置选择难度并初始化游戏。
牌组交互:如果游戏开始,处理牌组的点击事件,更新牌的状态和位置,计算分数。
前端设计
前端设计主要包括以下几个部分:
1.游戏界面布局:
游戏标题和背景图像。
低难度和高难度按钮。
游戏进行中的牌组和牌堆。
倒计时和分数显示。
2.界面元素:
标题:在游戏未开始时显示。
按钮:用于选择游戏难度,分别为“Easy”和“Hard”。
牌组:上方的所有牌,按层级排列。
牌堆:下方的牌堆,玩家点击牌后移动到这里。
倒计时:显示剩余时间。
分数:显示当前得分。
3.交互设计:
鼠标点击事件:用于选择难度和点击牌。
倒计时事件:每秒触发一次,更新剩余时间。
游戏结束条件:时间用完或牌堆超过7张。
4.绘制逻辑:
draw()函数负责绘制所有界面元素。
draw_time()和draw_score()分别负责绘制倒计时和分数。
on_mouse_down()函数处理鼠标点击事件,更新游戏状态。
5.游戏状态管理:
game_started:游戏是否开始。
easy_mode:是否为低难度模式。
game_over_flag:游戏是否结束。
score:当前得分。
time_left:剩余时间。
技术与算法
技术分析
1.Pygame:
用于处理游戏的图形界面、事件和定时器。
pygame.init() 初始化 Pygame。
pygame.time.set_timer() 设置定时器事件。
2.Pygame Zero (pgzrun):
用于简化 Pygame 的使用,特别是游戏循环和绘制。
pgzrun.go() 启动游戏循环。
3.随机数生成:
random.shuffle() 用于随机打乱牌组。
4.全局变量:
用于存储游戏状态、计分、倒计时等信息。
算法分析
1.初始化游戏:
initialize_game() 函数初始化游戏状态,包括牌组、牌堆、分数和倒计时。
根据难度模式生成不同数量的牌,并随机打乱。
设置牌的位置和状态,最顶层的牌可点击,其他牌不可点击。
2.更新游戏状态:
update(dt) 函数每帧调用一次,用于更新倒计时和游戏状态。
如果倒计时结束,设置游戏结束标志并调用 game_over() 函数。
3.绘制游戏界面:
draw() 函数每帧调用一次,用于绘制游戏界面。
根据游戏状态绘制不同的界面元素,包括背景、牌组、牌堆、倒计时和分数。
如果游戏未开始,绘制标题和难度选择按钮。
如果游戏开始,绘制牌组和牌堆,并根据游戏状态显示胜利或失败画面。
4.鼠标点击响应:
on_mouse_down(pos) 函数处理鼠标点击事件。
如果游戏未开始,根据点击位置选择难度并初始化游戏。
如果游戏开始,处理牌组的点击事件,更新牌的状态和位置,计算分数。
逆序循环遍历牌组,优先处理上方的牌,避免重复判定。
如果点击的牌可点击,更新其状态并从牌组中移除。
如果牌堆中相同的牌数量少于2,添加到牌堆;否则,消除相同的牌并计分。
更新被覆盖牌的状态,如果没有其他牌覆盖,设置为可点击。
5.游戏结束:
game_over() 函数显示游戏结束画面。
如果牌堆中牌的数量超过7张或没有剩余牌,显示失败或胜利画面。
监测用例
1.setUp 和 tearDown 方法:
setUp 方法在每个测试用例运行之前调用,用于初始化游戏。
tearDown 方法在每个测试用例运行之后调用,用于清理资源。
2.test_initialize_game 方法:
测试游戏初始化是否正确,包括牌组数量、牌堆数量、分数、游戏结束标志和倒计时。
3.test_update 方法:
使用 patch 装饰器模拟 pygame.time.get_ticks 方法,测试倒计时功能是否正常。
4.test_on_mouse_down_easy_mode 和 test_on_mouse_down_hard_mode 方法:
使用 patch 装饰器模拟 pygame.mouse.get_pos 方法,测试鼠标点击事件是否正确处理,分别测试低难度和高难度模式。
5.test_game_over 方法:
测试游戏结束条件是否正确
游戏评价
这个游戏的代码实现了一个简单的牌类游戏,整体结构清晰,功能完整。以下是对该代码的详细评价:
优点
-
结构清晰:
- 代码分为多个函数,每个函数负责特定的功能,如初始化游戏、更新游戏状态、绘制界面、处理鼠标点击等。
- 使用全局变量来管理游戏状态,便于在不同函数之间共享数据。
-
功能完整:
- 实现了游戏的基本功能,包括初始化、倒计时、鼠标点击响应、游戏结束判定等。
- 支持两种难度模式(低难度和高难度),增加了游戏的可玩性。
-
界面绘制:
- 使用 Pygame Zero 简化了界面绘制和事件处理。
- 绘制了游戏的背景、牌组、牌堆、倒计时和分数,界面元素丰富。
-
注释详细:
- 代码中有详细的注释,解释了每个部分的功能和实现细节,便于理解和维护。
改进
-
代码复用:
- 可以将一些重复的代码提取到独立的函数中,提高代码的复用性和可读性。例如,绘制按钮的代码可以提取到一个函数中。
-
测试覆盖:
- 可以编写更多的单元测试用例,覆盖更多的功能和边界情况,确保代码的正确性和稳定性。
-
用户体验:
- 可以添加更多的用户反馈,例如点击牌时的音效、游戏结束时的提示等,提升用户体验。
AIGC表格
子任务 | 借助的AIGC工具 | 实现的功能 | 效果 |
---|---|---|---|
生成图像资源 | 豆包 | 生成各种需要的图像资源,满足美工需要 | 使得游戏界面更加美观流畅,提高视觉吸引力,吸引玩家的兴趣 |
图层的堆叠 | Github Copilot | 实现多图层的堆叠放置,正确地将图像放置在游戏界面中 | 并未很好地实现预期效果,经过个人地修改后得到了不错地效果 |
游戏不同难度模式的开发 | Github Copilot | 在完成困难模式的编写后使用AIGC工具模仿后生成简单模式的代码部分 | 得到较好的效果,符合预期,实现了两种的难度模式 |
游戏倒计时的功能 | Github Copilot | 在游戏开始时进行倒计时,倒计时结束仍未完成游戏任务判定为游戏失败 | 开始时效果不佳,设置计时器后倒计时未开始,经过多次调试,得到较好的效果 |
五.体验与过程
AIGC的优点
- 提高生产力
自动化重复任务:AIGC可以自动生成代码、文档和测试用例,减少开发人员的重复劳动。
快速原型设计:可以快速生成原型代码,帮助开发人员更快地验证和迭代设计思路。
代码补全和建议:在编写代码时,AIGC可以提供实时的代码补全和优化建议,提高编码效率。 - 提升代码质量
自动生成测试用例:AIGC可以根据代码自动生成单元测试和集成测试,提高代码的覆盖率和可靠性。
代码审查和优化:可以自动审查代码,发现潜在的错误和性能问题,并提供优化建议。
一致性和规范性:通过自动生成代码,可以确保代码风格和规范的一致性,减少人为错误。 - 创新和探索
新思路和创意:AIGC可以提供新的思路和创意,帮助开发人员探索不同的解决方案和设计模式。
跨领域应用:可以将AIGC应用于不同领域,如游戏开发、数据分析、自然语言处理等,推动跨领域的创新和发展。 - 降低成本
减少人力成本:通过自动化生成内容,可以减少对人力资源的依赖,降低开发成本。
提高效率:通过提高生产力和代码质量,可以缩短开发周期,降低项目成本。
AIGC的缺点
- 质量和准确性
错误和漏洞:AIGC生成的代码可能包含错误和漏洞,尤其是在复杂的逻辑和边界情况下。
代码质量不一致:生成的代码质量可能不一致,有时可能需要手动调整和优化。 - 依赖性
过度依赖:开发人员可能过度依赖AIGC,导致自身技能的退化和对工具的过度依赖。
工具限制:AIGC工具可能有其自身的限制和局限性,不能完全替代人类的创造力和判断力。 - 创造力和独特性
缺乏创造力:AIGC生成的内容可能缺乏创造力和独特性,难以满足特定需求。
模板化:生成的内容可能过于模板化,缺乏个性化和创新性。
学习内容与收获
学习内容 | 收获 |
---|---|
Pygame 和 Pygame Zero | 学习了如何使用 Pygame 和 Pygame Zero 创建游戏,包括初始化、事件处理和绘制界面。 |
游戏初始化 | 了解了如何初始化游戏状态,包括牌组、牌堆、分数和倒计时。 |
倒计时功能 | 学习了如何使用 Pygame 的定时器事件实现倒计时功能。 |
鼠标点击事件处理 | 学习了如何处理鼠标点击事件,包括判断点击位置和更新游戏状态。 |
游戏状态管理 | 了解了如何使用全局变量管理游戏状态,如游戏是否开始、是否结束、当前分数等。 |
界面绘制 | 学习了如何使用 Pygame Zero 绘制游戏界面,包括背景、牌组、牌堆、倒计时和分数。 |
游戏结束判定 | 了解了如何判定游戏结束条件,并在游戏结束时显示相应的画面。 |
代码优化 | 学习了如何优化代码结构,提高代码的可读性和复用性。 |
单元测试 | 了解了如何使用 unittest 编写单元测试用例,确保代码的正确性和稳定性。 |
AIGC 的优缺点 | 学习了使用 AIGC 的优点和缺点,了解了如何合理使用 AIGC 提高生产力和代码质量。 |
PSP表格
PSP阶段 | 预估时间(分钟) | 实际时间(分钟) | 备注 |
---|---|---|---|
计划 | 30 | 40 | 确定项目目标和需求,制定开发计划。 |
开发 | 380 | 425 | |
需求分析 | 30 | 30 | 设计游戏的整体架构和各个模块的实现方案。 |
设计 | 50 | 60 | 设计游戏的整体架构和各个模块的实现方案。 |
实现 | 240 | 280 | 编写游戏代码,包括初始化、事件处理、界面绘制等。 |
代码复审 | 30 | 25 | 复审代码,确保代码质量和规范性。 |
测试 | 30 | 30 | 编写和执行单元测试,确保代码的正确性和稳定性。 |
报告 | 45 | 55 | |
编写文档 | 30 | 35 | 编写项目文档,包括代码注释、使用说明等。 |
经验总结 | 15 | 20 | 总结项目经验,记录心得体会和改进建议。 |
总计 | 455 | 520 |
六.个人总结
体会与心得
1.技术方面
- 事件处理:学会了如何处理鼠标点击事件,包括判断点击位置和更新游戏状态。了解了如何通过逆序循环遍历牌组,优先处理上方的牌,避免重复判定。
- 界面绘制:学会了如何使用 Pygame Zero 绘制游戏界面,包括牌组、牌堆、倒计时和分数。
- 游戏逻辑:学会了如何通过消除相同的牌来计分,并更新牌的状态。
- 错误处理:认识到在实际项目中,添加错误处理机制的重要性,以提高代码的健壮性。
2.使用AIGC的体验
-
提高生产力:使用AIGC工具可以快速生成代码、测试用例,显著提高了开发效率。
-
代码质量:AIGC生成的代码质量较高,但仍需手动调整和优化,以确保代码的正确性,可用性和可读性。
-
知识学习:使用AIGC工具提供的即时帮助和指导,帮助我快速解决问题,提升了学习效率。
个人总结
通过开发羊了个羊小游戏这个项目,我学到了许多技术知识,提升了代码编写、优化和测试的能力。同时,在使用AIGC工具的过程中,我体验认识到其在提高生产力和代码质量方面的能力与潜力。在项目开发时,运用AIGC工具可以很好地提高效率,缩短开发时间成本。我将继续探索和应用这些技术,不断提升自己的编程技能和项目开发能力。