• 第二次结对编程作业


    结对情况:

    刘晓翔博客

    翁世豪博客

    Github项目地址

    具体分工:

    前后端交互——刘晓翔 核心算法——翁世豪

    PSP2.1 实际耗时(分钟)
    PSP2.1 实际耗时(分钟)
    第一次博客作业 150
    第一次个人编程作业 4000
    第一次结对作业 800
    团队展示 500
    第二次结对作业 150
    团队需求分析报告 · 设计复审
    团队需求分析报告2 · 代码规范 (为目前的开发制定合适的规范)
    git编程实战 · 具体设计
    alpha · 具体编码
    beta · 代码复审
    beta版本演示 · 测试(自我测试,修改代码,提交修改)

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

    • 网络接口的使用:

    封装好的网络接口函数声明

    @interface LxxInterfaceConnection : NSObject
    /*
     新版接口函数
     @param handle url 
     @param params 参数字典
     @param block 后台返回信息
     @param needToken yes:需要,false:不需要
     */
    -(void)connetNetWithPostMethod:(NSString *)handle parms:(NSDictionary *)params needToken:(BOOL)needToken block:(void(^)(int fail,NSString *dataMessage,NSDictionary *dictionary))block;
    
    -(void)connetNetWithGetMethod:(NSString *)handle parms:(NSDictionary *)params block:(void (^)(int, NSString *, NSDictionary *))block;
    //fail为获取数据的成功性,fail=0表示成功,fail=1表示未成功,fail=2表示无网未成功,dataMessage为错误信息,dictionary为从服务器端得到的数据字典
    
    • 代码组织与内部结构设计(类图)

    • ifths():判断是否有同花顺

    • printths():判断有了同花顺之后,对同花顺进行操作

    • ifzhad():判断是否有炸弹

    • printzhad():判断有了炸弹之后,对炸弹进行操作

    • ifhulu():判断是否有葫芦

    • printhulu():判断有了葫芦之后,对葫芦进行操作

    • iftonghua():判断是否有同花

    • printtonghua():判断有了同花之后,对同花进行操作

    • ifshunz():判断是否有顺子

    • printtshunz():判断有了顺子之后,对顺子进行操作

    • ifsantiao():判断是否有三条

    • printsantiao():判断有了三条之后,对三条进行操作

    • ifliangdui():判断是否有两对

    • printliangdui():判断有了两对之后,对两对进行操作

    • ifdyizhang():判断是否有单张

    • printyizhang():判断有了单张之后,对单张进行操作

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

    • 算法的关键:
      开始时先把输入的一个字符串给处理成

    • 按牌的大小从小到大的一个牌面数组(便于每一个牌型可以找到最大的组合)

    • 对应牌面数组的每张牌的花色的字符数组

    • 每个大小的牌面的数量的数组(可以直观的看出炸弹,葫芦,顺子,三条,两对,一对,单张的情况)

    • 每个花色的牌的数量的数组(判断是否有同花的情况,结合牌面大小的数组可以判断同花顺的情况)

    • 代码思想:

    • 经过上面四个数组的处理之后,牌的情况就已经比较清晰了,可以借助上面的数组判断各牌型的情况

    • 构建八个判断函数和八个整型数组和八个字符数组,判断八种牌型是否存在并存放八种牌型的牌面和花色

    • 从同花顺开始往下用if,else if的形式进行判断,判断某个牌型有了就停止,将这种牌型最大的情况放进数组中

    • 将数组中的牌面和花色放进对应的墩中

    • 将已经放进墩中的牌从牌面数组删除,把对应牌的花色在花色数组中删除

    • 重复以上操作,得到三墩的牌面和花色,整合成符合要求的形式

    关键代码解释


    这是我对于得到的字符串的初步的处理,将他们整理成了四个数组

    • shunxup[]存放按从小到大的顺序的牌面
    • shunxuf[]存放按从小到大牌面对应的花色
    • count[i]存放牌面为i的牌的数量
    • flower[]存放四个花色的牌的数量
    • 遍历得到的字符串,i为从2到9的循环,先把牌面是2的牌放到牌面数组里,同时把它的花色放到对应的花色数组里,这时牌面为2的牌的数量+1,花色为它的花色的数量+1;
    • 然后i变成3,4....这样实现从小到大的排序
    • 将JQKA分别转化成11,12,13,14这样方便后续的比大小。
      这样处理之后,后续对于牌型的判断都可以基于这四个数组,整个程序的结构变得更清晰而有层次,所以我认为他们很有价值。

    性能分析与改进

    • 性能分析图和程序中消耗最大的函数:
      • 每次开启占居都要重新从服务器端获取数据消耗很大,即connectNetWithGetMethod和connectNetWithPost反复调用
      • 在绘制历史战绩和排行榜上的列表tableView上消耗较多,获取到的信息有很多行使得cell的反复创建,cellForRowAtIndexPath会根据列表行数的增多而反复调用
    • 改进的思路:
      • 复用cell,减少子控件的添加,并用约束布局cell子控件时不多次添加约束
      • 减少花里胡哨的自定义cell,减少使用不透明视图和不重叠的渐变,降低GPU的负担,减轻造成性能不佳

    • 性能分析图和程序中消耗最大的函数:
      • 赋值前中后三墩这三个数组的函数最大,由于它们是存放结果的数组,对于它们的赋值,覆盖的操作比较频繁。
      • 判断各个牌型的函数消耗都不小,由于只考虑了正确性没有考虑时间,判断牌型基本上都是多次的遍历牌面数组,以力求获取的牌型正确
    • 改进的思路:
      • 改进时可以采用更具有逻辑,更科学性的算法思想进行编程,做好精细的流程图的设计,力求没有累赘。
      • 判断牌型的时候把时间的因素也考虑进去,在追求正确结果的基础上,尽量简化代码,消除不必要的循环的部分,将代码向时间方向进行改进。
      • 判断出了牌型之后,简化对牌型的处理的步骤。
      • 确定了要存放的牌后进行前中后三墩的赋值,只要赋值之后就不存在再覆盖数据的情况,使得时间的浪费更少。
      • 简化输入输出的部分,之前为了答案的正确性,将这两个部分做的比较复杂,现在可以适当的简化一些

    单元测试

    输入

    &K $7 #8 #4 *10 &10 &9 *J #7 *K $8 $A $K
    &5 #8 #7 #A *8 &3 &A &10 &4 &9 *J *4 &2
    $4 *J &4 $A $J *4 &A $K &3 #3 #7 &5 &2
    *9 $A #6 *2 &7 $8 #J $2 #Q #10 $9 &10 #4
    *9 &A *4 $10 #8 #3 $5 $2 &5 $9 &10 #4 *K
    &5 *J #4 *9 &Q &3 $Q #2 *5 *6 &A $8 $K
    *K *9 #J $2 $9 &5 $8 &J &4 &8 $A *10 &7
    *8 *K #4 &K $2 #Q $6 *Q $K &J *10 &5 $3
    *K *A &Q &6 &K *4 $5 $7 #Q &A $6 #K #5
    *9 &7 &K #5 #A $9 *7 $A *2 #3 &4 *J #9
    

    输出

    qian&9 *J $A--zhong*10 &10 #8 $8 #4--hou#K &K $K $7 #7
    qian#7 *J #A--zhong#8 *8 &2 &3 *4--hou&4 &5 &9 &10 &A
    qian&5 #7 $K--zhong$A &A *J $J &2--hou$4 &4 *4 &3 #3
    qian$8 &10 $A--zhong*9 $9 *2 $2 &7--hou#4 #6 #10 #J #Q
    qian#8 *K &A--zhong*9 $9 $5 &5 #3--hou$10 &10 *4 #4 $2
    qian*J $K &A--zhong&Q $Q *5 $8 *9--hou#2 &3 #4 &5 *6
    qian#J *K $A--zhong*9 $9 $2 $8 *10--hou&4 &5 &7 &8 &J
    qian*8 *10 &J--zhong$2 $3 #4 &5 $6--hou*K &K $K #Q *Q
    qian$7 &Q #Q--zhong*A &A &6 $6 *4--hou*K &K #K $5 #5
    qian#5 *J &K--zhong#A $A *2 #3 &4--hou*9 $9 #9 &7 *7
    

    Github的代码签入记录

    遇到的困难及解决方法

    • 困难描述:前后端交互有难度,在牌的算法上思路不太清晰。使用python实现记牌的算法上无法和object-c完美兼容
    • 解决尝试:从python解题改成使用C语言实现。通过声明函数实现在可以在其他页面中外部调用函数。
    • 是否解决:object-c可以兼容C语言代码实现,解决函数调用问题
    • 有何收获:加强了使用C语言解决字符串上的问题熟练度,学会了如何在iOS中调用外部C语言函数

    评价队友->翁世豪

    • 值得学习的地方:世豪同学的算法能力很强。同为Python入门,他的学习进度比我快很多,学习能力很强。除了学习之外,他可以在紧张的学习压力下找到女朋友,这也是值得我学习的地方。
    • 需要改进的地方:代码规范还需要加强,在变量和函数命名上不够直观贴切

    评价队友->刘晓翔

    • 值得学习的地方:晓翔同学的能力非常强,而且学习态度非常积极,勤劳刻苦,我每每看到他,他都是在认真的学习,有时候即使人在其他地方,也会远程操控自己的电脑进行工作。
    • 需要改进的地方:态度过于认真,以至于进度比较慢
    PSP2.1 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    PSP2.1 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 0 0 5 5 熟练掌握福建十三水打牌技术,学习了如何使用Axure Rp的使用方式
    2 300 300 7 13 写出程序运行的逻辑框架和完成部分ui设计
    3 500 800 8 21 实现根据算法获取最优解
    4 400 1200 6 27 实现具体功能,解决部分因为数据获取出错而引起的bug

    通过视频演示来展示UI

    请移至我队友博客末尾

  • 相关阅读:
    动态规划设计:最长递增子序列
    经典动态规划:编辑距离
    经典动态规划:子集背包问题
    iOS开发网络篇—HTTP协议
    IOS之Core Foundation框架和Cocoa Foundation框架的区别
    iOS开发多线程篇—GCD简介
    iOS-UIImage变为NSData并进行压缩
    iOS开发UI之Quartz2D使用(绘制基本图形)
    UIImagePickerController
    mac下搭建discuz论坛
  • 原文地址:https://www.cnblogs.com/xgsw/p/11666946.html
Copyright © 2020-2023  润新知