成员:封皓君、顿耀伍
一、项目地址
https://gitee.com/assignment_2/zuoye2.git
我们的《游戏:黄金点》项目是为了解决黄金点这一竞争类策略游戏中,黄金点难以计算,多轮游戏胜负难以评判,需要额外一名裁判玩家、游戏公平性难以保证的痛苦,游戏玩家主要针对全年龄段人群,他们需要足够强大的计算能力以及绝对公平的游戏环境,但是现有的方案并没有很好地解决这些需求,我们有独特的办法即利用计算机的计算能力以及封装后程序的黑箱原理,给用户带来快速的计算能力以及公平的游戏环境,远远超过一般的人工计算方法。同时,可以利用高效率的微信小程序传播途径,能很快地让大部分用户知道我们的产品,并进一步传播。
黄金点游戏规则:游戏参与者N人,每人每轮输入一个0-100的整数(包括0和100),计算平均数并乘以黄金分割数0.618,判断每人输入的数与此数之差,最接近者加分,与此数差距最大者扣分,其余不改变分数,进行多轮游戏后计算总得分,得分最高者获胜。
根据一般黄金点游戏玩家的体验,希望有一款黄金点游戏可以满足以下需求:
(1)可以自行决定游戏轮数(游戏轮数通常大于等于1,不超过100);
(2)可以自行决定游戏玩家数量(游戏玩家通常大于等于2,不超过100);
(3)可以自行决定评分标准(胜利得X分,失败扣Y分,X、Y通常大于等于0),最终游戏结束评分高者获胜;
每轮结束后可以展示每位玩家目前得分情况;
二、PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
60 |
50 |
· Estimate |
· 估计这个任务需要多少时间 |
60 |
50 |
Development |
开发 |
600 |
700 |
· Analysis |
· 需求分析 (包括学习新技术) |
45 |
55 |
· Design Spec |
· 生成设计文档 |
40 |
45 |
· Design Review |
· 设计复审 |
35 |
35 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
30 |
· Design |
· 具体设计 |
75 |
85 |
· Coding |
· 具体编码 |
240 |
315 |
· Code Review |
· 代码复审 |
35 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
100 |
105 |
Reporting |
报告 |
90 |
100 |
· Test Report |
· 测试报告 |
30 |
35 |
· Size Measurement |
· 计算工作量 |
30 |
35 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
合计 |
750 |
850 |
三、每日工作总结
(1)10.28:分析需求,模拟游戏找到其中规律。
(2)10.29:建立NABCD模型,深入考虑此项目的侧重点,发现作弊检测实现起来难度较大,但仍希望在此方面进行一定的尝试。两人之间的搭档愈发默契,开始准备编程。
(3)11.01:着手在Xcode平台编写C程序,
(4)11.03前:多次修改最终确定基础程序,经测试满足上述四点需求,下一步准备考虑优化程序并提出下一阶段的需求,同样修改报告。
四、解题思路描述
首先针对黄金点游戏的规则分析项目需求,详细见上文所述,随后考虑黄金点以及大部分游戏存在的几个常见问题:包括作弊检测以及游戏传播的问题,基础程序编写完毕后,还需要考虑后续的封装以及检测问题。期间也与教员沟通,同时结合我们在CSDN上搜集到的资料。之前考虑构建一个微信小程序,但是需要学习Java语言,目前还在继续搜索可行的方案。利用我们编写的程序可以顺利完成游戏过程,但作弊检测仍然需要进一步学习,基于用户行为特征的作弊检测使我们目前考虑使用的方向之一。作弊用户之间相互结对,会使得逐渐下降的数字受到一定干扰,例如某次某位选手突然报出较大的且偏离程度较远的数字,同时另一名选手因此受益,给这两名成员记录一个标识符。若多次交替或合作受益,则可以考虑此两人相互合作进行此游戏,对其进行扣分惩罚。另外针对游戏传播问题,希望构建微信小程序或EXE文件,使其传播范围更广。
五、设计实现过程
主要程序为循环体,第一个循环体为游戏进行轮数,内部第一个循环为每个人进行输入数据,第二个循环为计算每人偏离值并进行相应的加减分,最后一个循环体为输出分数显示。
六、改进程序时间
改进程序时间主要是和需求相关的,我们的需求包含了游戏规则,针对游戏规则我们首先进行基础的编程,发现输入输出存在错误,考虑改进程序,进过20min的查找,发现问题所在,是我们循环体出现了一定的问题,更改后可以正常进行此游戏,随后针对目前四项需求,大约利用40min进行更改与测试,最终总的程序修改时间大约为1hour,将最基础程序编写为目前的最终程序。
七、关键代码及说明
具体说明见码云仓库。
// // main.c // Gold_Point // // Created by 封皓君 on 2019/11/04. // Copyright © 2019年 封皓君. All rights reserved. // #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); 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"); }
八、心得体会
对于题目到手的瞬间就会开始思考了:我要做什么题目,我要怎么做这个题目。之前都只是简单地触及表面的任务,以为的代码编译就只是坐在电脑面前,敲上几行代码,运行出来没有错误就好了,觉得这就是一次完整的编程了,并没有更具体的去完成一次软件设计的真正流程。通过对构建之法的学习才了解到,什么是单元测试,什么是需求分析,什么是代码规范,这几项之下还有更具体的用法。现在选定好了要编写的题目之后,首先需要的就是对整个流程进行时间的安排规划,不和之前那种随性一样,赶着在截止日期之前提交代码。然后就是按照填好的流程表进行相关知识的学习,对特定用户的需求分析,以及代码的编译运行和修改、复审。毕竟有很多新的东西在流程里,进行一次完整的题目编程是对之前学习内容的复习和巩固,也是对代码编写和开发环境的熟悉,这非常有利于自我能力的提高。本次作业也是结对编程,是对办理成员的一次了解,也是对两人合作的不同阶段的认识,以及合作技巧的联系。