作业博客链接 https://www.cnblogs.com/venb/p/11672891.html
同学博客链接https://www.cnblogs.com/swh1148318751/p/11679697.html
仓库地址:https://github.com/venbbb/ThirteenWater
fork的仓库地址https://github.com/suweihuan079243/UI.git
UI展示
链接: https://pan.baidu.com/s/16Mk_pd572VO1kvn9OqviBQ 提取码: fy58
分工
陈文彬 负责出牌ai的设计编程,苏伟欢 负责ui的设计编程。
PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
20 |
20 |
· Estimate |
· 估计这个任务需要多少时间 |
10 |
10 |
Development |
开发 |
1000 |
1200 |
· Analysis |
· 需求分析 (包括学习新技术) |
500 |
600 |
· Design Spec |
· 生成设计文档 |
20 |
20 |
· Design Review |
· 设计复审 |
20 |
20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
360 |
360 |
· Coding |
· 具体编码 |
1000 |
1200 |
· Code Review |
· 代码复审 |
60 |
60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
240 |
Reporting |
报告 |
60 |
60 |
· Test Repor |
· 测试报告 |
20 |
20 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
· 合计 |
3240 |
3860 |
解题思路描述与设计实现
-
网络接口的使用
使用Retrofit网络请求库,才用异步方式发送网络请求。参考:https://www.jianshu.com/p/a3e162261ab6
public class Network { public static Api api; public static void init() { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(System.out::println); logging.setLevel(HttpLoggingInterceptor.Level.BASIC); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) .build(); Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(MoshiConverterFactory.create()) .baseUrl("https://api.shisanshui.rtxux.xyz/") .client(client) .build(); api = retrofit.create(Api.class); } }
-
代码组织与内部实现设计
Operation | 对牌型进行判断并出牌 |
Resort | 对所给的牌从小到大进行排列 |
Dealer | 发牌员类,进行发牌 |
Player | 玩家类,进行看牌,出牌 |
Network | 创建 Retrofit 实例 创建 网络请求接口实例 并 配置网络请求参数 |
NetworkTest | 发送网络请求并提交数据 |
LoginReponse | 存储接收登录返回的数据 |
OpenReponse | 存储接收开启战局返回的数据 |
ReigisterReponse | 存储接收注册返回的数据 |
SubmitReonse | 存储接收提交返回的数据 |
SubmitRequest | 存储向服务器发送的数据 |
UserDto | 存储用户登录信息 |
-
算法的关键与关键实现部分流程图
1.要对向服务器请求返回的手牌进行从小到大重新排列。
2.通过统计单牌,双牌,三牌,四牌的数量来进行对牌型的判断。
关键代码解释
/** * 把花色去掉,统计牌型 * a1的值为手牌中重复一次(单张牌)的牌,a2的值为手牌中重复二次(对牌)的牌, * a3的值为手牌中重复三次(三张)的牌,a4的值为手牌中重复四次(炸弹)的牌。 */ public void countPoker(ArrayList<String> handPoker) { countColor(handPoker); for(String str : handPoker){ str = str.substring(1); numList.add(str); } int index = 0; while (true) { if ( index < numList.size() - 3 && numList.get(index).equals(numList.get(index + 3)) ) { a4.append(numList.get(index)); index = index + 4; } else if (index < numList.size() - 2 && numList.get(index).equals(numList.get(index + 2))) { a3.append(numList.get(index)); index = index + 3; } else if (index < numList.size() - 1 && numList.get(index).equals(numList.get(index + 1))) { a2.append(numList.get(index)); index = index + 2; } else { a1.append(numList.get(index)); index = index + 1; } if (index >= 13) break; }
性能分析与改进
存在的问题:
1.后墩有时候小于中墩 如 后墩10 10 10 6 6 ,中墩A A A 5 5
2.只能从散排中判断顺子的满足条件,不能拆牌。
改进思路:
1.对每种牌型赋予一个价值,来判断后墩和中墩的大小问题。
2.暂时没有思路。
性能分析图:。
单元测试
package game; import org.junit.jupiter.api.Test; import java.util.ArrayList; import static org.junit.Assert.assertEquals; import static org.junit.jupiter.api.Assertions.*; class outTest { @Test void resort() { String str = "&K &6 $J &10 *2 &2 $A *6 *K #3 *10 #K #2"; ArrayList<String> test = new ArrayList<>(); test = out.resort(str); ArrayList<String> result = new ArrayList<>(); assertEquals("[*2, &2, #2, #3, &6, *6, &¥, *¥, $J, &K, *K, #K, $A]",test.toString()); } }
测试Resort函数
Github的代码签入记录
遇到的代码模块异常或结对困难及解决方法
- 问题描述:不知道UI设计应该用写什么比较好;不知道要怎么用API, 申请网络请求。
- 做过哪些尝试:pygame,javafx,web; OKhttp,HttpURLConnection,Retrofit。
- 是否解决:是。
- 有何收获:学会怎么使用API,申请网络请求。了解了UI界面的编写。
评价你的队友
- 值得学习的地方:学习能力强。
- 需要改进的地方:心态不好。
学习进度条
第N周 |
新增代码(行) |
累计代码(行) |
本周学习耗时(小时) |
累计学习耗时(小时) |
重要成长 |
1 |
300 |
300 |
20 |
20 |
熟悉规则,设计算法 |
2 |
400 |
700 |
18 |
38 |
完善算法,解决细节问题 |
3 |
800 |
1500 |
25 |
63 |
掌握Retrofit发送网络请求 |