zoukankan      html  css  js  c++  java
  • 第二次结对编程作业

    一.链接与地址

    林家伟:
    博客地址: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 实现了前后端的交互,基本实现十三水
  • 相关阅读:
    java面试题之简单介绍一下集合框架
    java面试题之hashcode相等两个类一定相等吗?equals呢?相反呢?
    java面试题之什么是ThreadLocal?底层如何实现的?
    java面试题之stop()和suspend()方法为何不不推荐使⽤?
    设计模式—单例模式
    Java并发—同步容器和并发容器
    Java并发—并发工具类
    Java并发—原子类,java.util.concurrent.atomic包(转载)
    Java并发—java.util.concurrent.locks包
    Java并发—java.util.concurrent并发包概括(转载)
  • 原文地址:https://www.cnblogs.com/374113yang/p/11766858.html
Copyright © 2011-2022 走看看