传送门
结对同学博客:
本作业博客:https://edu.cnblogs.com/campus/fzu/SE_FZU_1917_K/homework/8664
GitHub项目地址:https://github.com/qianwensea/13Water
具体分工
施金海(我):
- 原型实现,重构部分贴图设计(根据需求)
- 测试程序,进行性能分析并提出改进意见
史恩泽:
- 设计并实现算法,优化算法
- 调用网络接口
- 代码组织与内部实现
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 50 | 60 |
Development | 开发 | 2240 | 3560 |
· Analysis | · 需求分析 (包括学习新技术) | 600 | 900 |
· Design Spec | · 生成设计文档 | 40 | 60 |
· Design Review | · 设计复审 | 30 | 50 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 40 |
· Design | · 具体设计 | 400 | 450 |
· Coding | · 具体编码 | 1000 | 1800 |
· Code Review | · 代码复审 | 20 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 200 |
Reporting | 报告 | 100 | 105 |
· Test Repor | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 10 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 55 |
合计 | 2390 | 3725 |
解题思路描述与设计实现说明
网络接口的使用:
本项目主要用到Post和Get,将网络接口的调用封装成API_Helper,当按下界面中的按钮后调用对应的网络接口进行数据传输。
代码组织与内部实现设计(类图):
一共采用了两种风格的窗体,登录和注册采用MetroForm,其他的采用CCSkinMain。
比较重要的类有两个:DealCards和User,分别用于自动分牌和存放用户各类信息。
其他的窗体则根据需要进行相应的调用与组织。
算法关键与实现部分流程图:
算法的关键在于DealCards的实现:要先将获取到的牌型转换成易于分析和处理的int型数值,之后获取所有自动牌型,根据牌型生成符合规则的最优解。
关键代码解释
/// <summary> /// 牌面从大到小排序 /// </summary> public static void SortCard(List<int> cards) { //牌面从大到小排序 cards.Sort((b, a) => { int result = (a % 100) - (b % 100); if (result == 0) { result = (a / 100) - (b / 100); } return result; }); } /// <summary> /// 牌面从小到大排序 /// </summary> public static void SortCardMinToMax(List<int> cards) { //牌面从小到大排序 cards.Sort((a, b) => { int result = (a % 100) - (b % 100); if (result == 0) { result = (b / 100) - (a / 100); } return result; }); }
将牌面转换为数字后可以更方便的进行排序,因为在十三水中A最大,所以将A指定为14;
扑克的四种花色分别对应100,200,300,400;
/// 牌型对应如下: /// 1->$ /// 2->& /// 3->* /// 4->#
牌面对100取余即可得到对应的值,之后重载sort进行排序。
性能分析与改进
测试时分别进行了注册、登录、开启战局并出牌、查询排行榜、查询历史战局详情,得到性能报告情况如下:
其中占用较大的是Forms.Application.Run()
和Forms.MessageBox.show()
,即窗体的加载与显示和提示窗的加载与弹出,这部分属于窗体加载难以优化。其他方法的调用都在可接受的范围内,代码的性能基本上符合要求。
单元测试
GitHub代码签入记录
遇到的困难及解决方法
问题描述:
- 对这种项目没有类似的经验,从工具的使用到项目的开发都需要重新学习。
- 对C#没有了解,所以程序上大都是大佬队友完成的。
- 对UI设计没有解决方案。
做过哪些尝试:
- 调用API算法的尝试。
- 对界面进行进一步的完善。
- 帮助大佬队友debug。
是否解决:
已解决。
有何收获:
在大佬的带领下,我只尽到了绵薄之力,不过也学习的了很多新东西。
结对项目真的很考验两个人的配合,这次真的舒服的躺了一波,内心十分不安。
评价队友
值得学习的地方:
学习速度很快,效率很高,算法很6,功能实现的很完善,解决问题很有想法,奶茶必须安排。
需要改进的地方:
学慢点,我跟不上了。
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 103 | 103 | 14 | 14 | 学会了十三水的玩法,对原型设计有了一定的基础; |
2 | 400 | 503 | 10 | 24 | 了解C#各种控件的使用; |
3 | 1313 | 1816 | 30 | 54 | 完善界面的美化工作; |
4 | 1153 | 2969 | 22 | 76 | 对项目进行性能分析,单元测试。 |