结对同学博客:https://www.cnblogs.com/tinygod/p/11742085.html;
本作业博客:https://www.cnblogs.com/0x06c0/p/11741637.html;
GitHub地址:https://github.com/0x06c0/13water;
具体分工
李炜炜(我)
- 调用网络接口
- 写UI界面
- 界面间的逻辑设计
连振升
- 负责自动出牌算法的编写、优化、调试
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 60 |
Estimate | · 估计这个任务需要多少时间 | 50 | 60 |
Development | 开发(包含下面8个子任务) | 2500 | 3500 |
Analysis | · 需求分析(包括学习新技术) | 900 | 1200 |
Design Spec | · 生成设计文档 | 40 | 60 |
Design Review | · 设计复审 | 30 | 50 |
Coding Standard | · 代码规范(为开发制定合适的规范) | 30 | 50 |
Design | · 具体设计(用伪代码,流程图等方法来设计具体模块) | 400 | 500 |
Coding | · 具体编码 | 1000 | 1500 |
Code Review | · 代码复审 | 20 | 40 |
Test | 测试(自我测试,修改,提交修改) | 80 | 100 |
Reporting | 报告 | 100 | 110 |
Test Report | · 测试报告 | 30 | 30 |
Size Measurement | · 计算工作量 | 10 | 20 |
Postmortem & Process Improvement Plan | · 事后总结并提出过程改进计划 | 60 | 60 |
合计 | 2650 | 3670 |
解题思路描述与设计实现说明
- 网络接口的使用
本次主要用到Post和Get两种方法,我一开始使用的是JDK自带的网络类来发送请求,Post能完美运行但Get无法成功,故引用第三方jar包OkHttp来实现Get请求。 - 代码组织与内部实现设计(类图)
一共有13个类,其中一个主类,两个方法类以及十个显示界面的类,主类只负责整个程序的开始,两个方法类分别为HttpPost类和出牌的算法类,其他显示界面的类之间根据需要互相调用与组织。 - 说明算法的关键与关键实现部分流程图
出牌算法的关键是对顺子和同花的反水情况的处理。
流程图:
关键代码解释
UI界面没啥关键代码,所以贴上结对同学的出牌算法的关键代码
关键代码功能:对同花或顺子可能会反水的情况的处理。
算法思想:每墩顺子或同花后面加上标识符,以便后面的判断。判断出来后,将其转换到数组中逐个比较大小。
源代码:
if(Bottom.length()>16&&Middle.length()>16)//两墩出现顺子+顺子/同花+同花/同花+顺子的情况,可能会反水
{
int[] a=new int[5];
int[] b=new int[5];
int cnt=0;
if(Bottom.charAt(16)<Middle.charAt(16))//根据标志字符串判断,字典序T在S后面,故TH>ST
{
String temp=Middle;
Middle=Bottom;
Bottom=temp;
}
else
{
Bottom=Bottom.replaceAll("TH", "");
Bottom=Bottom.replaceAll("ST", "");
Middle=Middle.replaceAll("TH", "");
Middle=Middle.replaceAll("ST", "");
Bottom=Bottom.replaceAll(""", "");
Middle=Middle.replaceAll(""", "");
Trans(Bottom);
for(int i=12;i>=0;i--)
if(shoupai[i]>0)
{
a[cnt++]=i;
shoupai[i]=0;
if(cnt==5)
break;
}
Trans(Middle);
for(int i=12;i>=0;i--)
if(shoupai[i]>0)
{
b[cnt++]=i;
if(cnt==5)
break;
}
//数组a存Bottom的牌面值,b存Middle的牌面值
for(int i=0;i<5;i++)
if(b[i]>a[i])
{
String temp=Middle;
Middle=Bottom;
Bottom=temp;
break;
}
else if(a[i]>b[i])
break;
}
}
性能分析与改进
缺陷:在我的出牌算法中,每一墩在确定前都会进行按牌面值的排序,不仅大大增加了我的工作量,又使程序复杂度大幅提升。
改进:每一墩都先正常找下来,到最后再对每墩进行排序,以及反水处理。
消耗最大的函数:
此函数包含对底墩中墩的获取,以及最后的补全操作。
单元测试
GitHub代码嵌入记录
遇到的困难和解决方法
问题描述
- 使用JDK自带的网络类来写Post和Get方法,Post能调用成功,但Get方法一直失败。
- 未能想到比较完美的分墩算法,需要考虑多种情况
做过的尝试
- 使用封装好的第三方jar OKHTTP来调用Get方法。
- 分而治之。尝试从底墩找起,每墩都找当前牌中最大的。之后又尝试将牌的大小均摊,试图避免被打枪。
是否解决
- 问题解决
- 第二个问题未能完美解决
有何收获
- 遇到问题可以换个思路换种方法解决,不必死磕。
评价你的队友
- 值得学习的地方
做事认真效率高,对于我发现的bug能很快进行改正并优化算法。 - 需要改进的地方
都整挺好,改进的地方可能就是算法的小bug有点多。
学习进度条
第N周 | 新增代码 | 累计代码 | 本周学习耗时 | 累计学习耗时 | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 10 | 10 | 通过设计原型,大致掌握了墨刀和PS的基本用法,并提高了网络调研能力 |
2 | 273 | 273 | 12 | 22 | 学习了Post和Get的使用,对JFrame有了一些了解 |
3 | 302 | 575 | 14 | 36 | 学习了JButton、JText等组件的使用,完善具体设计思路 |
4 | 851 | 1426 | 20 | 56 | 实现各个界面之间的逻辑调用 |