第二次结对编程作业
一、题目描述
题目:“福建赌王”之争
【题目背景】
话说,自称“赌王”的老周与同样自称“赌王”的老刘在福州展开“赌王”名号的争夺。两人商议决定使用福建当地的一套纸牌游戏规则进行博弈,即“福建十三水”。约定三周后展开决战。老刘修习代码多年,希望开发一套自动化的出牌系统,具体游戏规则请上网查询或找福大柯老板,本次作业要求提交一份完整的前端后端代码。
WARNING:珍惜钱财,远离赌博(含AI赌博)。
二、相关的链接
三、具体的分工
这次的分工由周鑫煌负责前端代码的编写(制作出一款简易的App),由我进行后端代码与算法的编写(使用java语言).
四、PSP表格
PSP2.2 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 300 | 320 |
Estimate | 估计这个任务需要多少时间 | 60 | 70 |
Development | 开发 | 650 | 850 |
Analysis | 需求分析(包括学习新技术) | 240 | 300 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 30 | 40 |
Coding Standard | 代码规范(为开发制定合适的规范) | 60 | 60 |
Design | 具体设计 | 40 | 60 |
Coding | 具体编码 | 100 | 120 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改,提交修改) | 120 | 200 |
Reporting | 报告 | 50 | 60 |
Test Report | 测试报告 | 20 | 30 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结并提出过程改进计划 | 50 | 60 |
合计 | 1000 | 1230 |
五、解题思路与设计实现说明
-
网络接口的使用
- 利用java搭建了后台服务器,对Ios前端提供接口,并且部署到网上的云服务器
利用insosomnia软件进行本地的后台测试 (实际项目已部署到云服务器)
- 利用java搭建了后台服务器,对Ios前端提供接口,并且部署到网上的云服务器
-
内部类图
-
利用IDE自带的工具进行类图的分析
其中不同类之间的关系如类图所示(一个类指向谁则表明这个类依赖于这个类)
以及其中几个类之间的相互调用关系
-
-
算法的关键流程图
首先将得到的排根据其画色进行排序,方便下一步的操作,将其按照排序的结果进行相应牌型的计数,然后根据不同的组合分出下墩和中墩,自动分出上墩,最后将不同的出牌进行权重选择,得到最后的牌型。
六、关键代码的解释
本算法我认为没有什么特别突出的值得注意的地方,因为每一处的处理不当都可能使得算法的失败,所以就没有啥重要的代码,可以说是处处都是关键,所以在此我放出之前在debug时的代码(Debug了不少时间)
在改之前只考虑了3对的情况,并没有考虑出现4对的情况,所以在跑数据的时候发现一到4对就会出牌错误
通过Debug发现了问题的原因,并且加以考虑了出现4对的情况,最终将测试数据带入程序解决bug
七、性能的分析与改进
可以看到主要进行出牌算法占据了绝大部分时间,小部分时间由io、依赖包函数调用占用。
- 可以先直接判断是否为特殊牌型进而直接输出
- 设置一定的权重阈值 达到即可输出
- 不同的散排牌型放置不同的数组内
八、单元测试
这次单元测试我利用Junit将程序分成俩个方面进行单元测试,一个是对自己算法的单元测试,一个是对评测后台连接的单元测试,分别验证了算法的正确性和提交结果的正确性。
-
junit 依赖
-
算法的单元测试
构造测试数据的思路:我将页面上请求到的数据作为测试数据进行单元测试
-
未通过单元测试的样例
-
通过单元测试的样例
-
-
连接测试的单元测试
-
登入请求
-
开启战局
-
提交结果
-
九、Github的代码签入记录
十、遇到的代码模块异常或结对困难及解决方法
-
问题一: 如何脱离本机进行前后端链接操作
- 尝试: 将后端部署到网上云服务器
- 是否解决: 是
- 有何收获: 为后面的团队作业做铺垫
-
问题二: 如果遇到不可控因素导致请求中断进而使得程序奔溃
- 尝试: 在关键语句内进行异常处理
- 是否解决: 是
- 有何收获: 加深对一些关键代码是否需要进行异常处理的理解
十一、评价队友
- 值得学习的地方
队友Ios做的真得劲,应该是年段一个用Ios做的前端了吧,顶。 - 需要改进的地方
还是没能提早做完在赶ddl
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 重要成长 |
---|---|---|---|---|
第一周 | 0 | 0 | 5 | 学习原型设计(墨刀)的使用 |
第二周 | 0 | 0 | 20 | 学习后端的基本知识 |
第三周 | 1000 | 1000 | 50 | 进行实际后端开发 |
第四周 | 300 | 1300 | 30 | 对github的使用 |