1.导航
博客链接
队友本作业博客链接
Github
2.具体分工
- 我负责前、后端
- 队友负责算法与博客撰写
3.PSP表格
PSP2.1 | Personal Software Process Stages |
预估耗时(min) | 实际耗时(min) |
---|---|---|---|
Planning | 计划 | 60 | 90 |
Estimate | 估计这个任务需要多少时间 | 90 | 120 |
Development | 开发 | 600 | 1200 |
Analysis | 需求分析 (包括学习新技术) |
90 | 120 |
Design Spec | 生成设计文档 | 60 | 90 |
Design Review | 设计复审 | 60 | 90 |
Coding Standard | 代码规范 (为开发制定合适的规范) |
60 | 60 |
Design | 具体设计 | 60 | 120 |
Coding | 具体编码 | 480 | 600 |
Code Review | 代码复审 | 120 | 240 |
Test | 测试 (自我测试,修改,提交修改) |
180 | 240 |
Reporting | 报告 | 90 | 120 |
Test Report | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan |
事后总结 并提出过程改进计划 |
30 | 30 |
合计 | 2030 | 3200 |
4.解题思路与设计实现
i. 网络接口的使用
没什么可说的,用POST请求注册、登录,拿到登录响应返回的token,附加在开局和出牌的Header里即可。
ii.代码组织与ii内部实现设计(类图)
iii.算法的关键与关键实现部分流程图
- 运用了贪心算法,先判断特殊牌型,如果是则直接提交。每次从剩余手牌中挑出最大的那个组合,加入预提交列表并从手牌中移除,递归地执行上述步骤,直到墩数等于三。最后把剩余手牌按小到大插入后墩、中墩、前墩,以满足要求。
5.关键代码解释
牌型的处理中顺子是最不好处理的,所以贴一下这部分的代码。
- 先把手牌切割成多个严格递增的序列:
val shunziList = mutableListOf<MutableList<Card>>() val copy: MutableList<Card> = cards.reversed().toMutableList() while (copy.size != 0) { val temp = mutableListOf<Card>() temp.add(copy[0]) for (i in 1..copy.lastIndex) { if (copy[i].num == temp.last().num - 1) { temp.add(copy[i]) } } shunziList.add(temp) copy -= temp }
- 顺子有可能重合,如果满足条件,可以将其合并。如下图所示:
如果出现花括号中的组合,例如:456789和5678,就可以合并。根据牌量和5的差值(这里4和5的差值是1,所以从下标1开始就可以合并),可以得到开始合并的下标。具体实现:
hunziList.forEach { println(it) } outer@ for (i in 0..shunziList.lastIndex) { if (shunziList[i].size > 5) { for (j in i + 1..shunziList.lastIndex) { val sumSize = shunziList[i].size + shunziList[j].size if (sumSize == 10) { val index = 5 - shunziList[j].size if (shunziList[i].subList(index, 5) == shunziList[j]) { val subList = shunziList[i].subList(0, index) shunziList[j] = (subList + shunziList[j]).toMutableList() shunziList[i].minusAssign(subList) break@outer } } else if (sumSize == 8) { if (shunziList[j].size == 1) { val num = shunziList[j][0].num if (num == shunziList[i][0].num + 1) { val subList = shunziList[i].subList(0, 2) shunziList[j] = (shunziList[j] + subList).toMutableList() shunziList[i].minusAssign(subList) break@outer } else if (num == shunziList[i].last().num - 1) { val last = shunziList[i].lastIndex val subList = shunziList[i].subList(last - 1, last + 1) shunziList[j] = (shunziList[j] + subList).toMutableList() shunziList[i].minusAssign(subList) break@outer } } else { val sub1 = shunziList[i].subList(1, 3) val sub2 = shunziList[i].subList(3, 5) if (sub1 == shunziList[j]) { val subList = shunziList[i].subList(0, 1) shunziList[j] = (subList + shunziList[j]).toMutableList() shunziList[i].minusAssign(subList) break@outer } else if (sub2 == shunziList[j]) { val last = shunziList[i].lastIndex val subList = shunziList[i].subList(last, last + 1) shunziList[j] = (shunziList[j] + subList).toMutableList() shunziList[i].minusAssign(subList) break@outer } } } } } }
6.性能分析与改进
i.改进思路
ii.性能分析图、消耗最大的函数
7.单元测试
8.Github代码Commit记录
9.遇到的异常、困难及解决办法
10.评价你的队友
- 值得学习的地方:
- 需要改进的地方:
11.学习进度条
第N周 | 新增代码 (行) |
累计代码 (行) |
本周学习耗时 (小时) |
累计学习耗时 (小时) |
重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 7 | 7 | 学会了Axure的基本使用 |
2 | 0 | 0 | 0 | 0 | 无 |
3 | 0 | 0 | 15 | 22 | Python和PyQt5的基本使用 |
4 | 4200 | 4299 | 50 | 72 | 学会了使用Visio画类图、流程图 |