• 第二次结对编程作业


    结对同学
    本作业博客的链接
    GitHub地址

    UI百度网盘提取链接 提取码: ehjr

    具体分工

    林镕炜

    • 调用api接口

    • 将原型转化成UI界面

    • 页面逻辑设计以及登入注册、打牌、排行榜、历史记录等功能实现

      使用工具:pyqt5

    陈锦杰

    • 打牌算法设计
    • 博客编辑
    • 代码上传到GitHub
      使用工具:Pycharm、Git

    PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning · 计划 50 60
    Estimate · 估计这个任务需要多少时间 30 40
    Development · 开发 1000 1200
    Analysis · 需求分析(包括学习新技术) 900 1000
    Design Spec · 生成设计文档 40 30
    Design Review · 设计复审 30 60
    Coding Standard · 代码规范(为开发制定合适的规范) 30 40
    Design · 具体设计(用伪代码,流程图等方法来设计具体模块) 200 500
    Coding · 具体编码 1500 1600
    Code Review · 代码复审 30 40
    Test · 测试(自我测试,修改,提交修改) 80 100
    Reporting · 报告 100 100
    Test Report · 测试报告 30 30
    Size Measurement · 计算工作量 10 15
    Postmortem & Process Improvement Plan · 事后总结并提出过程改进计划 60 60
    合计 4020 4875

    解题思路描述与设计实现说明

    • 网络接口的使用
      主要用到Post和Get两种方法,作业上有相关接口,只需引用即可。

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

    • 说明算法的关键与关键实现部分流程图

    • ui活动图

    关键代码解释

    def getcard(list1,list2):#出牌
        x1=tuple(list1)
        d=0
        v1=value0(list2)
        v2=value1(list2)
        v3=value2(list2)
        #print(v1,v2,v3)
        ca1=[]
        ca2=[]
        ca3=[]
        for i in itertools.combinations(x1, 5):#选后墩
            c1=list(i)
            vc1=grade(c1)
            x2=tuple(set(list1)-set(c1))
            if(vc1[0]>1):
                for j in itertools.combinations(x2,5):#选中墩前墩
                    c2=list(j)
                    vc2=grade(c2)
                    c3=list(set(x2)-set(j))
                    vc3=grade(c3)
                    if((vc1[0]>vc2[0])and (vc2[0]>vc3[0]))or((vc1[0]==vc2[0])and( vc2[0]>vc3[0])and (vc1[1]>vc2[1]))or((vc1[0]>vc2[0])and (vc2[0]==vc3[0])and( vc2[1]>vc3[1]))or((vc1[0]==vc2[0])and (vc2[0]==vc3[0])and( vc1[1]>vc2[1])and (vc2[1]>vc3[1])):
                        m=value(v3,vc3,0)+value(v2,vc2,2)+value(v1,vc1,3)
                        a1=value(v3, vc3, 0)
                        a2=value(v2, vc2, 2)
                        a3=value(v1, vc1, 3)
                        if((a1>910)and (a2>880 )and(a3>980)):#打枪
                            m*=2
                        if ((a1>910)or (a2>880 )or(a3>980))and((value(v3,vc3,0)-910)*(value(v2,vc2,2)-880)*(value(v1,vc1,3)-980)<0):#放一水赢两水
                            m=m+650
                        elif((a1>910)or (a2>880 )or(a3>980))and((a1-820)*(a2-720)*(a3-940)<0):#不能赢时尽量不被打枪
                            m+=200
                            #print(m)
                        if m>d:
                            d=m
                            ca1=c1
                            ca2=c2
                            ca3=c3
        ca3=f(ca3)
        ca2=f(ca2)
        ca1=f(ca1)
        return [ca3,ca2,ca1]
    

    这段代码为关键代码,这段代码主要的是通过权值进行权衡。主要有三种情况,当三墩牌组出比较一般的情况下,通过权衡可以放弃其中的一墩牌使其他两墩牌能更大;当三墩牌能达到一定的权值下可以考虑平均三墩使三墩牌较大更有概率打枪;当三墩牌不太理想的情况下可以将其中一墩造大使自己不被打枪。通过这些权衡处理后得出权值最高的牌。

    性能分析与改进


    消耗最大的函数是request函数,主要时间花费在服务器响应上。
    改进:原本使用组合数时没有筛除后墩无需继续判断的牌型,导致在组合数上浪费较多的时间,改进后出牌速度大幅提升。

    单元测试

    展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路

    def gameopen(token):
        url = "http://api.revth.com/game/open"
        headers = {'x-auth-token': token}
        response = requests.request("POST", url, headers=headers)
        #print(response.text)
        dict_data = str(json.loads(response.text))
        #print(dict_data)
        p=re.compile("'id': (.+?),")
        id=p.findall(dict_data)
        #print(id)
        p=re.compile("card': '(.+?)'")
        card=p.findall(dict_data)[0]
        #print(card)
        id.append(card)
        return id
    

    这个代码的单元测试主要来判断正则是否正确

    def getjson(id,list):#转化json格式
       z=['','','']
       for i in range(0,len(list)):
           for j in range(0,len(list[i])):
               z[i]=z[i]+list[i][j]
               if(j!=len(list[i])-1):
                   z[i]=z[i]+' '
       data = {'id': id, 'card':z}
       #string = json.dumps(data, ensure_ascii=False)
       return data 
    

    这个的单元测试来判断json格式是否正确
    还有就是核心代码的m来查看权值

    贴出Github的代码签入记录

    遇到的代码模块异常或结对困难及解决方法

    问题描述

    在这次结对编程中最大的问题就是与API对接从API中获取数据以及上传数据到API。

    做过哪些尝试

    刚开始不知道怎么调用API测试代码就成了一个问题,最后我们通过python的random模块随机生成卡牌。但这治标不治本我们就去百度和询问柯老师班的同学来解决这个问题。

    是否解决

    已解决

    有何收获

    有时候不懂去请教别人比自己盲目探求的效率来得高,不管是问来还是查来的只要我们能很好的掌握这都是我们的知识。

    评价你的队友

    值得学习的地方与需要改进的地方

    陈锦杰:
    队友一个字形容“强”,开始编程的时候前后端任我挑自己虽然不太懂的前端也在他的自学下做得非常好,他最值得我学习的地方就是“不会找度娘”,如果针对这次结对编程来说队友做的很好带改进的就是要做的更好。
    林镕炜:
    队友很强,作业出来之后,他做ai,我做ui,本来还打算跟他一起探讨一下ai,没想到他第三天就完事了,效率高得可怕。最值得我学习的地方就是工作态度,我太拖了。对队友的改进的建议是下次别再一个人默默肝完了,哈哈。

    #学习进度条##

    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 0 0 10 10 界面设计
    2 210 210 20 30 API、UI学习
    3 480 690 25 55 用pyqt5完成UI设计
  • 相关阅读:
    Oracle死锁
    Oralce新建用户及表空间维护
    oracle作业运行中,无法停止
    ora-01652 无法通过128 (在表空间 TEMP中)扩展temp段
    Centos7搭建Apache2.4
    LAMP搭建
    Mysql数据库
    VSFTPD服务器
    windows下划分逻辑分区
    sendmail邮件服务器
  • 原文地址:https://www.cnblogs.com/-rain77/p/11751029.html
Copyright © 2020-2023  润新知