2021秋软工实践第二次结对编程作业

盛羽 2021-10-09 23:49:15

2021秋软工实践第二次结对编程作业

这个作业属于哪个课程 构建之法-2021秋-福州大学软件工程 https://bbs.csdn.net/forums/fzuSoftwareEngineering2021
这个作业要求在哪里 2021秋软工实践第二次结对编程作业 https://bbs.csdn.net/topics/601189945
个人学号031902631
结对成员学号031902601
结对小伙伴的作业博客链接此博客由两人共同编写
GitHub 仓库地址 https://github.com/cs0501/Study
视频演示链接 https://b23.tv/0jay5a

PSP表格

(表格数据为两人合计,但只有学习新技术时是分开的)

PSPPersonal Software Process StagesEstimated time(min)Time(min)
Planning计划2530
Estimate估计这个任务需要多少时间1010
Development开发--
Analysis需求分析 (包括学习新技术)12001800
Design Spec生成设计文档--
Dsign Review设计复审--
Coding Standard代码规范--
Design具体设计180150
Coding具体编码25003000
Code Review代码复审150180
Test测试6060
Test Report测试报告3030
Size Measurement计算工作量3015
Postmortem & Process Improvement Plan· Design Review事后总结, 并提出过程改进计划6060
Summary合计42755335

编程思路与难点分析

  • 代码实现
    首先我们讨论了游戏逻辑该如何实现。最开始是想前后端分离,但查阅相关资料后发现需要服务器等较难实现的条件,于是最终决定使用纯前端完成任务。

  • 游戏数据如何存储、何时删除
    由于刚开始时设计了联机游戏,所以要实现黑名单、个人数据等必须用到云数据库,之后便决定将奖品信息等游戏数据全部上传到云数据库处理。在设计数据库时,就如何设计记录的格式一事也发生了争论,最终考虑到多个用户同时登陆时不能对数据库造成误操作而统一了意见(具体设计见下文)。
    另一方面,单局游戏内的奖品信息该何时删除也是个问题。原本想的是游戏结束或手动退出时删除,但后面又考虑到可能会出现用户强制退出、杀后台等非正常关闭游戏的方式。这个问题至今都没有想出合适的解决方法。

  • 奖品云数据库的搭建

    img

    如图所示,我们使用六条记录来表示六个奖项,每当有用户进入游戏时就为其新增六条数据以存储奖品,游戏结束后删除这些数据。其中,num 字段表示该奖项当前剩余的数量,present 和 image 数组分别用来存放每一种奖品对应的名称与图片。创建完成后记录其 id 中以便后续使用,这里采用 Oneid, Towid... 的命名方法存储 id 以区分状元、对堂等不同奖项。

    在开始游戏前,用户可设置各奖项中的奖品数量并上传奖品的名称与图片(若未设置则均采用默认值)。

    img

每次进入游戏(设置礼物页面)前,该数据库都将为用户分配六条新的记录以存储奖品,节选代码如下:

db.collection('Presents').add({
  data: {
    'image':  [],
    'present': [],
    'num': 32
  },
  success: res =>{
    this.setData({
      Oneid:res._id
    })
    str = res._id
    console.log(this.data.Oneid)
  }
})

在进行游戏时,玩家每次领取奖品时对应奖池的 num 就会减一,减到零后便无法领取。节选代码如下:


if(this.data.level=='状元'&&this.data.totalpreNum[0]>0){
            this.data.preNumchange=this.data.totalpreNum[0]-1
            db.collection('Presents').doc(wx.getStorageSync('Oneid'))
            .update({
                data: {
                    'num': this.data.preNumchange
                }
            })
        }
  • 奖品的选择与发放
    按照博饼最为流行的规则,状元以下的奖励是摇中后立即分发,但状元及以上(统称状元们)的奖品只有一个,应该是游戏结束后才在状元们之中选出最大者领奖。而我们的小程序中状元数量可以自由设定,大于一个也是可以的。原计划是游戏结束后对状元们进行排序然后再领奖,领完为止。

    但因为时间有限,实在来不及实现状元的分发机制了,最后就改成了状元也摇中即分发(相当于状元们都同级了)。今后有时间了会修改这段代码,以实现原计划的功能。

  • 结束游戏弹窗的延时
    当奖池为空时结束游戏,但我们之前都是用访问数据库中 num 的数量来进行判断的,这就导致了有一定的延时,在游戏结束弹窗弹出之前甚至可以再摇一次。未解决此问题,我们在程序中设置了变量记录当前剩余奖品的数量,用户领取奖品时也使其自减,这样就避免了访问云数据库带来的延时。


