软工第二次个人作业

软工第二次个人作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253
这个作业的目标 使用Python编写一个“羊了个羊”风格的消除类小游戏
学号 102202106

Github仓库

一.使用AICG工具生成需要图片

AICG工具:豆包AI

美工图片展示


二.任务规划

1.任务一

构思游戏功能,设计两个难度模式,设计游戏主菜单

2.任务二

设计游戏主体,实现图案的生成与分层摆放,确保图案能够被合理匹配和消除,实现三个相同图像消除

3.任务三

设置计时器,需要在规定时间内消除所有图像

4.任务四

设置计分器,每消除3个图像则积1分

三.游戏展示

1.静态展示

主页面

游戏主体

游戏胜利

游戏失败

2.动态展示

选择难度模式

游戏主要部分

四.项目介绍

实现思路

  1. 初始化设置
    导入库:导入pgzrun、pygame和random库。
    常量定义:定义倒计时、窗口尺寸、牌的尺寸等常量。
    初始化pygame:初始化pygame并设置定时器事件。
    全局变量:定义游戏状态、计分、鼠标位置等全局变量。
  2. 游戏初始化函数initialize_game()
    重置游戏状态:重置牌组、牌堆、分数、游戏结束标志和倒计时。
    生成牌组:根据难度模式生成不同数量的牌,并随机打乱。
    设置牌的位置和状态:根据层数和难度模式设置牌的位置和状态。
    设置定时器:每秒触发一次定时器事件,用于倒计时。
  3. 游戏更新函数update(dt)
    更新鼠标位置:获取当前鼠标位置。
    更新倒计时:如果游戏开始且未结束,减少倒计时。如果时间用完,设置游戏结束标志并调用game_over()函数。
  4. 游戏结束函数game_over()
    显示结束画面:在屏幕上显示结束画面。
  5. 绘制函数
    绘制倒计时draw_time():在屏幕上显示剩余时间。
    绘制分数draw_score():在屏幕上显示当前分数。
    主绘制函数draw():
    清屏并绘制背景。
    如果游戏未开始,绘制标题和难度选择按钮。
    如果游戏开始,绘制牌组和牌堆,并根据游戏状态显示胜利或失败画面。
    绘制倒计时和分数。
  6. 鼠标点击响应函数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 方法:

测试游戏结束条件是否正确

游戏评价

这个游戏的代码实现了一个简单的牌类游戏,整体结构清晰,功能完整。以下是对该代码的详细评价:

优点

  1. 结构清晰:

    • 代码分为多个函数,每个函数负责特定的功能,如初始化游戏、更新游戏状态、绘制界面、处理鼠标点击等。
    • 使用全局变量来管理游戏状态,便于在不同函数之间共享数据。
  2. 功能完整:

    • 实现了游戏的基本功能,包括初始化、倒计时、鼠标点击响应、游戏结束判定等。
    • 支持两种难度模式(低难度和高难度),增加了游戏的可玩性。
  3. 界面绘制:

    • 使用 Pygame Zero 简化了界面绘制和事件处理。
    • 绘制了游戏的背景、牌组、牌堆、倒计时和分数,界面元素丰富。
  4. 注释详细:

    • 代码中有详细的注释,解释了每个部分的功能和实现细节,便于理解和维护。

改进

  1. 代码复用:

    • 可以将一些重复的代码提取到独立的函数中,提高代码的复用性和可读性。例如,绘制按钮的代码可以提取到一个函数中。
  2. 测试覆盖:

    • 可以编写更多的单元测试用例,覆盖更多的功能和边界情况,确保代码的正确性和稳定性。
  3. 用户体验:

    • 可以添加更多的用户反馈,例如点击牌时的音效、游戏结束时的提示等,提升用户体验。

AIGC表格

子任务 借助的AIGC工具 实现的功能 效果
生成图像资源 豆包 生成各种需要的图像资源,满足美工需要 使得游戏界面更加美观流畅,提高视觉吸引力,吸引玩家的兴趣
图层的堆叠 Github Copilot 实现多图层的堆叠放置,正确地将图像放置在游戏界面中 并未很好地实现预期效果,经过个人地修改后得到了不错地效果
游戏不同难度模式的开发 Github Copilot 在完成困难模式的编写后使用AIGC工具模仿后生成简单模式的代码部分 得到较好的效果,符合预期,实现了两种的难度模式
游戏倒计时的功能 Github Copilot 在游戏开始时进行倒计时,倒计时结束仍未完成游戏任务判定为游戏失败 开始时效果不佳,设置计时器后倒计时未开始,经过多次调试,得到较好的效果

五.体验与过程

AIGC的优点

  1. 提高生产力
    自动化重复任务:AIGC可以自动生成代码、文档和测试用例,减少开发人员的重复劳动。
    快速原型设计:可以快速生成原型代码,帮助开发人员更快地验证和迭代设计思路。
    代码补全和建议:在编写代码时,AIGC可以提供实时的代码补全和优化建议,提高编码效率。
  2. 提升代码质量
    自动生成测试用例:AIGC可以根据代码自动生成单元测试和集成测试,提高代码的覆盖率和可靠性。
    代码审查和优化:可以自动审查代码,发现潜在的错误和性能问题,并提供优化建议。
    一致性和规范性:通过自动生成代码,可以确保代码风格和规范的一致性,减少人为错误。
  3. 创新和探索
    新思路和创意:AIGC可以提供新的思路和创意,帮助开发人员探索不同的解决方案和设计模式。
    跨领域应用:可以将AIGC应用于不同领域,如游戏开发、数据分析、自然语言处理等,推动跨领域的创新和发展。
  4. 降低成本
    减少人力成本:通过自动化生成内容,可以减少对人力资源的依赖,降低开发成本。
    提高效率:通过提高生产力和代码质量,可以缩短开发周期,降低项目成本。

AIGC的缺点

  1. 质量和准确性
    错误和漏洞:AIGC生成的代码可能包含错误和漏洞,尤其是在复杂的逻辑和边界情况下。
    代码质量不一致:生成的代码质量可能不一致,有时可能需要手动调整和优化。
  2. 依赖性
    过度依赖:开发人员可能过度依赖AIGC,导致自身技能的退化和对工具的过度依赖。
    工具限制:AIGC工具可能有其自身的限制和局限性,不能完全替代人类的创造力和判断力。
  3. 创造力和独特性
    缺乏创造力: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工具可以很好地提高效率,缩短开发时间成本。我将继续探索和应用这些技术,不断提升自己的编程技能和项目开发能力。

posted @ 2024-10-12 17:23  KaiInssy  阅读(28)  评论(0编辑  收藏  举报