第二次结对编程作业
组内UI视频
王耀鑫+林银河
沈梓耀+黄恒杰
许培荣+陈湘怡
陈超颖+林鑫灿(8)
陈志荣+林明镇
滕佳+何佳琳
1.链接
2.具体分工
- 林银河:完成AI的实现
- 王耀鑫:完成UI的实现
3.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
Estimate | 估计这个任务需要多少时间 | 600 | 700 |
Development | 开发 | 1200 | 1800 |
Analysis | 需求分析 (包括学习新技术) | 100 | 300 |
Design Spec | 生成设计文档 | 10 | 10 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 10 | 20 |
Coding | 具体编码 | 500 | 700 |
Code Review | 代码复审 | 5 | 5 |
Test | 测试(自我测试,修改代码,提交修改) | 5 | 5 |
Reporting | 报告 | 10 | 15 |
Test Repor | 测试报告 | 5 | 5 |
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 5 | 10 |
合计 | 1285 | 1815 |
4.解题思路描述与设计实现说明
- 网络接口的使用
- 按照所给的网络接口进行连接
- 将接收到的数据,使用正则表达式,转化成合适自己代码的数据
- 将自己代码运行后得到的数据,转换成合适的形式,使用网络接口,传回
- 代码组织与内部实现设计(类图)
- 说明算法的关键与关键实现部分流程图
- 算法的关键是进行组合和筛选
- 关键实现部分流程图
5.关键代码解释
def cmb(list0):
list1 = list0.copy()
iter1 = itertools.combinations(list1, 5)
for tup0 in iter1:
listc = list(tup0)
list1 = list0.copy()
for i in range(5):
list1.remove(listc[i])
iter2 = itertools.combinations(list1, 5)
for tup1 in iter2:
liste = list(tup1)
list2 = list0.copy()
for i in range(5):
list2.remove(listc[i])
for i in range(5):
list2.remove(liste[i])
a = score(listc, 5)
b = score(liste, 5)
c = score(list2, 3)
if (a >= b) and (b >= c):
s[1] = a + 2 * b + 3 * c
if s[1] > s[0]:
s[0] = s[1]
global result
result.clear()
for k in range(3):
result.append(list2[k])
for k in range(5):
result.append(liste[k])
for k in range(5):
result.append(listc[k])
我这一段代码采用组合的方法,即先从13张牌中随机选出5张,再从剩下的8张牌中选出5张,最后剩下3张。找出所有的情况,再进行判断,选出符合规则的组合方式,给从从选出比较好的方式。
6.性能分析与改进
- 在刚开始设计AI的实现方法时,我想过使用贪心算法,先找到5张组合在一起最大的牌,放在底墩,再找5张第二大的牌,放在中墩,最后三张放在头墩。这样就符合规则了,但是这种情况下选出的牌,赢得概率不大,就放弃了这种思路,改用组合的方法。
- 性能分析图
- 其中消耗最大的函数是我用来进行组合操作和筛选操作的cmb()函数(在上面我已经展示了),而且消耗第二大的函数score()函数和它相差不大,因此我就展示一下我的score()函数,这个函数是来为每一种组合中的每一墩给分的
def score(list, m):
if m == 5:
f = tonghuashun(list)
if f:
return 100000+f*700
f = zhadan(list)
if f:
return 90000+f*700
f = hulu(list)
if f:
return 80000+f*700
f = tonghua(list)
if f:
return 70000+f*0.000007
f = shunzi(list)
if f:
return 60000+f*700
f = santiao(list)
if f:
return 50000+f*700
f = liandui(list)
if f:
return 40000+f*7
f = erdui(list)
if f:
return 30000+f*7
f = duizi(list)
if f:
return 20000+f*700
f = sanpai(list)
if f:
return 10000+f*0.000007
elif m == 3:
f = tonghuashun(list)
if f:
return 100000+f*0.07
f = tonghua(list)
if f:
return 70000+f*0.07
f = shunzi(list)
if f:
return 60000+f*700
f = santiao(list)
if f:
return 50000+f*700
f = duizi(list)
if f:
return 20000+f*700
f = sanpai(list)
if f:
return 10000+f*0.07
7.单元测试
import unittest
import shisanshui
class MyTestCase(unittest.TestCase):
def test_sanshunzi(self):
list0 = shisanshui.list0
result = shisanshui.sanshunzi(list0)
self.assertEqual(result, 1)
if __name__ == '__main__':
unittest.main()
- 这是用来测试是否是三顺子这种特殊牌型的测试代码,
- 测试数据的构造思路
- 选择了5顺子和3顺子有交叉部分,另一个5顺子则与它们没有交叉,其中三顺子在前和在后这两种情况都有,
- 选择了两个5顺子有交叉部分,3顺子与它们没有交叉部分
- 选择三个顺子都有交叉部分的各种情况
8.贴出Github的代码签入记录
9.UI展示
视频地址
-
登录界面
-
注册界面
-
主页
-
出牌界面
-
历史对局
-
排行榜
-
对局详情
10.遇到的代码模块异常或结对困难及解决方法(8分)
- 问题描述
- 反复尝试页面跳转不出来,有时页面跳转后里面的按钮和内容全都消失。
- 一点击页面就闪崩或退出
- 有时会跳出无关页面,用户体验差
- API不会调用,经常性报错。
- 出牌不会做,正在努力。
- 做过哪些尝试
- 页面一直显示不出来,更换了窗口类型,甚至于后面直接推翻重来。
- 百度查找资料,b战看视频,向大佬请教
- 借鉴别人的代码,在别人的基础上模仿改进,解决一些问题。
- 是否解决
- 基本解决,出牌还是不会。
- 有何收获
- 学习QT5应该多借鉴一些其他资料,不要局限于部分教程。
- 熬夜是真真真伤身体。
- 提升自己审美,比起之前的设计好很多了。
- 代码能力还是有待改进,应持续学习,及时补缺补漏。
10.评价你的队友
- 值得学习的地方
-提前学习相关技术,为敲代码做好准备,能够认真完成AI部分,平常十一多点睡的经常肝到一点。 - 需要改进的地方
-需要持续提升自己,能力方面不全面,需要补齐短板
11.学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 300 | 300 | 10 | 10 | 学会了java和墨刀的使用 |
2 | 50 | 350 | 10 | 15 | 学习python的使用 |
3 | 200 | 550 | 12 | 27 | 学习QT5 |
4 | 150 | 700 | 8 | 35 | 学习QT5 |