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 仓库,链接如下:

https://github.com/KeepUpIce/pygame-2024-9-10

项目介绍+项目展示

本项目分为四个主要模块:主界面、游戏界面、获胜界面和失败界面,流程图如下:

游戏逻辑概述

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_screengame_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
技术学习 60 65
主界面开发及优化 40 60
游戏界面开发及优化 50 60
获胜界面开发及优化 10 15
失败界面开发及优化 10 25
需求点测试+代码调试 30 20
计算工作量 5 5
事后总结、提出优化方案 10 10
总计 280 350

个人过程性评价:

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 项目

posted @ 2024-09-12 20:52  秋说  阅读(202)  评论(0编辑  收藏  举报