zoukankan      html  css  js  c++  java
  • 第二次结对编程作业

    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,并适当优化,体会到模块化编程的重要性
  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/tinygod/p/11742085.html
Copyright © 2011-2022 走看看