第二次结对编程作业
一.链接与地址
林家伟:
博客地址: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 | 实现了前后端的交互,基本实现十三水 |