第二次结对编程作业

1.结对同学的博客链接、本作业博客的链接、所Fork的同名仓库的Github项目地址

我的博客链接:https://www.cnblogs.com/tinygod/p/11742085.html
结对同学博客链接:https://www.cnblogs.com/0x06c0/p/11741637.html
所Fork的同名仓库的Github项目地址:https://github.com/0x06c0/13water

2.具体分工

李炜炜

  • 调用网络接口
  • 写UI界面
  • 界面间的逻辑设计

连振升(我)

  • 负责自动出牌算法的编写、优化、调试

3.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 40 30
Estimate · 估计这个任务需要多少时间 40 30
Development 开发(包含下面8个子任务) 4855 5425
Analysis · 需求分析(包括学习新技术) 1200 1350
Design Spec · 生成设计文档 0 0
Design Review · 设计复审 45 45
Coding Standard · 代码规范(为开发制定合适的规范) 10 30
Design · 具体设计(用伪代码,流程图等方法来设计具体模块) 0 0
Coding · 具体编码 2400 3000
Code Review · 代码复审 600 600
Test 测试(自我测试,修改,提交修改) 600 600
Reporting 报告 540 840
Test Report · 测试报告 60 60
Size Measurement · 计算工作量 180 180
Postmortem & Process Improvement Plan · 事后总结并提出过程改进计划 300 600
合计 5435 6295

4、解题思路描述与设计实现说明(15分)

  • 网络接口的使用
    本次主要用到Post和Get两种方法,我一开始使用的是JDK自带的网络类来发送请求,Post能完美运行但Get无法成功,故引用第三方jar包OkHttp来实现Get请求。
  • 代码组织与内部实现设计(类图)

    一共有13个类,其中一个主类,两个方法类以及十个显示界面的类,主类只负责整个程序的开始,两个方法类分别为HttpPost类和出牌的算法类,其他显示界面的类之间根据需要互相调用与组织。
  • 算法的关键与关键实现部分流程图
    出牌算法的关键是对顺子和同花的反水情况的处理。
    流程图:

5、关键代码解释(3分)

关键代码功能:对同花或顺子可能会反水的情况的处理。
算法思想:每墩顺子或同花后面加上标识符,以便后面的判断。判断出来后,将其转换到数组中逐个比较大小。
源代码:

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;
			}
		}
		    

6、性能分析与改进(6分)

缺陷:在我的出牌算法中,每一墩在确定前都会进行按牌面值的排序,不仅大大增加了我的工作量,又使程序复杂度大幅提升。
改进:每一墩都先正常找下来,到最后再对每墩进行排序,以及反水处理。
性能分析图:

消耗最大的函数:

此函数包含对底墩中墩的获取,以及最后的补全操作。

7、单元测试(5分)

本次单元测试,用了10个不同样例,覆盖率如下:

8、##GitHub代码嵌入记录



9.遇到的困难和解决方法

问题描述

  • 使用JDK自带的网络类来写Post和Get方法,Post能调用成功,但Get方法一直失败。
  • 未能想到比较完美的分墩算法,需要考虑多种情况

做过的尝试

  • 使用封装好的第三方jar OKHTTP来调用Get方法。
  • 分而治之。尝试从底墩找起,每墩都找当前牌中最大的。之后又尝试将牌的大小均摊,试图避免被打枪。

是否解决

  • 第一个问题已解决
  • 第二个问题未能完美解决

有何收获

  • 遇到问题可以换个思路换种方法解决,不必死磕。
  • 首次编写出牌程序,有了一定经验

10、评价你的队友(4分)

  • 值得学习的地方(2分)
    能够在没有任何经验和知识储备的情况下去不断学习,通过大量网络调研来探索未知领域。
  • 需要改进的地方(2分)
    按钮做的不够美观(手动滑稽),按钮事件中的窗口覆盖没处理好。

11、学习进度条(2分)

第N周 新增代码 累计代码 本周学习耗时 累计学习耗时 重要成长
1 546 546 8 8 初步编写了简易出牌算法,对出牌算法有了一定认识
2 248 794 12 20 修复了之前的出牌算法的一些BUG,对出牌算法的理解更深一层,对JAVA字符串的处理更加娴熟
3 411 1205 12 32 修复了出牌算法的一些BUG,并适当优化,体会到模块化编程的重要性
原文地址:https://www.cnblogs.com/tinygod/p/11742085.html