- 杨晋南博客链接:https://www.cnblogs.com/Aka1i/p/11674888.html
- 石晓楠博客链接:https://www.cnblogs.com/sayoko/p/11676347.html 0
- 前端项目地址:https://github.com/aka1i/Card13View
- 后端项目地址:https://github.com/aka1i/Card13SpringBoot
运行视频:
https://pan.baidu.com/s/15abi5Xw8WH4aZyRc3OjidQ
具体分工
- 小杨同学负责后端AI代码以及前端接口等一系列复杂的操作
- 小蓝同学负责前端UI设计和实现
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 30 |
Estimate | 估计这个任务需要多少时间 | 50 | 30 |
Development | 开发 | 1000 | 1200 |
Analysis | 需求分析 (包括学习新技术) |
240 | 360 |
Design Spec | 生成设计文档 | 60 | 30 |
Design Review | 设计复审 | 30 | 20 |
Coding Standard | 代码规范 (为开发制定合适的规范) |
30 | 20 |
Design | 具体设计 | 120 | 120 |
Coding | 具体编码 | 360 | 360 |
Code Review | 代码复审 | 180 | 120 |
Test | 测试 (自我测试,修改,提交修改) |
360 | 540 |
Reporting | 报告 | 60 | 60 |
Test Report | 测试报告 | 20 | 20 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan |
事后总结 并提出过程改进计划 |
30 | 30 |
合计 | 2620 | 2950 |
解题思路描述与设计实现说明
网络接口的使用
登录注册和历史战局等接口没什么好说的,就是调用post或者get方法,然后进行数据的发送和获取数据并加以展示。开启战局和出牌部分的需要通过开启战局获取的card数据发送至自己的后端接口中,并返回排列好的前中后墩,然后通过出牌接口发送至助教的接口中
代码组织与内部实现设计(类图)
说明算法的关键与关键实现部分流程图
关键在于牌型的排序和分类,以及对各种牌型的权衡
关键代码解释
Collections.sort(handCard,new Comparator<Card>() //从小到大排序
{
public int compare(Card c1, Card c2)
{
int i = c1.rank - c2.rank;
if(i == 0)
return c1.type - c2.type;
return i;
}
});
- 根据牌型花色排序
public void arrange(List<Card> handCard)
{
arr.ranknum1.clear();
arr.ranknum2.clear();
arr.ranknum3.clear();
arr.ranknum4.clear();
arr.typenum1.clear();
arr.typenum2.clear();
arr.typenum3.clear();
arr.typenum4.clear();
for(int i=0;i<handCard.size();i++)
{
if((i+1)<handCard.size()&&handCard.get(i).rank==handCard.get(i+1).rank)
if((i+2)<handCard.size()&&handCard.get(i).rank==handCard.get(i+2).rank)
if((i+3)<handCard.size()&&handCard.get(i).rank==handCard.get(i+3).rank) //四张相同的牌
{
arr.ranknum4.addAll(handCard.subList(i,i+4));
i+=3;
}
else //三张相同的牌
{
arr.ranknum3.addAll(handCard.subList(i,i+3));
i+=2;
}
else //两张相同的牌
{
arr.ranknum2.addAll(handCard.subList(i,i+2));
i+=1;
}
else //没有相同的牌
{
arr.ranknum1.add(handCard.get(i));
}
}
for(int i=0;i<handCard.size();i++)
{
switch(handCard.get(i).type)
{
case 1:arr.typenum1.add(handCard.get(i));break;
case 2:arr.typenum2.add(handCard.get(i));break;
case 3:arr.typenum3.add(handCard.get(i));break;
case 4:arr.typenum4.add(handCard.get(i));break;
}
}
}
- 获得手牌先记录各个花色的牌
- 然后记录散牌,对子,3个相同的牌,炸弹
性能分析与改进
- 判断是不是特殊牌,如果是就直接输出
- 获得手牌先记录各个花色的牌
- 然后记录散牌,对子,3个相同的牌,炸弹
- 分别存在不同数组方便之后判断牌型
- 判断中后墩类型
- 剩下为前墩
展示性能分析图和程序中消耗最大的函数
单元测试
展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路
public static void main(String[] args) {
List<Card> allCards = new ArrayList<>();
Random random = new Random();
CardController cardController = new CardController();
for (int i = 1;i <= 4; i++){
for (int j = 1; j <= 13; j++){
allCards.add(new Card(j,i));
}
}
for (int i = 0; i < 10; i++){
List<Card> tempCards = new ArrayList<>();
List<Card> cards = new ArrayList<>();
tempCards.addAll(allCards);
for (int j = 0; j < 13; j++){
Card card = tempCards.get(random.nextInt(52 - j));
cards.add(card);
tempCards.remove(card);
}
String cardStr = "";
for (int j = 0; j < 13; j++){
Card card = cards.get(j);
cardStr += card.toString();
if (j < 12)
cardStr += " ";
}
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("id",0);
jsonObject.put("card",cardStr);
} catch (JSONException e) {
e.printStackTrace();
}
System.out.println(cardController.card2(jsonObject.toString()));;
}
}
每次随机构造13张牌,并且转化为符合接口参数格式的字符串,再调用接口方法,打印出结果
贴出Github的代码签入记录
后端
前端
遇到的代码模块异常或结对困难及解决方法
问题描述
前端遇到的问题挺多的,一开始是完全不了解桌面应用开发,连GUI都没有听过,然后因为用的是python,所以打算尝试使用pyqt来进行开发。在学习的过程中遇到了许许多多的小麻烦,例如打开另一个窗口时出错,背景图无法显示等问题,在调用接口的时候也遇到了不会调接口,每个请求的写法不会,无数次请求失败。后端部分的问题包括接口如何写以及如何部署,还有关键的算法编写。
做过哪些尝试
- 前端:做过在b站上看视频以及在csdn博客论坛里找解决的办法,询问靠谱的队友等尝试
- 后端:起初打算用机器学习的方法,快速入门了python,看了点框架,发现没有想象中那么容易入门。后来放弃了老老实实写算法。接口和服务器部署靠视频和网上的资料解决。
是否解决
虽然耗时很长,过程很艰辛,但最后都解决了。
有何收获
学习python,了解机器学习,学习13水算法。了解团队合作的重要性。
评价你的队友
值得学习的地方
过于优秀,速成python前端,做出来的东西远超预期。个人认为作品完成度较高。在本次结对合作中起到关键作用。
需要改进的地方
总的来说挺好的,偶尔可能会拖延症发作?
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 3 | 3 | 了解原型开发工具 |
2 | 0 | 0 | 25 | 28 | 了解算法,速成python,尝试机器学习后放弃 |
3 | 1000 | 1000 | 30 | 58 | 编写算法 |
4 | 200 | 1200 | 15 | 72 | 微调算法,修改细节,部署接口 |