第二次结对编程作业

结对情况:

刘晓翔博客

翁世豪博客

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

请移至我队友博客末尾

原文地址:https://www.cnblogs.com/xgsw/p/11666946.html