第二次结对编程作业

一、题目描述

题目:“福建赌王”之争

【题目背景】

    话说,自称“赌王”的老周与同样自称“赌王”的老刘在福州展开“赌王”名号的争夺。两人商议决定使用福建当地的一套纸牌游戏规则进行博弈,即“福建十三水”。约定三周后展开决战。老刘修习代码多年,希望开发一套自动化的出牌系统,具体游戏规则请上网查询或找福大柯老板,本次作业要求提交一份完整的前端后端代码。

WARNING:珍惜钱财,远离赌博(含AI赌博)。

二、相关的链接

  • 我的Github地址 详情

  • 结对同学的博客链接 详情

  • 上次原型设计的博客链接 详情

  • iOS端运行视频地址 详情

三、具体的分工

    这次的分工由周鑫煌负责前端代码的编写(制作出一款简易的App),由我进行后端代码与算法的编写(使用java语言).

四、PSP表格

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

五、解题思路与设计实现说明

  • 网络接口的使用

    • 利用java搭建了后台服务器,对Ios前端提供接口,并且部署到网上的云服务器
      利用insosomnia软件进行本地的后台测试 (实际项目已部署到云服务器)
  • 内部类图

    • 利用IDE自带的工具进行类图的分析
      其中不同类之间的关系如类图所示(一个类指向谁则表明这个类依赖于这个类)

      以及其中几个类之间的相互调用关系

  • 算法的关键流程图

首先将得到的排根据其画色进行排序,方便下一步的操作,将其按照排序的结果进行相应牌型的计数,然后根据不同的组合分出下墩和中墩,自动分出上墩,最后将不同的出牌进行权重选择,得到最后的牌型。

六、关键代码的解释

    本算法我认为没有什么特别突出的值得注意的地方,因为每一处的处理不当都可能使得算法的失败,所以就没有啥重要的代码,可以说是处处都是关键,所以在此我放出之前在debug时的代码(Debug了不少时间

在改之前只考虑了3对的情况,并没有考虑出现4对的情况,所以在跑数据的时候发现一到4对就会出牌错误

通过Debug发现了问题的原因,并且加以考虑了出现4对的情况,最终将测试数据带入程序解决bug

七、性能的分析与改进

可以看到主要进行出牌算法占据了绝大部分时间,小部分时间由io、依赖包函数调用占用。

  • 可以先直接判断是否为特殊牌型进而直接输出
  • 设置一定的权重阈值 达到即可输出
  • 不同的散排牌型放置不同的数组内

八、单元测试

这次单元测试我利用Junit将程序分成俩个方面进行单元测试,一个是对自己算法的单元测试,一个是对评测后台连接的单元测试,分别验证了算法的正确性和提交结果的正确性。

  • junit 依赖

  • 算法的单元测试

    构造测试数据的思路:我将页面上请求到的数据作为测试数据进行单元测试

    • 未通过单元测试的样例

    • 通过单元测试的样例

  • 连接测试的单元测试

    • 登入请求

    • 开启战局

    • 提交结果

九、Github的代码签入记录

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

  • 问题一: 如何脱离本机进行前后端链接操作

    • 尝试: 将后端部署到网上云服务器
    • 是否解决:
    • 有何收获: 为后面的团队作业做铺垫
  • 问题二: 如果遇到不可控因素导致请求中断进而使得程序奔溃

    • 尝试: 在关键语句内进行异常处理
    • 是否解决:
    • 有何收获: 加深对一些关键代码是否需要进行异常处理的理解

十一、评价队友

  • 值得学习的地方
    队友Ios做的真得劲,应该是年段一个用Ios做的前端了吧,顶。
  • 需要改进的地方
    还是没能提早做完在赶ddl
第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 重要成长
第一周 0 0 5 学习原型设计(墨刀)的使用
第二周 0 0 20 学习后端的基本知识
第三周 1000 1000 50 进行实际后端开发
第四周 300 1300 30 对github的使用