第二次作业
第二次作业
成员:顿耀伍,封皓君
我们的《游戏:黄金点》项目是为了解决黄金点这一竞争类策略游戏中,黄金点难以计算,多轮游戏胜负难以评判,需要额外一名裁判玩家、游戏公平性难以保证的痛苦,游戏玩家主要针对全年龄段人群,他们需要足够强大的计算能力以及绝对公平的游戏环境,但是现有的方案并没有很好地解决这些需求,我们有独特的办法即利用计算机的计算能力以及封装后程序的黑箱原理,给用户带来快速的计算能力以及公平的游戏环境,远远超过一般的人工计算方法。同时,可以利用高效率的微信小程序传播途径,能很快地让大部分用户知道我们的产品,并进一步传播。
黄金点游戏规则:游戏参与者N人,每人每轮输入一个0-100的整数(包括0和100),计算平均数并乘以黄金分割数0.618,判断每人输入的数与此数之差,最接近者加分,与此数差距最大者扣分,其余不改变分数,进行多轮游戏后计算总得分,得分最高者获胜。
我们设计的黄金点游戏,希望可以满足以下需求:
(1)能够让用户决定游戏的轮数;
(2)能够让用户自行决定游玩的玩家数量;
(3)能够自行决定评分标准(比如胜利玩家得X分,失败玩家扣Y分),最终游戏结束评分高者获胜;
(4)每轮结束后可以展示每位玩家目前得分情况;
总项目流程图:
一、仓库地址
https://gitee.com/assignment_2/zuoye2.git
是用来存放黄金点游戏代码的仓库。
二、PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
70 |
65 |
· Estimate |
· 估计这个任务需要多少时间 |
70 |
65 |
Development |
开发 |
580 |
465 |
· Analysis |
· 需求分析 (包括学习新技术) |
35 |
35 |
· Design Spec |
· 生成设计文档 |
40 |
30 |
· Design Review |
· 设计复审 |
45 |
35 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40 |
30 |
· Design |
· 具体设计 |
45 |
35 |
· Coding |
· 具体编码 |
200 |
150 |
· Code Review |
· 代码复审 |
55 |
60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
105 |
Reporting |
报告 |
100 |
120 |
· Test Repor |
· 测试报告 |
30 |
45 |
· Size Measurement |
· 计算工作量 |
40 |
35 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
40 |
40 |
|
合计 |
750 |
650 |
基本上预计的时间都要多于实际操作的时间,很多的事情太想当然了,导致对于预估时间的错误估计。
三、每日软件工程学习日志
时间:2019-10-25晚 |
地点:教研室 |
人员:顿耀伍、封皓君 |
|
内容: 通过讨论,我们决定了我们的要做项目,就是黄金点游戏。通过对相互的了解,我们决定共同负责不同功能的代码的编写,我也负责博客的修改以及提交。期间我们共同讨论需要实现的内容和方案以及查找各种有关的资料。 |
|
收获: 在一个结对编程的项目里,合理的分工以及合作是很重要的。组员之间也得有足够的相互了解,因为需要清楚谁要负责项目自己擅长的部分,而不是一开始拿到题目不管队友,就开始莽。 |
|
自我评价: 第一天我们对于自己的题目感觉很有希望,我相信我们会做的很好。 |
时间:2019-10-29晚 |
地点:教研室 |
人员:顿耀伍、封皓君 |
|
内容: 今天我们具体讨论了游戏的基础功能,认为有:1.能够进行黄金点游戏的基础计算;2.能够通过键盘输入游玩的人数;3.能够显示胜利玩家和败者玩家;4.能够防止作弊的检测手段。并在草稿纸上写了一个大致的代码,同时通过网络查找了有关黄金点游戏的代码,并将之作为参考。 |
|
收获: 项目的进展是个大问题,这两天代码的编写还没开始,只是刚刚开始讨论一些文字方面,以及编程之前的准备工作,也就是还没开始动手去操作,觉得进展有些慢了下来。 |
|
自我评价: 不能光是讨论,查找资料,还是得赶紧上手去操作相关的代码工作。 |
时间:2019-10-31晚 |
地点:教研室 |
人员:顿耀伍、封皓君 |
|
内容: 今天建立了游戏项目的NABCD模型,并深入考虑了此项目的侧重点,发现作弊检测实现起来难度较大,但仍希望在此方面进行一定的尝试。最基本的程序框架在草稿纸上搭了个大概,我们开始准备编程。开始着手在xcode上写入代码,改进了昨天在稿纸上的代码的bug,编写了代码的描述。 |
|
收获: 代码的编写以及运行测试,纠察bug是一个比较重复枯燥的过程。 |
|
自我评价: 这不算是第一次使用C语言编写代码了,有种越来越上手的感觉。 |
时间:2019-11-2下午 |
地点:教研室、寝室 |
人员:顿耀伍、封皓君 |
|
内容: 今天对之前的代码进行了多次的修改,最终确定下来了基础程序。经测试满足上述四点需求,下一步准备考虑优化程序并提出下一阶段的需求,同样修改报告。 |
|
收获: 一个好的游戏代码是需要不断的添加行数与代码测试的。 |
|
自我评价: 进步是需要不断的练习和努力的。 |
时间:2019-11-3 |
地点:教研室 |
人员:顿耀伍、封皓君 |
|
内容: 为了给代码增加上之前说过的作弊检测,我们下了大功夫去阅读相关的资料,也许是关键字不对,发现有关这方面的资料找不到太想要的,还得继续努力。 |
|
收获: 要在代码里具体实现一个东西比想象的麻烦好多。 |
|
自我评价: 代码啊代码,你怎么那么多。 |
四、解题思路描述
首先针对黄金点游戏的规则分析项目需求,详细见上文所述,随后考虑黄金点以及大部分游戏存在的几个常见问题:包括作弊检测以及游戏传播的问题,基础程序编写完毕后,还需要考虑后续的封装以及检测问题。期间也与教员沟通,同时结合我们在CSDN上搜集到的资料。之前考虑构建一个微信小程序,但是需要学习Java语言,目前还在继续搜索可行的方案。利用我们编写的程序可以顺利完成游戏过程,但作弊检测仍然需要进一步学习,基于用户行为特征的作弊检测使我们目前考虑使用的方向之一。作弊用户之间相互结对,会使得逐渐下降的数字受到一定干扰,例如某次某位选手突然报出较大的且偏离程度较远的数字,同时另一名选手因此受益,给这两名成员记录一个标识符。若多次交替或合作受益,则可以考虑此两人相互合作进行此游戏,对其进行扣分惩罚。另外针对游戏传播问题,希望构建微信小程序或EXE文件,使其传播范围更广。
五、设计实现过程
主要程序为循环体,第一个循环体为游戏进行轮数,内部第一个循环为每个人进行输入数据,第二个循环为计算每人偏离值并进行相应的加减分,最后一个循环体为输出分数显示。
改进程序时间主要是和需求相关的,我们的需求包含了游戏规则,针对游戏规则我们首先进行基础的编程,发现输入输出存在错误,考虑改进程序,进过20min的查找,发现问题所在,是我们循环体出现了一定的问题,更改后可以正常进行此游戏,随后针对目前四项需求,大约利用40min进行更改与测试,最终总的程序修改时间大约为1hour,将最基础程序编写为目前的最终程序。
设计流程图如下:
对代码进行封装(将代码封装成一个EXE可执行文件):
游戏的运行:
开始设置
1号player输入
2号player输入
一轮游戏结束
代码效能测试(本次代码较为简单,经过测试,符合预期)
因为在网上查不到关于xcode的C语言单元测试,所以使用了clion环境下的gtset,但是由于不太会编写有关的单元测试(配置gtest倒是很简单),所以只能从网上摘下一段单元测试的代码到程序当中去运行,目前我们正在努力学习并去弄懂单元测试。
六、代码说明
本程序使用的函数不多,有:
point()
编写的实现游戏玩法的函数
main()
主函数,每个c文件必须要有的函数
在代码中也进行了少量的注释。
#include<stdlib.h> #include<string.h> int point() { int i,j,k,M,N,jiafen,koufen; int min=0,max=0; int m[100], n[100]; double average, G,sum = 0.0; int score[100]; printf("Welcome to Gotham!\n"); printf("游戏轮数:"); scanf("%d", &M); printf("游戏人数:"); scanf("%d", &N); printf("胜利者加分:"); scanf("%d", &jiafen); printf("失败者扣分:"); scanf("%d", &koufen); memset(score,0,sizeof(int)*N); //把从score开始的,游戏用户需要的,int类型的,存储空间个数内的数置为0 for (i = 0; i < M; i++) //进行游戏 { min=0; max=0; printf("\n第%d轮游戏:\n",i+1); for (j = 0; j < N; j++) { printf("请%d号玩家输入一个0-100的数:\n",j+1); scanf("%d",&m[j]); sum = sum + m[j]; } average = sum/N; G=average*0.618; for (j = 0; j < N; j++) { n[j] = m[j] - G; n[j]=(n[j]>0) ? n[j] : n[j]*(-1); max=(n[j]<n[max]) ? max:j; min=(n[j]<n[min]) ? j:min; } //printf("\n%d\n",max); //printf("%d\n",min); score[min]+=jiafen; score[max]-=koufen; for(k=0;k<N;k++) { printf("第%d人本轮后总分数为%d:\t\n",k+1,score[k]); } sum = 0; //printf("黄金点是%f\n", G); } return 0; } int main() //程序主函数 { point(); //system("pause"); }
七、心路历程与收获
对于题目到手的瞬间就会开始思考了:我要做什么题目,我要怎么做这个题目。之前都只是简单地触及表面的任务,以为的代码编译就只是坐在电脑面前,敲上几行代码,运行出来没有错误就好了,觉得这就是一次完整的编程了,并没有更具体的去完成一次软件设计的真正流程。通过对构建之法的学习才了解到,什么是单元测试,什么是需求分析,什么是代码规范,这几项之下还有更具体的用法。现在选定好了要编写的题目之后,首先需要的就是对整个流程进行时间的安排规划,不和之前那种随性一样,赶着在截止日期之前提交代码。然后就是按照填好的流程表进行相关知识的学习,对特定用户的需求分析,以及代码的编译运行和修改、复审。毕竟有很多新的东西在流程里,进行一次完整的题目编程是对之前学习内容的复习和巩固,也是对代码编写和开发环境的熟悉,这非常有利于自我能力的提高。本次作业也是结对编程,是对办理成员的一次了解,也是对两人合作的不同阶段的认识,以及合作技巧的联系。