结对情况:
刘晓翔博客
翁世豪博客
Github项目地址
具体分工:
前后端交互——刘晓翔 核心算法——翁世豪
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | · 计划 | 200 | 150 |
Estimate | · 估计这个任务需要多少时间 | 3000 | 4000 |
Development | · 开发 | 1000 | 800 |
Analysis | · 需求分析 (包括学习新技术) | 600 | 500 |
Design Spec | · 生成设计文档 | 200 | 150 |
Design Review | · 设计复审 | 60 | 80 |
Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 200 | 400 |
Design | · 具体设计 | 1000 | 1200 |
Coding | · 具体编码 | 2000 | 2200 |
Code Review | · 代码复审 | 300 | 300 |
Test | · 测试(自我测试,修改代码,提交修改) | 300 | 500 |
Reporting | · 报告 | 300 | 400 |
Test Repor | · 测试报告 | 300 | 400 |
Size Measurement | · 计算工作量 | 100 | 60 |
Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 200 | 120 |
= | · 合计 | 3500 | 4200 |
解题思路描述与设计实现说明
- 网络接口的使用:
封装好的网络接口函数声明
@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 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 5 | 5 | 熟练掌握福建十三水打牌技术,学习了如何使用Axure Rp的使用方式 |
2 | 300 | 300 | 7 | 13 | 写出程序运行的逻辑框架和完成部分ui设计 |
3 | 500 | 800 | 8 | 21 | 实现根据算法获取最优解 |
4 | 400 | 1200 | 6 | 27 | 实现具体功能,解决部分因为数据获取出错而引起的bug |