• 第二次结对编程作业


    一、一些链接

    结对同学的博客链接
    本作业的博客链接
    所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里的字典等概念有了更深入的认识。
  • 相关阅读:
    HTML DOM 12 表格排序
    HTML DOM 10 常用场景
    HTML DOM 10 插入节点
    HTML DOM 09 替换节点
    HTML DOM 08 删除节点
    HTML DOM 07 创建节点
    022 注释
    024 数字类型
    005 基于面向对象设计一个简单的游戏
    021 花式赋值
  • 原文地址:https://www.cnblogs.com/Little-feng/p/11681585.html
Copyright © 2020-2023  润新知