第二次结对编程作业

一. 博客链接、github链接

(补充)UI界面展示


本次作业博客
队友陈银山
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:

接口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的知识,感觉自己写一个游戏其实还是有点困难的,从一开始的完全不知道到一点一点的慢慢学习,再到最后的项目成型的过程是十分的开心的。

posted @ 2019-10-15 20:22  LJC01  阅读(161)  评论(2编辑  收藏  举报