• 第二次结对编程作业


    一、一些链接

    结对同学的博客链接
    本作业的博客链接
    所Fork的同名仓库的Github项目地址
    十三水视频

    二、具体分工

      由于比较缺乏经验,我们分工没有特别明确,很多东西都是一起查资料一起学一起完成的。
      侯雅倩主要负责后端的实现,林晓锋主要负责前端。
    

    三、PSP表格

    PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    · Planning · 计划 120 200
    · Estimate · 估计这个任务需要多少时间 1730 2390
    · Development · 开发 60 180
    · Analysis · 需求分析 (包括学习新技术) 350 400
    · Design Spec · 生成设计文档 120 100
    · Design Review · 设计复审 90 80
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 150 260
    · Design · 具体设计 100 250
    · Coding · 具体编码 300 360
    · Code Review · 代码复审 60 120
    · Test · 测试(自我测试,修改代码,提交修改) 100 120
    · Reporting Standard · 报告 100 80
    · Test Repor · 测试报告 60 80
    · Size Measurement · 计算工作量 60 50
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 50
    · · 合计 1730 2390

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

    1.网络接口的使用

      我们借鉴了同学设置的网络接口,包括History中排行榜、历史战局列表,Game中的开启战局和出牌,Auth中的注册、登录和注销。
    

    register
    send
    login
    receive

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

      代码组织:一开始写得比较乱,而且代码的冗余度很高,后来将各种牌型,比如同花顺、炸弹、葫芦、顺子、三条、两对、一对、单牌等各设置成函数,进行分类讨论,其中还要讨论很多特殊情况,比如同一张牌同时满足两种牌型的抉择,两种牌型不能同时存在等。最后是通过list来输出。
    

      内部实现设计(类图):
    



        程序中消耗最大的为cal.py,在此程序中调用了其他程序文件导致时间开销增大,然后又因为使用方法不是最佳,又增加了大量开销。
    

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

      算法的关键:把判断各种牌型,比如顺子、对子、单牌、同花等各设置成函数,再进行分类讨论和大小的比较,要考虑到花色和大小两个因素。最后把三墩牌按照大、中、小顺序依次放入列表中输出。
      流程图:
    


    总的过程

    从大牌型开始判断

    五、关键代码解释

    贴出你认为重要的/有价值的代码片段,并解释。

    def singleCardCompare(a,b):
    if a!=b and (a!=1 and b!=1):
        if a>b:
            return 1
        else:
            return -1
    elif a!=b and (a==1 or b==1):
        if a==1:
            return 1
        else:
            return -1
    elif a==b:
        return 0
    

    十三水中比较单张牌点数大小,由于A比较特殊,需要特判

    def isshunzi(**bucket):   #顺子
    cnt=0
    for j,i in bucket.items():
        if j=='A':
            continue
        if i!=0:
            cnt = cnt + 1
            if cnt>=5 :
                return True,j
        else :
            cnt=0
    if cnt==4:
        if bucket['A']!=0:
            return True,'A'
    return False,'N'
    

    判断是否是顺子,由于A2345不算,故从2开始计算,存在五张连续牌则认为是顺子

    def isduizi(**bucket): #对子
    for i in bucket.values():
        if i==2:
            return True
    return False
    

    判断是否有对子是形成点数桶之后,使用字典键值进行判断,对同花的判断也是如此,形成花色桶之后统计同一种花色牌的数量

    def ishulu(**bucket):   #葫芦
    flag=0
    for i in bucket.values():
        if i == 2:
            flag=1
            break
    for i in bucket.values():
        if i == 3 and flag ==1:
            return True
    return False
    

    对于葫芦的判断则采用一个标记位,判断既有三张同面值牌又有两张同面值牌

    六、性能分析与改进

    1.描述你改进的思路

      一开始用的穷举法,代码量太大,也比较繁琐,分析情况很多且易遗漏。后来把几种牌型分成了几个函数,用函数进行判断,减少了很多冗余代码,也不容易出错。同时发现用脑子想不如画一画思路清晰,也在后来的处理中删除了一下本来就不可能同时出现的,互相排斥的情况,让代码得到更大的简化。十三水的情况比较多,也应该有清晰的注释,便于后期的检查、处理和改进。
      现在的代码仍存在暴力穷举的问题,还需要进一步的改进。
    

    2.展示性能分析图和程序中消耗最大的函数


    程序中消耗最大的为cal.py,在此程序中调用了其他程序文件导致时间开销增大,然后又因为使用方法不是最佳,又增加了大量开销。

    七、单元测试

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

      使用unittest框架编写测试用例。
      部分单元测试代码:
    


      测试的函数:
    


      构造测试数据的思路:
      不能太过于简单,要想到一些较特殊的情况。比如一张牌同时满足多种牌型,如何取舍。炸弹、三条所带的剩余的牌如何选择等。
    

    八、Github的代码签入记录

    记录commit信息

      commit了sand.py,register.py,receive.py,login.py,cal.py,cal(4).py,cal(5).py。
    

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

    1.问题描述

      结对过程中的最大困难就是两个人都没有项目经历,所有的东西都需要现学,在网上查过很多代码,一开始都看不懂。最大的问题是做了很多无用功。由于缺乏经验,对接口、前端、后端的了解贫乏,开始的时候比较懵,在想着如何实现发牌等和作业关系不大的事情,也查了比较多这方面的资料。
    

    2.做过的尝试

      由于没做过项目,拿到题目有点慌张~果断选择了去网上查代码。将现有代码进行修改。但是,,由于有些代码看不太懂,还有一些要做比较大量的修改等原因,尝试了一段时间后最终无奈放弃。选择自己写!
    

    3.是否解决

      对于前段的部分,我们使用了Thimble在线编辑器,在线学习编写HTML。对于后端的部分,决定自己编写,也看了网上的一些代码,最终基本实现了题目要求。
    

    4.有何收获

      每次的软工作业都打开了我们探索新世界的大门呀~这次的收获是学会了基本的前端,也懂得怎么样去使用接口,同时进一步加强了对python的了解。
    

    十、评价你的队友

    1.值得学习的地方

      我的队友敲牛逼!!
      两个小白收到作业任务内心是拒绝的。但是我的队友总能在完全没有思路,不知道从何开始的时候,指引方向!
      她的效率极高,自学能力也很强,总是能在工作学习的时候集中注意力,高效地完成任务。
      心理素质也很强!在快到截止时间临危不乱。
    

    2.需要改进的地方

      我的队友很好~唯一需要改进的地方就是我们这次作业还是太拖了一丢丢,两个火烧眉毛的人才开始灭火哈哈,下次我们要抓紧时间!
    

    十一、学习进度条

    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 0 0 2 2 熟悉java语言的基本数据类型、函数
    2 400 400 36 38 熟悉python语言的变量和数据类型、List和Dict类型、一些基本库的使用,比如cpca,以及正则表达式。
    3 200 600 10 48 通过学习GUI Design Studio,初步认识了原型设计,懂得插入一些窗体与对话框,使用工具栏与菜单等。
    4 800 1400 36 84 通过在线编辑器Thimble在线学习编写HTML,懂得如何插入背景图,修改字体颜色、大小等一些常规操作;进一步对python里的字典等概念有了更深入的认识。
  • 相关阅读:
    怎样在黑窗口中查找各种端口
    [Selenium] 数字显示的月份转换为英文显示
    [Selenium] 根据预期的日期格式,获取昨天的日期
    [Selenium] 使用Javascript选中Input框里的内容,然后清空
    Java中for循环遍历List的两种方法
    [Selenium]点击Calendar控件后,Calendar dialog很快消失
    springboot @Slf4j 配置
    springboot线程中获取spring beans
    org.junit.Test 注解失效的问题The import org.junit cannot be resolved
    二叉树java遍历实现
  • 原文地址:https://www.cnblogs.com/Little-feng/p/11681585.html
Copyright © 2020-2023  润新知