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

    结对同学博客: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 实现各个界面之间的逻辑调用
  • 相关阅读:
    Ruby gem命令
    C语言中的static关键字
    Linux下clock计时函数学习
    open-falcon之dashboardportal说明.md
    open-falcon之graph
    open-falcon之query
    open-falcon之HBS
    open-falcon之judge
    open-falcon之transfer
    open-falcon之agent
  • 原文地址:https://www.cnblogs.com/0x06c0/p/11741637.html
Copyright © 2011-2022 走看看