2024秋软件工程个人作业(第二次)
软件工程 | 班级链接:https://edu.cnblogs.com/campus/fzu/SE2024 |
---|---|
作业要求链接 | https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253 |
作业目标 | 使用 Python 开发"羊了个羊"风格的消除类小游戏,合理运用 AIGC 工具提高开发效率;使用文生图工具实现图片设计等工作。 |
学号 | 102201313 |
项目背景
随着人工智能生成内容(AIGC)技术的迅速发展,游戏开发的效率和成本显著降低,使得类似小游戏的开发变得更加高效和经济。本项目旨在基于基本的模块消除机制,通过 Python 开发及 GitHub Copilot、文生图等工具的合理利用,达到项目需求性与界面友好性的统一。
项目代码已上传至 Github 仓库,链接如下:
项目介绍+项目展示
本项目分为四个主要模块:主界面、游戏界面、获胜界面和失败界面,流程图如下:
游戏逻辑概述
1、在游戏开始时,生成图案遵循成对出现与随机摆放的原则,以确保玩家能够合理匹配相同图案并进行消除。
2、玩家通过点击选择三个图案进行匹配,如果三个图案相同,则这三个图案被消除;若匹配失败则取消选择,允许玩家重新选择图案;游戏会不断检查剩余图案数量,当所有图案被成功消除时,玩家获胜。
3、设置倒计时机制,玩家需要在时间内完成所有图案的匹配消除,时间结束时游戏失败;玩家可以选择重新开始或退出游戏。
4、每次获胜后,进入下一关时限制时间将减少10秒(至多减少50秒),以增加游戏的挑战性。
主界面
主界面demo:
界面介绍:
1、主界面的背景由一个 GIF 动画组成,这个动画通过 Pillow 库加载并在 Pygame 中播放。背景动画在主界面中循环显示,使界面更加生动有趣。
2、使用粉色字体显示游戏标题“消除类小游戏”。标题下方是游戏说明,包括游戏的基本规则和玩法。说明内容包括倒计时时间、消除规则以及游戏胜利和失败的条件。这些信息帮助玩家快速了解游戏的基本玩法。
3、在主界面的中央部分,显示"按任意键开始游戏"的提示,玩家可以通过按下任何键来进入游戏。
游戏界面
游戏界面demo:
游戏界面是游戏的核心部分,玩家在这里进行实际的消除操作。界面介绍:
1、游戏板是一个 6x6 的网格,每个网格内包含一个图案。图案通过 pygame.image.load
加载,并在游戏板上随机分布。每次游戏开始时,游戏板都会重新创建,确保图案的随机性。
2、玩家通过点击三个相同的图案进行消除。点击操作会添加到 selected
列表中,当选择了三个图案后,调用 check_match
函数检查是否匹配。如果匹配成功,这三个图案会被设为 None
(图案变为灰白),并且玩家得分增加 10 分。
3、游戏界面上方显示当前得分和剩余时间。倒计时时间会根据游戏的进行而减少,游戏开始时为 120 秒,每次胜利后会减少 10 秒,但关卡初始倒计时不会低于 70 秒。得分随着消除操作不断增加。
4、游戏判断的条件是:如果所有的图案都被消除,则游戏胜利;如果倒计时时间归零,则游戏失败。在这些情况下,分别调用 victory_screen
和 game_over_screen
函数显示相应的结果画面。
获胜界面
获胜界面demo:
当玩家成功完成当前关卡时,游戏会显示获胜界面。界面介绍:
1、显示恭喜通过本关!的提示,使用粉色字体使其突出显示。
2、展示玩家在这一关的得分和所用时间,帮助玩家了解自己的表现。
3、玩家可以按任意键继续游戏,进入下一个难度提升的关卡。
失败界面
失败界面demo:
当玩家的倒计时时间归零时,游戏会显示失败界面。界面介绍:
1、显示超时,游戏失败(′⌒`)的提示,使用红色字体使其突出显示。
2、展示玩家在这一关的得分和所用时间,帮助玩家了解自己的表现。
3、玩家可以按任意键重新开始本难度的关卡。
附加功能
由上文可知,在实现基于基础模块消除机制的项目时,附加功能设计如下:
1、玩家每次成功消除三个相同图案时,将获得10分奖励。每一关开始时,分数将自动清零,确保每关的分数独立计算。
2、游戏初始时倒计时为120秒,每次获胜后,倒计时时间减少10秒,最低倒计时不会低于70秒。玩家需在规定时间内完成所有图案的匹配消除,若时间耗尽则游戏失败。失败时,玩家可选择重新开始或退出游戏。
项目细节
1、GIF 动画帧处理
在游戏主菜单和背景中,通过 PIL 库处理 GIF 图像。Pillow 提供了一个简便的接口来逐帧读取 GIF 文件中的图像帧,接着使用 pygame.image.fromstring()
将这些帧转换为可以在 Pygame 中渲染的格式。帧的切换通过设置延迟 (gif_frame_delay)
来实现,以形成平滑的动画效果。
相关代码段:
#对主界面GIF动画帧进行处理
def load_gif_frames(gif_path):
gif=Image.open(gif_path)
frames=[]
try:
while True:
frame=gif.copy().convert("RGBA")
frames.append(pygame.image.fromstring(frame.tobytes(),frame.size,frame.mode))
gif.seek(gif.tell()+1)
except EOFError:
pass
return frames
2、匹配检测算法
游戏的核心算法是匹配检测。玩家选择三个相同图案的方块,如果这三个图案相同,则会消除这些方块并获得分数。匹配检测通过检查 selected 列表中的三个方块是否具有相同的图案来实现。
相关代码段:
#分数系统
def check_match():
global score #使用全局变量更新分数
if len(selected)==3:
r1,c1=selected[0]
r2,c2=selected[1]
r3,c3=selected[2]
if board[r1][c1]==board[r2][c2]==board[r3][c3]:
board[r1][c1]=None
board[r2][c2]=None
board[r3][c3]=None
score+=10 #每消除三个相同的图案 则加10分
selected.clear()
3、文字绘制及信息实时更新
使用 Pygame 提供的字体对象,通过 font.render()
方法将文字绘制在屏幕上。游戏界面的分数、倒计时信息均通过这一机制实现实时更新。
相关代码段:
#对文字区进行处理
def draw_text(text,font,color,surface,x,y):
textobj=font.render(text,True,color)
textrect=textobj.get_rect()
textrect.center=(x,y)
surface.blit(textobj,textrect)
4、通过倒计时提升游戏难度
游戏的难度随着每局的胜利而提升,具体表现为倒计时减少。游戏开始时的倒计时是 120 秒,每当玩家完成一局胜利,倒计时时间会减少 10 秒,直到最多减少到 70 秒,使得游戏具有挑战性。
相关代码段:
countdown_time=max(70,countdown_time-10)
项目测试
测试样例
从倒计时十秒开始模拟游戏计时结束,测试达到超时条件时是否显示"超时,游戏失败,测试成功"的游戏结束界面。
测试代码如下:
......
......
#主游戏循环
main_menu()
running=True
clock=pygame.time.Clock()
def time_test():
#设置倒计时为5秒
countdown_time=5
#记录当前的开始时间
start_time=time.time()
while True:
#计算已运行的时间
passed_time=time.time()-start_time
#运行超过十秒则触发结束逻辑
if passed_time>=countdown_time:
game_over_screen("超时,游戏失败,测试成功。",score,countdown_time)
break
# 运行测试
time_test()
while running:
......
......
测试结果
测试demo如下:
设计评价
如上图所示,该测试实例在运行5秒后触发结束逻辑,符合测试样例的设计理论,并满足倒计时系统的功能要求与游戏逻辑需求。
经测试,将初始倒计时设为120秒,最多减少至70秒,确保了游戏的友好性。
AIGC表格
使用 AIGC 技术实现的功能及效果一览:
子任务 | 借助的AIGC技术实现的功能 | 效果 |
---|---|---|
主界面设计 | 借助文生图工具生成游戏图案 | 生成的图案关联性强,清晰度高。 |
倒计时与分数系统 | 借助ChatGPT进行逻辑思路梳理 | 逻辑梳理正确,但具体的代码细节、字体导入等仍需人工实现。 |
游戏逻辑开发 | GitHub Copilot提供部分模板 | 辅助生成部分代码提供参照。 |
适配与优化 | 借助ChatGPT对界面布局进行适配优化 | 帮助设计文字行距。 |
通过此次项目开发,AIGC 缺点主要表现为其生成的内容可能不完全满足定制化需求。理由如下:
1、AIGC 不擅长复杂的游戏逻辑设计、精准的功能代码生成;
2、AIGC 缺乏针对特定风格细腻把握,例如微软 Copilot 生成项目图案时,有时所得结果不符合需求。
综上,此次项目开发的心得如下:AIGC(如ChatGPT、GitHub Copilot等)工具在部分方面(如创意生成、逻辑思路梳理)等方面表现出色;但 AIGC 在处理复杂的游戏逻辑设计时往往需要人工优化。对于具有高度定制化需求的功能开发和细节处理上, AIGC 可能无法完全满足,不能确保项目的整体质量和效果。
PSP表格
以下为 PSP 表格,包含任务阶段、预估耗时及实际耗时(估算):
任务阶段(PSP) | 预估耗时(min) | 实际耗时(min) |
---|---|---|
需求分析 | 15 | 20 |
生成设计文档、流程图 | 30 | 45 |
环境配置、项目图案准备 | 20 | 25 |
技术学习 | 120 | 140 |
主界面开发及优化 | 40 | 60 |
游戏界面开发及优化 | 100 | 110 |
获胜界面开发及优化 | 40 | 50 |
失败界面开发及优化 | 40 | 65 |
需求点测试+代码调试 | 120 | 130 |
计算工作量 | 30 | 25 |
事后总结、提出优化方案 | 10 | 10 |
总计 | 565 | 680 |
个人过程性评价:
1、项目总体按时完成,功能实现符合预期。其中分数系统、倒计时机制等附加功能如预期实现;界面本来仅存在文字并无动画,优化后满足玩家视觉友好性。
2、合理利用 GitHub Copilot、文生图等 AIGC 工具,达到项目需求性与界面友好性的统一,且熟悉了 AIGC 工具的使用。其中,借助ChatGPT实现逻辑思路梳理及界面布局优化,参考 GitHub Copilot 提供的代码模板。
3、在部分阶段如调试代码及修改全局变量花费时间过长,说明在流程设计时并未充分考虑项目细节。
4、在部分细节上处理不当,例如未及时备份代码文件,导致修改功能点并运行时出错,无法追踪或恢复原始代码;当游戏初始剩余时间为70秒时,表示这是最后一关。此时,如果玩家成功通关,将显示“你已通关,按任意键退出”,而不是继续当前关卡。
过程性截图
1、安装 pygame 库:
2、安装 AIGC 工具(GitHub Copilot 扩展插件):
3、使用 Copilot 生成示例代码:
4、使用文生图工具生成项目所需图片(https://copilot.microsoft.com):
5、Github 项目