第二次结对编程作业

各个链接

姓名 博客链接 本作业博客的链接 Github项目地址
张万聪 https://www.cnblogs.com/a8-23/ https://www.cnblogs.com/a8-23/p/11585265.html https://github.com/a-spring-bear/13pieces
刘诗琳 https://www.cnblogs.com/slyn0422/ https://www.cnblogs.com/slyn0422/p/11681213.html https://github.com/S-lyn-0422/13pieces

具体分工

我们没有明确的分工,大部分都是我们相互讨论实现的。我主要写算法,聪哥主要实现前端,啊我好菜+10086。


PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning · 计划 60 60
· Estimate · 估计这个任务需要多少时间 60 60
Development · 开发 1770 2550
· Analysis · 需求分析 (包括学习新技术) 240 300
· Design Spec · 生成设计文档 60 60
· Design Review · 设计复审 60 60
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 30
· Design · 具体设计 60 120
· Coding · 具体编码 1200 1800
· Code Review · 代码复审 30 90
· Test · 测试(自我测试,修改代码,提交修改) 90 90
Reporting 报告 140 140
· Test Repor · 测试报告 60 60
· Size Measurement · 计算工作量 20 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 60
· 合计 1970 2750

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

  • 网络接口的使用

提供的接口说明了传送方式,查资料、问学长、经历各种幽暗昏惑终于明白是要用Ajax实现。根据request要得到response,才算是请求成功,害我好菜。

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

我们做的web,所以前端使用了HTML。HTML是从Axure Rp 8(一股神秘力量)导出的,导出的项目中一个HTML对应一个css文件,在导出的基础上我们做了相应的补充和调整。另外添加了Js文件来封装项目中使用的函数。

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

    • 算法的关键:
      1、采用了贪心算法,先为三墩找最优解,再为二墩找最优解,最后剩下的三张就是一墩;在判别牌型时,也是优先判断较大的牌型
      2、采用分桶的方式进行统计,分别统计了每种牌型的数量、每种牌号的数量等
      3、几种普通牌型的判别方法:
      - 同花顺:先找是否有多于5张的花色,若有,将所有可能的顺子都存在example中,并按从大到小的顺序排放,将该花色的牌去重复、排序,再进行比对;同时,还要附上相应权值,因为可能存在多幅同花顺。
      - 炸弹:从大到小,找出牌数大于等于4张的牌号,若有,直接获取,再到cards中去匹配牌型(由于贪心算法,此时已不用考虑同花顺)
      - 葫芦:先按贪心算法,找出最大的三张相同牌号的牌,在卡片集合中剔除这三张,再继续找最大的对子
      - 同花:找出所有牌数大于等于5的花色,分别列出每个花色的所有牌号,从大到小排序,根据每个花色最大的牌号为他们赋权值,最后选权值最大的。
      - 顺子:与同花顺类似,但是example是和所有排序、去重复的牌相比对。
      - 三条:直接在数字桶中寻找牌数等于3的牌号(根据贪心算法推理,若有则只有一个)
      - 二对:直接在数字桶中寻找两个牌数等于2的牌号,最后一张牌取剩下的最大的那张
      - 一对:直接在数字桶中寻找牌数等于2的牌号(根据贪心算法推理,若有则只有一个),散牌牌号大优先取

    • 部分流程图:

    • 类图:

关键代码解释

  • 重要的/有价值的代码片段
    分桶过程:

特殊牌型判断:

普通牌型判断:

理牌过程:

  • 解释:见代码注释

性能分析与改进

  • 改进的思路

用Axure Rp 8导出HTML文件夹,在文件夹的项目中调整css使见面更加美观并符合使用习惯。但是界面做的还是不够美观,第一次着手自己做一个项目的HTML界面,还有很多经验上的不足,日后要加强学习啊!各种调整都是暴力的、笨拙的,导致可能界面显示会有浏览器的兼容和适配问题。连接算法执行出牌,算法我们的时间不够,写的并不完善还有很多情况没有考虑,后期会继续加以补充。增加作业提供的接口js文件,发出请求的异常情况没有考虑周全。

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

    • 性能分析图

  • 程序中消耗最大的函数:marshal loads

单元测试

  • 项目部分单元测试代码、 测试的函数

特殊牌型的判断、普通牌型的判断的代码和函数

普通牌型判断:

  • 构造测试数据的思路

