第二次结对编程作业

运行视频:

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 微调算法,修改细节,部署接口
posted @ 2019-10-15 18:12  阿卡林丶  阅读(264)  评论(2编辑  收藏  举报