2024软件工程第二次作业

news/2024/9/19 6:03:35/文章来源:https://www.cnblogs.com/SanaGlow/p/18417056
这个作业属于哪个课程 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绘画也让我在寻找游戏素材时节省了不少时间。这是我之前从未体验过的
但代码编写和调试的过程还是不容易,经常要停下来休息一会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798582.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宏定义与特别运用

目录宏定义数值宏常量字符串宏常量用define宏定义注释符号?程序的编译过程预处理中宏替换和去注释谁先谁后?如何写一个可靠的宏函数do-while-zero结构do-while-zero的评价宏定义中的空格宏只能在main函数上面定义吗?宏的作用范围#undef宏替换是在函数调用之前进行.块中进行#…

白云龙期货投资-第六讲

## 价量行情中的配合 1,价涨量增,顺势推动。 2,价量背离,趋势转变 (价与量在相对高位称为顶背离,在下跌末期为底背离。背离后如果想再次上涨或者下跌,一般价格都会出现一个盘整期,而成交量则出现缩量地量期)价量行情中的配合 1,价涨量增,顺势推动。 2,价量背离,趋势…

软件工程结对项目 3:python实现自动生成小学四则运算题目的程序

这个作业属于哪个课程 广工计院计科34班软工这个作业要求在哪里 作业要求团队成员1 庄崇立3122004633团队成员2 罗振烘3122004748这个作业的目标 结对合作完成小学四则运算题目的程序,熟悉项目开发流程,提高团队合作能力一、GitHub地址 二、需求 1.题目:实现一个自动生成小学…

结构、权限修饰符、类

结构、权限修饰符、类 结构(struct:自定义的数据结构) struct student {// 成员变量int number;char name[100];void func(){ // 成员函数(方法)number++;} };// 1. 形参为引用 void func1(student &stu){stu.number = 2000;strcpy_s(stu.name, sizeof(stu.name…

Leetcode 2183. 统计可以被 K 整除的下标对数目

1.题目基本信息 1.1.题目描述 给你一个下标从 0 开始、长度为 n 的整数数组 nums 和一个整数 k ,返回满足下述条件的下标对 (i, j) 的数目:0 <= i < j <= n - 1 且 nums[i] * nums[j] 能被 k 整除。1.2.题目地址 https://leetcode.cn/problems/count-array-pairs-di…

贪心算法-找不重叠的区间段

1.说明 有N个区间片段,查找其中不重叠的片段最大个数。例如(6 8),(2 4),(3 5),(1 5),(5 9),(8 10)这6个片段中,不重叠的片段最大个数为3,分别为(2 4),(6 8),(8 10)。 2.解析 先按照起始位置从小到大进行排序,使用贪心算法使有效片段尽可能小,即结束位置更靠前…

Nuxt Kit 中的页面和路由管理

title: Nuxt Kit 中的页面和路由管理 date: 2024/9/17 updated: 2024/9/17 author: cmdragon excerpt: 摘要:本文介绍了Nuxt Kit中页面和路由管理的高级功能,包括extendPages自定义页面路由、extendRouteRules定义复杂路由逻辑及addRouteMiddleware注册路由中间件。通过这些…

堆的应用

1.需要具备的知识 1.1以顺序存储方式存储完全二叉树 完全二叉树:节点从上到下,从左到右布局的二叉树,如下图所示。完全二叉树可以使用类似数组这种顺序存储的结构存节点,如下图。按照"层级遍历"方式遍历这棵树(还有"前序、中序、后序"遍历方式,这里不做…

Oliver编译安装(Windows10+VisualStudio2022)

Oliver是一个开源的非线性视频编辑器。主要基于Qt和FFmpeg开发。前置条件 电脑上需要的环境Qt(>=5.15) VisualStudio(2022,其他版也可) vcpkg软件安装安装Qt5.15令人糟糕的是,Qt如今变得不太容易安装。自从Qt5.15以后的版本,就取消了离线安装。所有的Qt后序版本就只能通过…

CVE-2021-24762 复现

CVE-2021-24762 复现一看是个wordpress,看了下版本6.0没洞,直接扔wpscan扫一下 发现了个插件一搜发现perfect-survey在1.5.2之前都有洞,直接搜exp打. 上官网找了个API重扫一遍,直接给出了CVE号!直接找个sqlmap的exp跑一下,注意第二个位置选n来设置cookie sqlmap -u "http…

Java后端对前端的数据进行校验

首先,作为一名后端程序员,大家一定要记住:不要相信前端传来的数据,后端程序员仿佛是国家的边境出入局的工作人员,承担这最后的防线,必须尽可能的防止错误信息的流入导致正确信息的流出。因此,后端程序员必须要对前端传来的数据进行校验。这里呢,发现一个很好的校验工具…

vp介绍

想要更多请到:https://budingcat.xyz 注册了解详情 可以点击工单进行沟通哦~