2024软件工程第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253
这个作业的目标 开发类“羊了个羊”消除类小游戏,并借助AIGC技术提高效率
学号 052203132

项目展示

Github地址:https://github.com/GoldenglowBF/SheepBySheep.git

项目介绍:基于PYGame的羊了个羊消除小游戏

游戏前端设计

1.主菜单界面

主菜单界面包含难度选择按钮,排行榜按钮,开始游戏按钮与退出游戏按钮

2.游戏难度

游戏难度分为三个等级:简单,普通,困难。其中简单模式只有一层,能够百分百通关。普通模式共五层,在牌序不好时可能产生死局,困难模式在普通模式的基础删添加了两个重复堆叠的牌堆。因此,简单模式到困难模式的难度跳跃是最大的。

3.游戏交互

为提升游戏的交互性,为按钮做了简单的交互动画,让卡片能够实现平滑移动,在鼠标经过卡片时能够让卡片发生抖动,并发出音效。
所有音效为自行录制,由鼠标点击的声音和物体掉落的声音合成而来

4.游戏结束页面

使用AI产生的图标作为背景,失败界面采用阴暗的色彩,胜利页面则是较为明亮的色彩,并显示获得的分数。在游戏中我们获得的分数为:消除卡片数 + 剩余时间

游戏特色内容

1.卡片分层

处于上方的卡片会遮盖下层周围的卡片,被遮盖的卡片不能被选中且图像变暗,便于辨识

2.卡片的消除

当选中相同卡片数量达到三张消除后,卡片并没有消失,而是下坠到游戏屏幕底端,目的是让游戏更有趣味性

3.排行榜系统

每次游戏胜利后都会将游戏分数记录到文件目录下的score.txt文本上,并自行排序选出前九名的分数进行展是,让玩家不断挑战自我。

使用的特殊技术和算法

1.序列帧动图

在游戏设计过程中,我想让游戏标题动起来,使得主界面更生动一点,因此我采用的序列帧动画,通过PS设计好字体图像后导入到Spine中制作好动画并导出图片序列,最后再使用PS的联系表功能完成了序列帧图片的制作
之后设计好了播放序列帧图片的代码,原理便是随着时间不断裁剪原图片来实现动图效果
代码如下

    if current_time > self.lasttime + rate:
        self.frame += 1
        if self.frame > self.last:
            self.frame = self.start
        self.lasttime = current_time
    if self.frame != self.oldframe:
        frame_x = (self.frame % self.columns) * self.framewidth
        frame_y = (self.frame // self.columns) * self.frameheight
        rect = (frame_x,frame_y,self.framewidth,self.frameheight)
        self.image = self.rawimg.subsurface(rect)
        self.oldframe = self.frame

2.平滑移动

要让卡片移动的更生动一些,单纯的均速移动是不够的,我们可以通过插值法来实现物体由快到慢的移动。具体方法则是: 每帧位移量 = 目标位置与当前位置的差值 * 系数 其中系小于1

diff_x = self.targetpos[0] - self.rect.center[0]
    diff_y = self.targetpos[1] - self.rect.center[1]
    if abs(diff_x) < 1 and abs(diff_y) < 1:
        self.rect.center = self.targetpos
        newx = self.rect.center[0] + (self.targetpos[0] - self.rect.center[0]) * 0.3
        newy = self.rect.center[1] + (self.targetpos[1] - self.rect.center[1]) * 0.3
        self.rect.center = (newx,newy)

3.牌堆生成机制

为了减少游戏死局的出现概率,我们通过算法来提高一个牌的出现次数,同时保证牌堆顶的卡片是可消除的。

    for i in range(types):
        countoftype = random.randint(1,maxcount//3) * 3
        tile.extend([i+1]*countoftype)
        remain -= countoftype
    #这种算法的计算得出的卡片堆中,最后一种的卡片数量会偏高,这样的好处是减少无解局的出现
    if remain > 15:
        for i in range((remain - 15) // 3):
            tile.extend([randint(1,11)] * 3)
        remain = 15
    tile.extend([types] * remain)
    random.shuffle(tile)
    #难度二与三中,我们要确保牌堆顶的卡片能够消除,否则会出现开局即死局的情况
    if totalcount == 81:
        for i in range(3):
            tile.extend([randint(1,12)] * 3)
    elif totalcount == 99:
        for i in range(3):
            ranint = randint(1,12)
            for j in range(3):
                tile.insert(81 + i * 3 + j,ranint)
    return tile

游戏具体展示

1.游戏内素材

卡片的图标均为AI生成,并做了简单的风格化处理,包括:圆角化处理,渐变描边,内阴影来增加卡片质感(虽然在游戏里看不到这么清楚)

2.游戏主菜单


采用AI生成的12个图标与简单的色块作为背景,按钮做了简单的交互动画,标题则使用了前文提到的帧序列动画
难度标识的颜色本
来和按钮颜色是一致的,但是这里录制出现了问题

3.游戏内页面


做了简单的选牌堆排序

困难模式,上方添加了重复堆叠的牌堆

4.游戏结束页面


游戏胜利

游戏失败

5.排行榜界面


比较简陋

调试过程

这个过程忘记截图了,只好用文字描述

卡片点击消除测试

最早进行的测试,通过给出的示例代码完成,最重要的还是了解pygame库的各个函数使用方法

卡片选牌堆测试

一开始的卡片选牌堆排序有点问题,通过测试案例发现了问题,负责选牌堆的组无法修改数组顺序,于是在检测的时候采用遍历的方法保证排序正常运作。

平滑移动方法实现测试

由前文给出的插值法可以知道,单纯的使用插值是无法让目标移动到目的地的,当时的我并没有发现这个问题,于是通过测试不断获得卡片的位置,最后意识到了这个问题,添加了判断机制。

AIGC表格

学习内容 心得体会
使用Pygame框架制作游戏 学习到了游戏开发的基本框架,理解了Pygame的事件循环机制。
使用class类简化工作内容 通过class类组织代码,提高了代码的复用性和可维护性。
实现游戏的各个机制 掌握了如何处理游戏中的各种功能模块,比如碰撞检测、计分等。
优化游戏内容与机制 学到了如何通过代码优化提高游戏的性能和用户体验。

PSP表格

阶段 预估耗时 实际耗时
体验,分析原游戏 10分钟 10分钟
理解PYGame框架 30分钟 40分钟
设计素材,游戏机制 40分钟 1小时
设计代码 4小时 5小时
游戏优化 1小时 1小时
编写文档 3小时 4小时

总结

在AI的帮助下我的工作变得更加简单,令我惊叹的是AI能够完全理解我的想法并给出合适的,能够运作的代码,并根据我的要求不断修改优化。同时AI绘画也让我在寻找游戏素材时节省了不少时间。这是我之前从未体验过的
但代码编写和调试的过程还是不容易,经常要停下来休息一会

posted @   SANAVY  阅读(50)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示