这个作业属于哪个课程 | 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 += 1if self.frame > self.last:self.frame = self.startself.lasttime = current_timeif self.frame != self.oldframe:frame_x = (self.frame % self.columns) * self.framewidthframe_y = (self.frame // self.columns) * self.frameheightrect = (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.targetposnewx = self.rect.center[0] + (self.targetpos[0] - self.rect.center[0]) * 0.3newy = self.rect.center[1] + (self.targetpos[1] - self.rect.center[1]) * 0.3self.rect.center = (newx,newy)
3.牌堆生成机制
为了减少游戏死局的出现概率,我们通过算法来提高一个牌的出现次数,同时保证牌堆顶的卡片是可消除的。
for i in range(types):countoftype = random.randint(1,maxcount//3) * 3tile.extend([i+1]*countoftype)remain -= countoftype#这种算法的计算得出的卡片堆中,最后一种的卡片数量会偏高,这样的好处是减少无解局的出现if remain > 15:for i in range((remain - 15) // 3):tile.extend([randint(1,11)] * 3)remain = 15tile.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绘画也让我在寻找游戏素材时节省了不少时间。这是我之前从未体验过的
但代码编写和调试的过程还是不容易,经常要停下来休息一会