第二次结对编程作业 (补充)UI界面展示 一. 博客链接、github链接 二. 具体分工 三. PSP表格 四. 解题思路描述与设计实现说明 五. 关键代码解释 六. 性能分析与改进 七. 单元测试 八. Github的代码签入记录 九. 代码模块异常或结对困难及解决方法 十. 评价队友 十一. 总结

第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结

一. 博客链接、github链接

本次作业博客
队友李季城
github地址

二. 具体分工

陈银山:书写十三水出牌逻辑、调用接口
李季城:收集材料、书写博客

三. 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:
第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结
接口2:
第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结
接口3:
第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结

2. 代码组织与内部实现设计(类图)

以下是所有代码的类图:
第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结

3. 算法的关键与关键实现部分流程图

算法流程图如下:
第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结

五. 关键代码解释

将所有的牌附上权值,贪心最优的牌型出牌

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 #返回散牌

六. 性能分析与改进

解决思路:中墩和后墩耗时是最大的,这是由于在前期没有采用贪心算法,直接暴力枚举,枚举每一种牌型,所以造成了出牌速度十分慢,后面对算法进行了改进,采用了部分贪心使得算法复杂度降低,提高了运行效率。
第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结

七. 单元测试

示范:
输入:
*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
(连接出了点问题,没有办法显示后端)
第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结

八. Github的代码签入记录

第二次结对编程作业
(补充)UI界面展示
一. 博客链接、github链接
二. 具体分工
三. PSP表格
四. 解题思路描述与设计实现说明
五. 关键代码解释
六. 性能分析与改进
七. 单元测试
八. Github的代码签入记录
九. 代码模块异常或结对困难及解决方法
十. 评价队友
十一. 总结

九. 代码模块异常或结对困难及解决方法

问题:
前期:遇到的问题 :
刚开始接触题目的时候,觉得无从下手,甚至不知道该如何打代码,有一种深深的挫败感。
解决方法:
先要了解十三水的规则,叫上了舍友和班上几个玩的比较好的同学一起玩十三水,甚至下了奶茶的赌注,玩了整整一个晚上终于熟悉了十三水的规则。
上网疯狂的百度教程和debug
感想:
开始的时候接口连接一直错误。客户端的后墩、中墩没有办法算出,通过成千上万次的百度和学习终于完成了这个作业。

十. 评价队友

由于队友参加了互联网+比赛,没有太多的时间写代码,但还是积极的提供各种材料,画好原型和攥写博客的!

十一. 总结

通过这次的作业,学习了不少的关于Pygame的知识还有python的知识,感觉自己写一个游戏其实还是有点困难的,从一开始的完全不知道到一点一点的慢慢学习,再到最后的项目成型的过程是十分的开心的。