第二次结对编程作业
1、博客链接,Github项目地址
2、具体分工
- 前端:陈舒洋,设计十三水界面和交互
- 后端:陈明磊,负责算法设计
3、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 70 |
Estimate | 估计这个任务需要多少时间 | 1500 | 1600 |
Development | 开发 | 0 | |
Analysis | 需求分析(包括学习新技术) | 50 | 70 |
Design Spec | 生成设计文档 | 45 | 40 |
Design Review | 设计复审 | 5 | 10 |
Coding Standard | 代码规范(为开发制定合适的规范) | 0 | 0 |
Design | 具体设计 | 700 | 800 |
Coding | 具体编码 | 0 | 0 |
Code Review | 代码复审 | 0 | 0 |
Test | 测试(自我测试,修改,提交修改) | 0 | 0 |
Reporting | 报告 | 150 | 140 |
Test Report | 测试报告 | 0 | 0 |
Size Measurement | 计算工作量 | 5 | 0 |
Postmortem & Process Improvement Plan | 事后总结并提出过程改进计划 | 20 | 30 |
合计 | 2000 | 2100 |
4、解题思路描述与设计实现说明
-
网络接口的使用
注册绑定接口:
登录接口:
开局接口:
提交接口:
战局详情接口:
历史战绩接口:
排行榜接口:
-
代码组织与内部实现设计
-
说明算法的关键与关键实现部分流程图
算法的关键:
很普通的算法,没有什么思想,主要还是遍历吧,找到最好的牌,由于数学不是很好,对于权值的应用一窍不通,所以就随便设了下权值,保证不出现“相公”的情况
代码思想:
先将拿到的手牌处理成列表,方便后续的处理,然后获取后墩的所有牌型,再接着遍历后墩所有牌型,其次遍历中墩所有牌型,算出每种牌型的权值,最后得出最大权值的牌型,就是我们要找的牌型,由于权值设置的问题,找到的牌型并不一定事最优解
5、关键代码解释
-
贴出你认为重要的/有价值的代码片段,并解释
-
这是算法实现的关键部分,当获得所有后墩牌型时,需要遍历所有牌型,再这一部分,算法实现了保证不会出现‘相公’的牌型和减少牌型遍历次数,大大减少了遍历时间,做到精确TOP1,不过由于静态权值的设定没有数学理论支撑,所以找到的最优牌型不一定是理论最优解
6、性能分析与改进
-
描述你改进的思路
- 改进的思路:
- 改进时可以采用更具有逻辑,更科学性的算法思想进行编程,做好精细的流程图的设计,力求没有累赘。
- 判断牌型的时候把时间的因素也考虑进去,在追求正确结果的基础上,尽量简化代码,消除不必要的循环的部分,将代码向时间方向进行改进。
- 判断出了牌型之后,简化对牌型的处理的步骤。
- 确定了要存放的牌后进行前中后三墩的赋值,只要赋值之后就不存在再覆盖数据的情况,使得时间的浪费更少。
- 简化输入输出的部分,之前为了答案的正确性,将这两个部分做的比较复杂,现在可以适当的简化一些 -
展示性能分析图和程序中消耗最大的函数
赋值前中后三墩这三个数组的函数最大,由于它们是存放结果的数组,对于它们的赋值,覆盖的操作比较频繁。
判断各个牌型的函数消耗都不小,由于只考虑了正确性没有考虑时间,判断牌型基本上都是多次的遍历牌面数组,以力求获取的牌型正确
7、单元测试
-
展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路
输入
```
$8$Q2#8$7&A8&2#2#6&5$2$6
&K$29#2#KA&J$10#10#Q#4$9#A
&23$K&9&810&J#10$25#J#3#9
$2$8#Q&8&9&A$KJ&K$10#5$A10
810&9&3&A$7K$2$Q#KA$J&8
$92$639*7&4$Q&3&K$7&5&Q
```输出
```
['$7 $Q &A', '#6 $6 $8 #8 8', '2 &2 #2 $2 &5']
['$2 *9 $9', '$10 &J #Q &K *A', '#2 #4 #10 #K #A']
['&J #J $K', '&2 $2 3 #3 &8', '5 &9 #9 *10 #10']
['#5 &8 &A', '&9 *10 *J #Q &K', '$2 $8 $10 $K $A']
['&8 *K #K', '$2 &3 $7 &A A', '8 &9 *10 $J $Q']
['$Q &Q &K', '&3 *7 $7 $9 9', '2 *3 &4 &5 $6']
```
随机生成牌,再自己和AI一起玩,对比自己和AI出的牌的不同,改进权值。
8、贴出Github的代码签入记录
9、遇到的代码模块异常或结对困难及解决方法
- 困难描述:在牌的算法上思路不太清晰。
- 解决尝试:打了几把13水
- 是否解决:是
- 有何收获:打13水的技术有所提升
10、评价你的队友
-
评价队友->陈舒洋
-
值得学习的地方:舒洋同学的打牌水平很高,同样是零基础学习,他学习进度比我快很多,学习能力很强。
-
需要改进的地方:少搓一点炉石(滑稽)
-
评价队友->陈明磊
-
值得学习的地方:明磊同学不仅牌技好,人也好,学习努力,人也帅
-
需要改进的地方:少学一点,多注重养生(滑稽)
11、学习进度条
- 后端(陈明磊)
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 7 | 7 | 学习Axure RP |
2 | 600 | 600 | 15 | 22 | 写算法 |
3 | 200 | 800 | 8 | 30 | 学习网络接口的使用 |
- 前端(陈舒洋)
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 6 | 6 | 学习Axure RP |
2 | 0 | 0 | 20 | 26 | 学习HTML+CSS+JS |
3 | 1000 | 1170 | 30 | 56 | 写前端的网站和交互 |