第二次结对编程作业

≡放荡痞女 提交于 2019-12-01 10:19:09

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画类图、流程图
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!