具体分工
- 杨蓝婷:原型图的设计和前端
- 王焱:前端和算法的设计
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 60 | 60 |
| Estimate | 估计这个任务需要多少时间 | 300 | 310 |
| Development | 开发 | 320 | 320 |
| Analysis | 需求分析(包括学习新技术) | 460 | 470 |
| Design Spec | 生成设计文档 | 20 | 20 |
| Design Review | 设计复审 | 360 | 370 |
| Coding Standard | 代码规范(为开发制定合适的规范) | 40 | 40 |
| Design | 具体设计 | 710 | 720 |
| Coding | 具体编码 | 430 | 430 |
| Code Review | 代码复审 | 320 | 320 |
| Test | 测试(自我测试,修改,提交修改) | 430 | 430 |
| Reporting | 报告 | 30 | 30 |
| Test Report | 测试报告 | 30 | 30 |
| Size Measurement | 计算工作量 | 20 | 20 |
| Postmortem & Process Improvement Plan | 事后总结并提出过程改进计划 | 30 | 30 |
| 合计 | 3560 | 3600 |
解题思路描述与设计实现说明
网络接口的使用
- 利用AFNetWorking进行封装的网络请求类,用POST或GET请求接口获得数据
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
progress:(void (^)(NSProgress * _Nonnull))uploadProgress
success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
{
NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"POST" URLString:URLString parameters:parameters uploadProgress:uploadProgress downloadProgress:nil success:success failure:failure];
[dataTask resume];
return dataTask;
}
代码组织与内部实现设计
- 利用OmniGraffle导出的UML类图

说明算法的关键与关键实现部分流程图
- 拿到手牌后先进行处理,记录各个花色,并且统计手上各个牌型的情况,分类。
- 然后遍历,进行散牌、对子、三顺、炸弹和特殊牌型的排序判断(特殊牌型直接输出)。
关键代码
- 特殊牌型判断的部分代码如下
List<Card> continuous1=new ArrayList<Card>(); //三同花顺
List<Card> continuous2=new ArrayList<Card>();
int t=-1,f1=-1;
for(int i=0;i<4;i++)
{
ArrayList<Card> type=new ArrayList<Card>();
for(Card c:handCard)
if(c.type==i+1)
type.add(c);
for(int j=0;type.size()>=5&&j+4<type.size();j++)
if(iscontinuous(type.subList(j, j+5)))
{
continuous1=type.subList(j,j+5); //一组同花顺
t=i;
f1=j;
}
}
for(int i=0;(i<t+1)&&(!continuous1.isEmpty());i++)
{
ArrayList<Card> type=new ArrayList<Card>();
for(Card c:handCard)
if(c.type==i+1)
type.add(c);
for(int j=0;type.size()>=5&&j+4<type.size();j++)
{
if(i==t)
{
if(j+4<f1)
if(iscontinuous(type.subList(j, j+5)))
continuous2=type.subList(j,j+5);
}
else
{
if(iscontinuous(type.subList(j, j+5)))
continuous2=type.subList(j,j+5);
}
}
}
性能分析与改进
- 如果能直接判断特殊牌型就无需再做麻烦的权重判断,直接输出。
- 记录各个组合牌(散牌、对子、三条、炸弹等)的个数,利用不同数组存放。
- 根据规则后墩>中墩>前墩,只需要判断出最大和次大的两墩。
- 性能分析图


单元测试
- 随机发13张牌 调用算牌接口,再调用打牌接口。


贴出Github的代码签入记录

遇到的代码模块异常或结对困难及解决方法
- 对于算法的流程和前后端交互不明白,踩了很多坑。
- 去b站上疯狂学习。
- 部分解决
- 极大的提升了自学能力和熬夜能力。
评价你的队友
- 婷部tql,UI大佬值得学习。
- 少熬夜,身体重要。
学习进度条
| 第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 12 | 12 | 更加熟悉原型开发工具(ps nb) |
| 2 | 0 | 0 | 25 | 27 | 学习算法,了解强化学习和神经网络的基本算法后放弃并且忘记。 |
| 3 | 1000 | 1000 | 30 | 58 | 瞎写算法,瞎写前端。 |
| 4 | 200 | 1200 | 15 | 72 | 优化算法,强行上线。 |
posted on
浙公网安备 33010602011771号