一、

博文链接:
潘雨佳:https://www.cnblogs.com/wster/p/11749286.html
林红莲:https://www.cnblogs.com/7Hoki/p/11735541.html

Github链接:
潘雨佳:https://github.com/7Hoki/13water (fork了红莲的仓库)
林红莲:https://github.com/7Hoki/13water

二、给出具体分工

潘雨佳:主要负责后端代码,进行单元测试,对算法进行性能分析,以及接口的使用,提供部分文档资料。
林红莲:主要负责前端代码,写出主要框架,提供部分文档资料,美化页面并且进行定位和交互处理,文档撰写。

三、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 50 60
·Estimate ·估计这个任务需要多少时间 100 150
·Development ·开发 12000 12000
·Analysis ·需求分析 (包括学习新技术) 6000 6700
·Design Spec ·生成设计文档 200 180
·Design Review ·设计复审 120 150
·Coding Standard ·代码规范(为开发制定合适的规范) 500 480
·Design ·具体设计 480 500
·Coding ·具体编码 1000 1200
·Code Review ·代码复审 8000 8000
·Test ·测试(自我测试,修改代码,提交修改) 300 400
·Reporting ·报告 150 120
·Test Report ·测试报告 70 60
·Size Measurement ·计算工作量 40 30
·Postmortem & Process Improvement Plan ·事后总结, 并提出过程改进计划 50 60
·Total ·总计 12000 12000

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

1、网络接口的使用

因为我们的前端是使用js写的,所以接口是js的类型,因为有样例所以比较简单。
  具体说明在以下代码中:
登录接口

注册和绑定接口

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

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

算法关键:

  • 1、将得到的牌处理成数组,进行排列组合,使得所有的牌型都计算出来。
  • 2、保留一个最大的得分值和得分牌型,之后遍历所有的组合,计算每一种牌型得分,如果这种牌型符合条件,且得分大于之前的最大得分,则更新最大的得分值和得分牌型。
  • 3、便利完所有牌型之后,最大的得分牌型返回给服务器。

流程图:

五、关键代码解释

1、得到十三张牌并求出分成前、中、后墩的所有可能情况:

用used数组来判断得到的十三张牌分别是属于哪一墩的,其中1表示属于为前墩,0表示属于中墩,2表示属于后墩。

2、获取一墩牌的分数的算法:

  • score1()用来判断前墩的牌型和获取前墩的分数:
    用数组a表示牌上的数字
    因为前墩只有三条、一对或散牌,所以用if语句判断。
  • score2()用来判断中墩和后墩的牌型并获取中墩和后墩的分数:
    用数组a表示牌上的数字,数组b表示花色
    用if语句和node标记判断是哪一种牌型,具体说明在以下代码中注释

六、性能分析与改进

1、性能分析

2、改进

  • 改进前的思路:
    先进行判断,判断是否为特殊牌型,之后再列举所有牌型,得到最高分数的出牌方案。
  • 存在问题:
    有些牌型本来就是最大的牌型,在开始出牌的时候,判断是否是特殊牌型会比较麻烦,也会有很多消耗。
  • 改进后的思路:
    将一些不必要的组合直接进行剪枝,直接枚举所有牌型得出的方案就会是最大牌型,减少了消耗。再比如当已经组合出比较大的牌型,有一些比较小的牌型可以适当地减少组合,比如以选取炸弹,就不必对两对子进行组合。尽量去除冗余。或者在每次选取组合牌型是和之前的历史最高分数相比,如果相差较多可不加入队列。

七、单元测试

1、测试函数说明:

单元测试 测试项 被测试代码 功能
test_lol 分别测试3张牌和5张牌的情况 main.py 将牌型转换成字符串
test_score2 测试5张牌的情况 main.py 将牌型转换成分数

2、单元测试代码:

进行了十组单元测试,单元测试代码如下:

3、测试结果:

4、构造测试数据的思路:

  • test_lol部分:考虑到有3张牌的情况和5张牌的情况,5张牌的情况更多,所以5张牌的测试数据更多,3张牌的数据采用了乌龙,5张牌的数据采用了二对子、顺子、铁支、同花顺四种情况,这样乌龙和具有牌型的情况都能够被测试到。
  • test_score2部分:函数本身是用于进行中墩和后墩的分数转换,因为5张牌的情况更多,所以用了这个函数,数据采用了同花顺、铁支、乌龙、顺子、三条五种情况,这样乌龙和具有牌型的情况都能够被测试到

八、Github的代码签入记录

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

1、没有开发经验

问题描述:

  • 之前没有了解过前端和后端的知识,js也不懂,所以基本是边学习边实践的状态。

做过哪些尝试:

  • 先粗略的看一下相关课程,然后边百度边实践。
    是否解决:
  • 是,解决了。

有何收获:

  • 对前端有了更多的了解,增加了实战经验。学习了前端的相关知识,后端和接口的使用也有所了解,感觉十分受用。

2、前端相关功能实现过程比较艰难

问题描述:

  • 对接口的使用不熟练,由于是边学边实践,所以效率大打折扣,经常需要百度。

做过哪些尝试:

  • 有些百度解决不了的问题,通过请教其他同学也解决了,终于完成了接口的链接。

是否解决:

  • 是,解决了。

有何收获:

  • 对于陌生的东西不会像以前那么排斥了,更加熟练利用百度和身边的各种资源来解决遇到的困难。

3、不了解游戏的玩法

问题描述:

  • 之前没玩过,对打牌的技巧不够熟练,多种牌型不同组合虽然不保证每一墩都最大,但是尽可能让多的墩赢,这方面思路比较匮乏。

做过哪些尝试:

  • 和队友实战了几局,熟悉了一下出牌套路,开始研究怎么转换为算法。

是否解决:

  • 是,解决了。

有何收获:

  • 学会了把生活中的例子转换为算法表达出来,例如平时打牌的思路,如何转变成一个通用的算法,并且可以保证一定的胜率。

十、评价你的队友

  • 需要学习的地方:队友很棒,花了很多时间和经历在上面,能关注到很多小细节并且处理的很好。而且由于是舍友遇到问题我们讨论起来也很方便很及时。
  • 需要改进的地方:我觉得我的队友很好,不需要改进。

十一、学习进度条

||||||
|:--|:--|:--|:--|:--|:--
|第N周|新增代码(行)|累计代码(行)|本周学习耗时(小时)|累计学习耗时(小时)|重要成长|
|1|0|0|4|4|学会用markdown写博客|
|2|324|324|30|34|学习了python的基础用法,json格式,正则表达式和用request库调用API|
|3|0|324|7|41|学习了使用墨刀和ps,并进行原型设计,设计出福建十三水原型|
|4|360|684|15|56|学习了很多python函数的用法,也学会如何将思路用代码表示出来|
|4|1200|1884|15|71| 学习了HTML、CSS和js |

十二、UI部分展示

https://www.bilibili.com/video/av73951705