第二次结对编程作业
1.链接地址
2.具体分工
- 杨忠燎同学负责后端AI代码以及前端接口等一系列复杂的操作
- 严喜同学负责前端UI设计
3.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 30 |
Estimate | 估计这个任务需要多少时间 | 50 | 30 |
Development | 开发 | 1000 | 1400 |
Analysis | 需求分析 (包括学习新技术) | 240 | 360 |
Design Spec | 生成设计文档 | 60 | 20 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 (为开发制定合适的规范) | 30 | 20 |
Design | 具体设计 | 120 | 120 |
Coding | 具体编码 | 360 | 360 |
Code Review | 代码复审 | 180 | 120 |
Test | 测试 (自我测试,修改,提交修改) | 360 | 540 |
Reporting | 报告 | 60 | 60 |
Test Report | 测试报告 | 20 | 20 |
Size Measurement | 计算工作量 | 10 | 20 |
Postmortem & Process Improvement Plan | 事后总结 并提出过程改进计划 | 30 | 40 |
合计 | 2620 | 3170 |
4.解题思路描述与设计实现说明
-
网络接口的使用(
API文档已详细说明
,<-可点击查看)
- 登录注册和历史战局等接口-->按API文档指定的POST,GET请求。发送请求得到相对应的JSON数据。并对相对应的数据进行处理。登录POST用户名,密码到服务器,得到登录反馈信息。
- 开启战局,POST自己token值得到一副牌,并传到AI进行数据出来,最后返回结果。
- 最后再POST结果到后端,得到分数。
- 历史排行榜,个人历史记录通过GET请求得到JSON数组,解析即可使用。
- 注册,POST注册信息到服务器即可使用
-
代码组织与内部实现设计(类图)
总体一览
ScardAI处理部分
UI接网络接口,接AI
-
流程图
-->自己用手机玩十三水很久,发现我每把的游戏思路好像就是这样-->于是我就把他实现了。
-->后来发现其实对各种牌加权算法很重要(发现自己就是个菜鸡)
5.关键代码解释
-->整体情况
--> 把牌存入二维数组,以及把牌化成花色数组和顺子顺子。 以便于后面取牌时使用。
int x = 0,y = 0;
for (int i = 0 ; i <cardto.length ; i++){
if (cardto[i] == '$'){
x = 0;
}
else if (cardto[i] == '&'){
x = 1;
}
else if (cardto[i] == '*'){
x = 2;
}
else if (cardto[i] =='#'){
x = 3;
}
i ++;
if ('1' < cardto[i] && cardto[i]<='9'){
y = cardto[i] - '0';
}
else{
if (cardto[i] == '1' && cardto[i+1] == '0'){
y = 10;
i++;
}
else if ( cardto[i] == 'J'){
y = 11;
}
else if (cardto[i] == 'Q'){
y = 12;
}
else if (cardto[i] == 'K'){
y = 13;
}
else if (cardto[i] == 'A'){
y = 14;
}
}
i ++;
scard[x][y] = 1;
shun[y]++;
huase[x]++;
-->找出同花顺,其实后面代码差不多。就是遍历二维数组,和花色数组,顺子数组找到并输出。
flag = 0;
int temp = 0;
for (int i=0,j=0;i<scard.length && temp==0;i++){
for ( j=scard[i].length -1 ;j>=0 && temp==0;j--){
if ( scard[i][j] == 1 && j-4>=0){
if (scard[i][j-1] == 1 && scard[i][j-2] == 1 && scard[i][j-3] == 1 && scard[i][j-4] == 1){
scard[i][j] = rank;
scard[i][j-1] = rank;
scard[i][j-2] = rank;
scard[i][j-3] = rank;
scard[i][j-4] = rank;
shun[j]--;
shun[j-1]--;
shun[j-2]--;
shun[j-3]--;
shun[j-4]--;
huase[i] =huase[i] -5;
flag = 1;
temp = 5;
break;
}
}
}
}
return;
-->最后再遍历下数组,把前墩,中墩,后墩取出来。转成String字符串输出。
for (int i = 0;i <scard.length;i++){
for (int j = 0;j<scard[i].length;j++){
if (scard[i][j] == 1){
if ( i == 0){
answer1 = answer1+"$";
}
else if (i == 1){
answer1 = answer1+"&";
}
else if (i == 2){
answer1 = answer1 +"*";
}
else if (i == 3){
answer1 = answer1 +"#";
}
if (2 <=j && j <= 10){
answer1 = answer1 + j;
}
else if (j == 11){
answer1 = answer1 + "J";
}
else if (j == 12){
answer1 = answer1 + "Q";
}
else if (j == 13){
answer1 = answer1 + "K";
}
else if (j == 14){
answer1 = answer1 + "A";
}
temp1 ++;
if (temp1 < 3){
answer1 = answer1 + " ";
}
}
-->反正整体思路就是 同花顺->炸弹->葫芦->同花->顺子->三条->两对->一对->散牌(Debug是真麻烦)
6.性能分析与改进
-
描述你改进的思路
- 学习一波权衡算法,减少谈心算法带来的毛病
- 由于是用数组硬遍历的,所以有很多冗余,可以优化
- 减少后墩取牌时,拆掉前面牌的牌型
-
展示性能分析图和程序中消耗最大的函数
7.单元测试
-->传入一个String牌型,然后经过处理,看下输出结果是否正确
public static String trycard(String string) {
System.out.println(string);
String gcard = string;
Scard scard = new Scard(gcard);
String res = scard.Doit();
System.out.println(res);
return res;
}
void display(){
for (int i =0,j = 0;i<scard.length;i++){
for ( j=scard[i].length - 1;j>=0;j--){
out.print(scard[i][j]);
}
out.println();
}
for (int x : shun){
out.print(x + " ");
}
out.println();
for (int x : shun){
out.print(x);
}
for (int x: huase){
out.println(x);
}
}
-->每次随机构造13张牌,并且转化为符合接口参数格式的字符串,再调用接口方法,打印出结果
8.贴出Github的代码签入记录
9.遇到的代码模块异常或结对困难及解决方法
- 问题描述 -->接口交互问题,不知道怎么把数据传输。跨域问题。
- 做过哪些尝试 -->首先度娘找了好久的相关问题以及解析,然后再和同学交流问题。
- 是否解决 -->几乎解决了吧,百度上看了很多样例。再看了同学的代码(弱者无能,没办法,白嫖)。
- 有何收获 -->有问题是真的很痛苦,但是解决问题的感觉是真的爽
10.评价你的队友
- 值得学习的地方
- 忠燎大佬强强强,实力带飞,不嫌弃我拖后腿,感动!!!
- 需要改进的的地方
- 注意休息,劳逸结合,身体重要
11.学习进度条
周数 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 2 | 2 | Java起步学习 |
2 | 400 | 400 | 9 | 9 | 学习美工和前端 |
3 | 800 | 1200 | 5 | 5 | 对于前后端交互的理解 |
4 | 500 | 1700 | 4 | 4 | 对于代码的优化,Debug |