分别按照特殊牌型、普通牌型的同花顺、同花、顺子、炸弹、葫芦、三条、二对、一对、散排的组合,给每种可能的牌型进行测试。

  • 数据:

    • 部分输出:

    "*6 &6 $10,&3 &4 &8 &9 &10,#5 #8 #9 #J #Q"

    "$J &K *K,&4 *4 #5 &5 *8,$3 #3 *3 #7 $A"

    "*2 #K &K,&3 4 #6 $6 &6,6 #7 $8 $9 $10"

    "$2 *6 *10,#4 #7 #9 #10 #A,&4 &7 &10 &J &A"

    "*6 &6 $10,&3 &4 &8 &9 &10,#5 #8 #9 #J #Q"

    "*2 #K &K,&3 4 #6 $6 &6,6 #7 $8 $9 $10"

    "$2 *6 *10,#4 #7 #9 #10 #A,&4 &7 &10 &J &A"

    "#2 $2 $6 $8 *8 $9 #9 *9 $Q &Q *A &A $A"

    "5 #10 $A,2 $8 *8 #K *K,#3 $4 &Q #Q *Q"

    "*3 #3 &A,$2 *2 4 #Q &Q,6 #10 &10 $10 #K"


贴出Github的代码签入记录


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

  • 困难(这是一个故事,我要连在一起说,呜呜呜...)

    • 代码模块异常:在Ajax上面花的时间太多了,在登陆上一直有“400”的状态码。在这上面我们花了很多的时间,很久,很久,很久,很久,然后发现我们根本没有注册...(我嘤嘤嘤)于是我们开始弄注册的接口,当注册接口完成之后,登录的问题就解决了。但是但是但是,为什么有了登录接口还需要一个登录验证接口啊喂,得到的token总是失效的导致没办法得到授权,报错报错报错,无止尽的报错。后来在阴差阳错无止尽的调试最后解决了这个问题。另外还有算法的设计,实在是太多情况了,这道题太难了我不会做,呜呜呜,这个问题是正处于,并将长期处于的一个大问题(嘤)。

    • 结对的困难:前期的分工不太明确,浪费了一点时间,但是后面解决了,虽然还是有点赶

  • 收获:

    • 每次做完作业的总结几乎都是提升了自己的搜索能力。(同上),从此成为百度小能手。

    • 学会了给代码分模块,(这个真是太重要了,不然几百行我就已经开始晕了)

    • 1+1坨掉下的头发而已。

    • 多问多查,不能老是自己钻牛角尖。


评价你的队友

  • 值得学习的地方

胆大心细有耐心,学东西很快,跟着聪哥稳得一匹

  • 需要改进的地方

没有!完美队友


代码规范

gitignore

徽章

readme

UI设计

百度网盘:

链接:https://pan.baidu.com/s/1Y85ZxURVxTOvUy6iQw-Xxg
提取码:ooyb


学习进度条

第N周 新增代码行数 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 14 14 了解了前端和ui与原型设计的区别
2 0 0 7 21 熟悉了PS、Axure Rp、Python
3 981 981 35 56 学会一点js 和css,大致了解了一个写网页的过程,用python写了一千行代码,小菜鸡太难了
posted @ 2019-10-15 22:02  #%*i  阅读(156)  评论(1编辑  收藏  举报
function customTimer(inpId, fn) { if ($(inpId).length) { fn(); } else { var intervalId = setInterval(function() { if ($(inpId).length) { //如果存在了 clearInterval(intervalId); // 则关闭定时器 customTimer(inpId, fn); //执行自身 } }, 100); } } //添加 评论区的 形象照 function addImage() { var spen_html = "\ "; $(".blog_comment_body").append(spen_html); $(".blog_comment_body").before("
"); var feedbackCon = $(".feedbackCon").addClass("clearfix"); for (var i = 0; i < feedbackCon.length; i++) { var span = $(feedbackCon[i]).find("span:last")[0].innerHTML || "https://pic.cnblogs.com/face/sample_face.gif"; $(feedbackCon[i]).find(".body_right img").attr("src", span); var href = $(feedbackCon[i]).parent().find(".comment_date").next().attr("href"); $(feedbackCon[i]).find(".body_right a").attr("href", href); } } //页面加载完成是执行 $(function() { //添加 评论区的 形象照 customTimer(".blog_comment_body", addImage); });