花费较长时间的工作

  • 云数据库的使用

    因为使用 where 构建查询条件的方法建议在云函数中使用,所以我们一开始是计划使用云函数完成对云数据库的各种操作。但因为学习云数据库时参考的教学视频中云函数是放到中后期介绍的,很多功能都没有用云函数演示过,故自己上手时遇到了很多诡异又棘手的 bug。

    比如更新数据库内容的函数,本打算通过传入奖项名参数以对对应的记录进行各种操作。最开始是对 “状元” 奖项进行修改,并没有出现什么问题。但将参数改为 “四进” 后再进行测试,却发现修改的还是状元的值。在仔细复审后并没发现问题,就直接重启了开发平台,结果重启后这项修改数据的功能直接就无效了。翻阅大量资料并不断调试了几个小时后还是无法解决(不知道是不是因为开发平台版本问题或者说云函数这个系统本身就存在 bug),无奈只能放弃使用云函数,在程序中用 doc 代替 where。

  • 骰子旋转和光效动画实现方式的选择

    如图所示,我们的游戏界面是采用骰子浮空,后面带有光效。

    img

    为实现骰子和光效的动画,最开始打算用视频,针对如何隐去进度条和暂停等功能研究了一段时间。后来又发现发现只有 mov 格式才能存储背景透明的视频,而 mov 视频导入程序后无法播放,处理了一阵后无果,只能改变方法。

    随后我们想到,游戏中的角色不也是背景透明的图片素材通过某种方式实现运动吗?但在没有人指点的情况下很难查到相关资料,搜索关键词都难以确定,就放弃了这个选择。

    之后拿了些 gif 动图进行实验,发现 gif 可以很好地实现我们想要的效果(虽然画质比较感人),于是最终决定用 gif 实现游戏界面的动画。因为之前没有多少制作 gif 的经验,在思考如何控制骰子旋转的起止上又花了一些时间。最后是采用循环的旋转动画 + 最终结果的图片构成一次旋转全程,光效则是一张动图永久播放。因为 AE 制作动态光效必须有背景,所以无论是自制还是找素材,想要透明的光效都免不了抠图,一帧帧抠也是费了不少时间。

  • 艰难的资料收集
    在编程过程中难免会遇到各种教程中不会出现的小问题,有的又很难用语言描述,比如:

img

遇到这种 bug 时是很要命的,因为不知道要怎么描述,自然也就没那么容易查到相关资料。


结对工作现场

img


commit 截图

img


总结遗憾

  • 这个任务对两个完全没有开发基础的人来说时间确实太赶了,因此没能完成联机游戏,将来有时间的话会继续尝试实现联机游戏。
  • 之前为联机游戏设计的黑名单等功能也没能派上用场。认真设计的欧气值规则也没能登场,感觉怪可惜的。
  • 如图上文所说,状元奖品的分发机制没能实现,这算是比较严重的毛病吧,今后有时间的话会立刻优化此模块。
  • 按照平时使用软件的经验来看,上传数据后应该还会有个对应的 x 号删除这条数据,如图所示。添加礼品的页面中理应也要有这样的功能,但我们暂时没有想到较好的实现方式。

    img


结对编程体验与总结

  • 我的心得

    零基础的两个人在九天内开发一个小程序,在猝死的边缘勉强地完成了基本功能。虽然还有很多原先设计的功能没能实现,但能够在这么短的时间内学到了这么多的知识并投入实践,即使目前的成果很粗糙但也还算是挺满意的了。在这此任务中,我主要负责的是与云数据库有关的操作,也协助了队友调试界面的显示问题。也感谢队友一直以来的努力,虽然还有不少遗憾,但对当前的我们来说也算是收获满满啦。

    通过这次的结对编程,我们完整地经历了一款软件从需求分析到原型设计再到从具体实现的过程,对软件工程这个领域有了初步的认识,获得了微信小程序的开发经验,也提高了团队写作能力。希望在之后的团队任务以及未来的开发中能够做出更好的作品,也希望有时间的话可以继续完善这个博饼小程序。

  • 队友心得

    这是第一次在这么短的时间内从零开始进行开发,从学习小程序的前后端起,到完成小程序只有短短九天时间,时间非常紧迫,所以相比于原先的原型设计,最终的成品还是有很大变化的。

    第一次结对作业中的原型设计是有考虑多人游戏以及黑名单等功能,但在开始编程后才发现要实现这些功能所需的代码水平还是我目前所无法触及的,对于初学者来说,这个时间也是很不充裕的,所以就将这些功能的开发先放下了。

    当然,虽然因为能力和时间原因放弃了一些功能,我们也在原本的基础上尽自己所能增加了诸如上传礼物和图片,实时查看剩余奖品的功能,以及队友绘制的骰子背后的光效。

    这次的结对作业不但让我体会到了从零开始学习开发,查找资料的困难。更重要的是让我亲身经历了结对开发的模式,小程序开发中的页面设计之类的前端设计和后端功能的实现使用的是完全不同的开发语言,而初次经历这种模式的我们并不能很好的将前后端的开发进行协同和对接,在这个过程中浪费了很多时间,也慢慢熟悉了这种开发模式,逐渐能够相互配合,对于这种模式的理解和小程序开发的学习应该是这次作业最大的收获吧。

...全文
85 点赞 收藏 1
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzusdn 教师 10-14

非常强大!

回复
相关推荐
发帖

187

社区成员

福州大学软件工程教学,推行邹欣老师“构建之法”。
帖子事件
创建了帖子
2021-10-09 23:49
社区公告
暂无公告