第二次结对编程作业

一.链接与地址

林家伟:
博客地址:https://www.cnblogs.com/ljw1999/p/11740903.html
仓库地址:https://github.com/1263199084/13water
杨锦镔:
博客地址:https://www.cnblogs.com/374113yang/p/11766858.html
仓库地址:https://github.com/Ephmeral/13water


二.具体分工

林家伟:AI算法(C++实现),网络接口(JaveScript);
杨锦镔:UI设计(html+CSS),网络接口(JaveScript);


三.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 90
· Estimate 估计这个任务需要多少时间 60 90
Development 开发 3250 3960
· Analysis 需求分析(包括学习新技术) 1800 2000
· Design Spec 生成设计文档 90 60
· Design Review 设计复审 120 120
· Coding Standard 代码规范 30 50
· Design 具体设计 400 560
· Coding 具体编码 450 720
· Code Review 代码复审 240 300
· Test 测试(自我测试,修改代码,提交修改) 120 150
Reporting 报告 130 115
· Test Repor 测试报告 50 60
· Size Measurement 计算工作量 20 10
· Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 60 45
  合计 3440 4165

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

解题思路:

首先自然而然想到了一个最无脑的算法,从后墩开始,按照同花顺 > 炸弹 > 葫芦 > 同花 > 顺子 > 三条 > 二对 > 一对 > 散牌 的顺序,先找是否有同花顺,比如,底墩找到葫芦,然后中墩在剩余牌中,继续找牌型最大的牌,最后剩下的三张牌作为前墩。但是!!这种算法效率不高,且无法最优出牌.能暴力解决的问题就不是问题

最后,我们讨论了一下,给出现在的算法:简单的来说,就是枚举所有符合规则的墩型,每一种情况都附带一个value值,然后维护一个最大的value值,最后将其按规则输出。当然暴力枚举未免显得太无脑,因此我们做一些优化:
1.首先在13张牌里面任选5张做为底墩,在剩余的牌堆里面再次任选5张作为中墩,最后剩下三张牌作为前墩。
2.其次判断每一墩的牌型,要求牌型符合底墩>中墩>前墩,将不符合规则的情况剔除,剩下的大概7万多种出牌情况进行最后一步
3.遍历所有符合规则的情况,设置一个value矩阵,每次维护一个最大值,最后将最大值对应的牌型输出就可以了
最后你们还不是暴力解决问题?我们可以暴力,但绝不承认

设计实现说明

网络接口:

因为api给出的样例接口是python语言,所以用html写前端的我们,所有网络接口都只能自力更生了。我们太难了 下面给出一些主要的接口实例:
1.注册接口

2.登录接口:

3.开启战局接口:

4.排行榜接口:

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

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

算法的关键在解题思路已经体现了,就是对牌的枚举以及牌型的判定,下面给出算法关键实现流程图:

五.关键代码解释:

Calculate_Card()函数:判断牌型是否符合规则,并根据对evaluate5()函数与evaluate3()函数的返回值,维护一个最大的value

evaluate5()函数:判断这五张牌的牌型,并返回牌型和最大牌值的pair类型的数据

evaluate3()函数:判断这三张牌的牌型,并返回牌型和最大牌值的pair类型的数据

六.性能分析与改进

改进思路

感谢舍友,提供了一种在枚举牌型是存储所有情况的思路,利用数字存储,即利用数字在二进制下1的位数来表示牌数,当前位为1 or 0表示该张牌是 or 否被选中,就很好解决了存储空间的问题和时间消耗的问题

性能分析图

CPU使用

函数时间消耗图

由Microsoft Visual Studio软件提供,可以看到判牌Calculate_card和evaluate5()这两个函数消耗较大

七.单元测试

测试了几组随机数据,感觉按照权值矩阵已经是最优的了,算法的设计并不是要求底墩和中墩尽可能的大,而是使三墩牌整体的赢面较大,接下来测试了一组至尊青龙的特殊牌型,抽是抽不到特殊牌型的,这辈子都不可能有一条至尊青龙的,只能自己构造数据这样子可以看到对于一条至尊青龙,分成散牌和两个同花顺,因为特殊牌型在判牌时不分墩,所以也就没有在算法特判,直接按权值分成三墩,反正不会影响最终结果就是了。

八.Github的代码签入记录


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

问题一

困难描述:界面开发工具的选择,一开始决定了html,css,js来写,并学习了一段时间后来听同学说用python可以自动生成代码,于是十分纠结到底该用哪一种。
解决尝试:与队友进行了深入的讨论,由于已经学习了html,css,js一段时间,最终还是决定采用做成网页的形式
是否解决:是

问题二

困难描述:在写接口的时候,不知道如何传数据到api,传什么类型的数据,收到什么类型的数据
解决尝试:通过网上查资料,问同学,一步步尝试,最终还是将接口连上了
是否解决:是

问题三

困难描述:UI与AI做好后,不知道如何将js与c++进行交互
解决尝试:利用注册表,使得js调用本地CPP的exe程序。
是否解决:是

有何收获

杨锦镔:通过这次作业,了解到要做好一个APP是真的非常困难,更何况我们现在做的还是一个非常简陋有瑕疵的小软件,所以还是有很多知识需要去学习,还有很长的路要走。当然,这次第一次接触这种作业,能完成这么多,已经自我感觉良好了,不仅学习了html,css,js,python等知识,也认识到一个软件怎样从代码展示成图片的过程,通过这次作业真的受益匪浅。
林家伟:大概就是晚上看到时间的时候,咦,2点了,还早还早,基本做完的那天大概到晚上一点多上床睡觉,内心竟然还有一丝愧疚,这么早上床你良心都不会痛吗 最大的收获就是html,js都会了一点,咦,为什么队友负责的部分我也会???唉,命运呐 另外学会了python脚本的运行与命令行传参 (有一说一,之前确实不会,我太菜了)

评价队友

评价人:杨锦镔

值得学习的地方:

队友的腿非常粗,我抱得很舒服。队友代码能力非常强,有什么问题,他看一眼就解决了,是个大佬。希望以后能够多多向他请教代码问题,好好提升代码能力。

与需要改进的地方:

没有,不存在,不口能。

评价人:林家伟

值得学习的地方:

坚持不懈,百折不饶,一个接口折腾一天,我日常焦虑催进度,他心态良好啥都行,互补。

与需要改进的地方:

对一个经常把“我不会啊”挂在嘴边的队友,想跟他说一句:百度啊,不会百度吗

十一、学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 25 25 学会了Axure软件,十三水的规则
2 800 800 30 55 初步掌握html,css,js等知识
3 800 1600 20 75 基本能够完成网页的制作,算法的构思及实现
4 200 1800 15 90 实现了前后端的交互,基本实现十三水
posted on 2019-10-29 23:37  Monster--  阅读(173)  评论(0编辑  收藏  举报