1、链接
pattern‘s blog:
my blog:
GitHub:
2、具体分工
我做ai的算法,湘怡做前端界面。
3、PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 40 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 40 |
Development | 开发 | 180 | 240 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 60 |
· Design Spec | · 生成设计文档 | 10 | 15 |
· Design Review | · 设计复审 | 5 | 3 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 12 |
· Design | · 具体设计 | 20 | 15 |
· Coding | · 具体编码 | 90 | 150 |
· Code Review | · 代码复审 | 10 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | 30 | 40 |
· Test Report | · 测试报告 | 10 | 5 |
· Size Measurement | · 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 20 |
合计 | 490 | 705 |
4、解题思路描述与设计实现说明
网络接口的使用
这里贴上登录的函数代码,其他网络接口的使用和这个类似,就不贴了。
代码组织和内部实现说明
由于ai出牌速度在几秒内,感觉人眼看不过来,所以没有去实现对局界面的交互。把ai和ui分开了。
ai部分
代码组织
程序分为三个文件,ai.py做主要的操作流程,对手牌的操作函数放在pocket.py(emmm英语不好的我命名的时候搞错了。。),最后选取出三堆牌放在choosethree.py,分别先选取后墩中墩头墩,getbottom(),getmiddle(),gethead()。
内部实现
ai先调用网络接口部分登录,开启战局,接到牌后调用pocket.py(依次整理手牌,得到手上的牌型,返回给ai,然后在choosethree.py 中把所有可能的牌型组合一遍根据自己给的权值对每个组合进行评估。
算法关键部分实现与流程
算法关键
算法关键是再对牌型的组合上,因为每一种牌型的处理方式几乎都不一样,所以被我处理成的数据结构也会不太一样,所以在我实现起来就会略显笨拙,代码过于冗余。应该进行重构。
实现流程
# init rankdict and suitdict sdt, rdt = initdict() # 整理手牌添加到 rankdict 和 suitdict # 顺便将手牌排序下 rdt = arrange(mycard, rdt) mycard = [] + [c for r in rdt for c in rdt[r]] sdt = arrangesdt(mycard, sdt) remycard = [c for c in reversed(mycard)] # 整理出所有拥有的牌型 ct = getct(rdt, sdt) # 获取三堆牌 head, middle, bottom = getPile(mycard, rdt, sdt, ct)
5、关键代码解释
以上为组合选取bottom的代码,其他两堆类似。
可以看到代码对手牌中所有牌型的key值进行遍历,然后把所有组合结果放入队列中在等会再去出于中墩的牌祝贺,同时计算出入的牌的分数,一并放入。在最后计算三墩牌的分数
5、性能分析与改进
改进思路
将一些不必要的组合直接进行剪枝,比如当已经组合出比较大的牌型,有一些比较小的牌型可以适当地减少组合,比如以选取炸弹,就不必对两对子进行组合。尽量去除冗余。或者在每次选取组合牌型是和之前的历史最高分数相比,如果相差较多可不加入队列。
性能分析图
7、单元测试
class MyTestCase(unittest.TestCase): def test_sanshunzi(self): list0 = shisanshui.list0 result = shisanshui.sanshunzi(list0) self.assertEqual(result, 1) if __name__ == '__main__': unittest.main()
8、Github的代码签入记录
9、遇到的代码模块异常或结对困难及解决方法
问题描述
- 使用pyqt制作ui界面之疯狂踩坑,一直报错Process finished with exit code -1073740791 (0xC0000409)
尝试
- 尝试百度,谷歌,都没有这个错误的文档,只有解释说显卡内存溢出....
解决
- 最后心态炸了瞎改来一个类的继承,突然就可以了...发现是在pyqt里的代码只要运行有错,不管什么错都同一出现以上情况 -1073740791 (0xC0000409),并且没有错误提示,只能自己debug。
收获
- 收获了好多深夜打代码的快乐时光:)
10、评价你的队友
值得学习的地方
需要改进的地方