首页 > 技术文章 > 第二次结对编程作业

cmlei 2019-10-30 23:02 原文

1、博客链接,Github项目地址

031702439陈舒洋

031702431陈明磊

Github项目地址

2、具体分工

  • 前端:陈舒洋,设计十三水界面和交互
  • 后端:陈明磊,负责算法设计

3、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 50 70
Estimate 估计这个任务需要多少时间 1500 1600
Development 开发 0
Analysis 需求分析(包括学习新技术) 50 70
Design Spec 生成设计文档 45 40
Design Review 设计复审 5 10
Coding Standard 代码规范(为开发制定合适的规范) 0 0
Design 具体设计 700 800
Coding 具体编码 0 0
Code Review 代码复审 0 0
Test 测试(自我测试,修改,提交修改) 0 0
Reporting 报告 150 140
Test Report 测试报告 0 0
Size Measurement 计算工作量 5 0
Postmortem & Process Improvement Plan 事后总结并提出过程改进计划 20 30
合计 2000 2100

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

  • 网络接口的使用

    注册绑定接口:

    登录接口:

    开局接口:

    提交接口:

    战局详情接口:

    历史战绩接口:

    排行榜接口:

  • 代码组织与内部实现设计

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

    算法的关键:

    很普通的算法,没有什么思想,主要还是遍历吧,找到最好的牌,由于数学不是很好,对于权值的应用一窍不通,所以就随便设了下权值,保证不出现“相公”的情况

    代码思想:

    先将拿到的手牌处理成列表,方便后续的处理,然后获取后墩的所有牌型,再接着遍历后墩所有牌型,其次遍历中墩所有牌型,算出每种牌型的权值,最后得出最大权值的牌型,就是我们要找的牌型,由于权值设置的问题,找到的牌型并不一定事最优解


5、关键代码解释

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

  • 这是算法实现的关键部分,当获得所有后墩牌型时,需要遍历所有牌型,再这一部分,算法实现了保证不会出现‘相公’的牌型和减少牌型遍历次数,大大减少了遍历时间,做到精确TOP1,不过由于静态权值的设定没有数学理论支撑,所以找到的最优牌型不一定是理论最优解

6、性能分析与改进

  • 描述你改进的思路

    - 改进的思路:
    - 改进时可以采用更具有逻辑,更科学性的算法思想进行编程,做好精细的流程图的设计,力求没有累赘。
    - 判断牌型的时候把时间的因素也考虑进去,在追求正确结果的基础上,尽量简化代码,消除不必要的循环的部分,将代码向时间方向进行改进。
    - 判断出了牌型之后,简化对牌型的处理的步骤。
    - 确定了要存放的牌后进行前中后三墩的赋值,只要赋值之后就不存在再覆盖数据的情况,使得时间的浪费更少。
    - 简化输入输出的部分,之前为了答案的正确性,将这两个部分做的比较复杂,现在可以适当的简化一些

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

    赋值前中后三墩这三个数组的函数最大,由于它们是存放结果的数组,对于它们的赋值,覆盖的操作比较频繁。
    判断各个牌型的函数消耗都不小,由于只考虑了正确性没有考虑时间,判断牌型基本上都是多次的遍历牌面数组,以力求获取的牌型正确

7、单元测试

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

    输入

    ```
    $8$Q2#8$7&A8&2#2#6&5$2$6
    &K$29#2#KA&J$10#10#Q#4$9#A
    &23$K&9&810&J#10$25#J#3#9
    $2$8#Q&8&9&A$K
    J&K$10#5$A10
    810&9&3&A$7
    K$2$Q#KA$J&8
    $9
    2$639*7&4$Q&3&K$7&5&Q
    ```

    输出

    ```
    ['$7 $Q &A', '#6 $6 $8 #8 8', '2 &2 #2 $2 &5']
    ['$2 *9 $9', '$10 &J #Q &K *A', '#2 #4 #10 #K #A']
    ['&J #J $K', '&2 $2 3 #3 &8', '5 &9 #9 *10 #10']
    ['#5 &8 &A', '&9 *10 *J #Q &K', '$2 $8 $10 $K $A']
    ['&8 *K #K', '$2 &3 $7 &A A', '8 &9 *10 $J $Q']
    ['$Q &Q &K', '&3 *7 $7 $9 9', '2 *3 &4 &5 $6']
    ```
    随机生成牌,再自己和AI一起玩,对比自己和AI出的牌的不同,改进权值。

8、贴出Github的代码签入记录

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

  • 困难描述:在牌的算法上思路不太清晰。
  • 解决尝试:打了几把13水
  • 是否解决:是
  • 有何收获:打13水的技术有所提升

10、评价你的队友

  • 评价队友->陈舒洋

  • 值得学习的地方:舒洋同学的打牌水平很高,同样是零基础学习,他学习进度比我快很多,学习能力很强。

  • 需要改进的地方:少搓一点炉石(滑稽)

  • 评价队友->陈明磊

  • 值得学习的地方:明磊同学不仅牌技好,人也好,学习努力,人也帅

  • 需要改进的地方:少学一点,多注重养生(滑稽)

11、学习进度条

  • 后端(陈明磊)
第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 7 7 学习Axure RP
2 600 600 15 22 写算法
3 200 800 8 30 学习网络接口的使用
  • 前端(陈舒洋)
第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 6 6 学习Axure RP
2 0 0 20 26 学习HTML+CSS+JS
3 1000 1170 30 56 写前端的网站和交互

推荐阅读