第二次结对编程作业
一. 博客链接、github链接
(补充)UI界面展示
二. 具体分工
陈银山:书写十三水出牌逻辑、调用接口
李季城:收集材料、书写博客
三. PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 1725 | 1905 |
· Analysis | · 需求分析 (包括学习新技术) | 120 | 530 |
· Design Spec | · 生成设计文档 | 10 | 10 |
· Design Review | · 生成设计文档 | 5 | 5 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 60 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 300 | 330 |
Reporting | 报告 | 60 | 30 |
· Test Repor | · 测试报告 | 10 | 20 |
· Size Measurement | · 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 300 |
| · 合计 | | 1810| 2010|
四. 解题思路描述与设计实现说明
1. 网络接口的使用
接口1:
接口2:
接口3:
2. 代码组织与内部实现设计(类图)
以下是所有代码的类图:
3. 算法的关键与关键实现部分流程图
算法流程图如下:
五. 关键代码解释
将所有的牌附上权值,贪心最优的牌型出牌
def standof() :
temp = 1
for i in range(1,3+1):# 前墩
end_3[i] = ans_3[i]
temp = 1
for i in range(1,5+1):#中墩
end_2[i] = ans_2[i]
temp = 1
for i in range(1,5+1): #后墩
end_1[i] = ans_1[i]
def takenum(x):
temp = 1
return x.num
def shunzi3(start) :
temp = 1
for i in range(start,start+2+1):
if number[i] < 1:
return 0
return 1
def shunzi5(start):
temp = 1
for i in range(start,start+4+1):
if number[i] < 1:
return 0
return 1
def tempof() :
for i in range(1,3+1): #前墩
ans_3[i] = temp_3[i]
for i in range(1, 5 + 1): # 中墩
ans_2[i] = temp_2[i]
for i in range(1, 5 + 1): # 后墩
ans_1[i] = temp_1[i]
def first():#设置前墩
global score
init_cnt()
x = 1
temp = 1
for i in range(0,2+1):
tempp1[i]=ans_3[i+1] #赋值
tempp1.sort(key=takenum) #将前墩改变
for i in range(1,3+1):
ans_3[i]=tempp1[i-1]
for i in range(1,3+1):
hua[ans_3[i].flower] +=1
number[ans_3[i].num]+=1
x = 1
temp = 1
for i in range(1,4+1):
if hua[i] == 3:
if shunzi3(ans_3[1].num) == 1:
k=(9.0+0.9 / 11.0 * (ans_3[1].num - 1))
score += k
return k # 3张同花顺
x = 1
temp = 1
for i in range(1,4+1):
if hua[i] == 3:
k=(6.0 +0.9/(1300+130+13)*((ans_3[3].num-1)*100+(ans_3[2].num-1)*10+(ans_3[1].num-1))*1.0 )
score += k
return k #3张同花
x = 1
temp = 1
if shunzi3(ans_3[1].num) == 1:
k=(5.0 + 0.9/11.0*(ans_3[1].num-1)*1.0)
score += k
return k #3张顺子
x = 1
temp = 1
for i in range(3,0,-1):
if number[ans_3[i].num] == 3:
k=(4.0+0.9/13.0*(ans_3[1].num - 1)*1.0)
score += k
return k#三条
x = 1
temp = 1
for i in range(3,0,-1):
if number[ans_3[i].num] == 1:
x = ans_3[i].num
if number[ans_3[i].num] == 2:
k=(1.0 + 0.9/(130+13)*((ans_3[i].num - 1)*10+x-1)*1.0)
score += k
return k#单对
x = 1
temp = 1
k=0.9 / (1300.0 + 130.0 + 13.0)*((ans_3[3].num - 1) * 100 + (ans_3[2].num - 1) * 10 + (ans_3[1].num - 1))
score += k
temp = 1
return k #返回散牌
六. 性能分析与改进
解决思路:中墩和后墩耗时是最大的,这是由于在前期没有采用贪心算法,直接暴力枚举,枚举每一种牌型,所以造成了出牌速度十分慢,后面对算法进行了改进,采用了部分贪心使得算法复杂度降低,提高了运行效率。
七. 单元测试
示范:
输入:
*5 *Q &8 &5 $8 $J $6 *3 *5 *9 &6 &J &Q
输出:
$8 $J $6
*5 *Q *3 *5 *9
&8 &5 &6 &J &Q
(连接出了点问题,没有办法显示后端)
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
问题:
前期:遇到的问题 :
刚开始接触题目的时候,觉得无从下手,甚至不知道该如何打代码,有一种深深的挫败感。
解决方法:
先要了解十三水的规则,叫上了舍友和班上几个玩的比较好的同学一起玩十三水,甚至下了奶茶的赌注,玩了整整一个晚上终于熟悉了十三水的规则。
上网疯狂的百度教程和debug
感想:
开始的时候接口连接一直错误。客户端的后墩、中墩没有办法算出,通过成千上万次的百度和学习终于完成了这个作业。
十. 评价队友
十分感谢我的队友,由于个人参加第五届“互联网+”创新创业大赛,所以只接手了这次作业的原型设计和博客撰写,队友基本一个人完成了整个项目的前后端的攥写,包括接口的调用。十分佩服队友的学习能力,一天学习,一天写代码。
十一. 总结
通过这次的作业,学习了不少的关于Pygame的知识还有python的知识,感觉自己写一个游戏其实还是有点困难的,从一开始的完全不知道到一点一点的慢慢学习,再到最后的项目成型的过程是十分的开心的。