第二次结对编程作业

五迷三道 提交于 2020-03-15 17:46:48

1、在文章开头给出结对同学的博客链接、本作业博客的链接、你所Fork的同名仓库的Github项目地址

队友的博客:陈秋琴
队友的本次博客:
Github地址:在这里


2、给出具体分工

秋琴:交互,API,算法。

雅辉:界面,算法调试,博客。


3、给出PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 60
Estimate ·估计这个任务需要多少时间 30 60
Development 开发 2760 3570
Analysis 需求分析 (包括学习新技术) 120 180
Design Spec 生成设计文档 60 60
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 30
Design 具体设计 90 120
Coding 具体编码 2100 2700
Code Review 代码复审 120 150
Test 测试(自我测试,修改代码,提交修改) 200 300
Reporting 报告 120 135
Test Repor 测试报告 45 60
Size Measurement 计算工作量 30 30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 45 45
合计 2910 3765

4、解题思路描述与设计实现说明

网络接口的使用

  • 网络接口:使用的是android的Retrofit v2.0来调用接口

代码组织与内部实现设计(类图)

说明算法的关键与关键实现部分流程图

  • 我们这次的算法的一个重要思想就是:通过等级制度来制定出牌战略。通过总的等级数的大小来进行整体牌面的布局。
  • 另一个重要思想就是:挑选两副牌进行比较后出牌。两幅牌的后墩(即本次出牌中最大的)分别是读取的13张牌中可以得到的最大的牌型和次大的牌型,计算两副牌的等级,将大牌进行输出。这种想法相对于贪心方法(一直提取当前最大牌)来说,比较好的保留了“拆掉一副特别大的牌,换取两副等级同样比较高的牌”的情况。


5、关键代码解释

三个整理牌面的函数

      //牌面
      int[] Cutcards(String cards){
      String[] cardsplit = cards.split(" ");
      int cardd[];
      cardd = new int[13];
      int j=0;
      for(String a:cardsplit){
          String c ="";
          if (a.contains("J"))
              c = a.replace("J","11");
          else if (a.contains("Q"))
              c = a.replace("Q","12");
          else if (a.contains("K"))
              c = a.replace("K","13");
          else if (a.contains("A"))
              c = a.replace("A","14");
          else
              c = a;
          try {
              cardd[j] = Integer.parseInt(c);
          } catch (NumberFormatException e) {
              e.printStackTrace();
          }
          if (cardd[j]<100){
              cardd[j]=(cardd[j]/10)*100+cardd[j]%10;
          }
          j++;
      }
      return cardd;
  }
      //花色
      int[] getcolor(int card[]){
      int color[];
      int s;
      color = new int[5];
      for (int i=0;i<card.length;i++){
          s=card[i]/100;
          color[s]++;
      }
      return color;
  }
      //数字
      int[] getnum(int card[]){
      int num[];
      int s;
      num = new int[15];
      for (int i=0;i<card.length;i++){
          s=card[i]%100;
          num[s]++;
      }
      return num;
  }

将读入的字符串变成图片显示出来

      public static void loadFilesIntoImageView(Context context, List<String> fileNames, List<ImageView> imageViews) {
      Resources resources = context.getResources();
      for (int i = 0; i < 13; i++) {
          int resourceId = resources.getIdentifier(
                  fileNames.get(i), "drawable",
                  context.getPackageName());
          System.out.println("load: number" + i +fileNames.get(i));
          Drawable image = resources.getDrawable(resourceId, null);
          Glide.with(context).load(image).override(Target.SIZE_ORIGINAL).into(imageViews.get(i));
      }
  }

6、性能分析与改进

描述你改进的思路

  • 调用方法时传递的参数以及在调用中创建的临时变量都保存在stack中,速度较快;其他变量,如静态变量、实例变量等,都在heap中创建,速度较慢。在改进代码的过程中尽量都使用局部变量。

  • 本次作业中需要把数组进行复制以便两组数据进行操作,直接赋值报错后改进为.copy函数。(使用System.arraycopy ()代替通过来循环复制数组也会快很多)

展示性能分析图和程序中消耗最大的函数

7、单元测试

展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路

下图展示的是单元测试所有函数后的结果——我们构建的所有函数都可以获得预期的值

下图的函数为我们的输出函数。构造测试样例对应的输出应为“字符(代表花色)+数字”,样例构造上我们同样设定了13个数据为一组模拟出牌情况。

下图为特殊牌型的构造样例的部分图片(太长了一张图放不下了)。我们抽取了10个特殊牌型分别构造测试样例。

下图为“找同花”函数的构造样例图片。两个样例的结果分别为两个不同的花色,较好的体现了函数的作用性

下图为“找两对”函数的构造样例图片。两个样例的查找结果分别为有两对且分别输出两对牌对应的数字和无两对,较好地体现了函数的作用性


8、贴出Github的代码签入记录

秋琴:

雅辉:


9、遇到的代码模块异常或结对困难及解决方法

问题描述

  • api调用:从前没有接触这个,网上百度了也看得是很懵逼(面向百度学习失败)。

  • 算法:我们两个人对于打牌这回事可能就一个人比较上点道,但是懂得打跟会写算法真是有(fei)点(chang)困难。

  • 使用语言的选择:上次作业用唱过python的甜头之后在网上搜了一下,就开始尝试用Qt5做界面。但是尝试了两天以后,一开始遇到的是界面的背景会传给控件(子孙),并且界面背景搞进去以后显示不出来等问题。最后勉勉强强做出一个只有几个按钮的界面,与一开始Axure写的界面有很大的出入。所以我们就开始思考是不是应该换个方向。

做过哪些尝试

  • 首先是面向百度学习(学习失败),最后去问了庆焰男神。

  • 一开始的时候都不知道一整个流程要怎么下来,和队友商量了一下以后,一开始写了一个简单的框架,然后我就开始写了。写到一半的时候就卡住了,发现不太对,各个参数没有办法联系在一起。后面又详细的讨论了一下整个流程,并画出框架和流程图,以及数据的使用。

  • 国庆前的深夜尝试了各种方法(百度、随缘点击、问同学)

是否解决

  • 庆焰男神进行了详细的讲解,让我懂了一些,但是在应用方面的话还是有点不太懂用。

  • 成功写出了一个还比较满意的算法。

  • 编程语言换成了JAVA,用AS替代了Qt5。

有何收获

  • 自学能力和面向百度资料查找能力还需要好好努力啊!

  • 最后把算法写出来的时候真的觉得:有一个完整的想法和思路是多么的重要啊!

  • 当初做出换方向的决定是很正确的,有的时候还是需要有勇气去实现自己的想法吧。

  • 当百度不管用时,周围的大佬们是很好的求助对象。


10、评价你的队友

秋琴说:

值得学习的地方:在这次结对编程作业中,我们都有许多需要学习的地方,队友乐意去学习新的知识并尝试,同时主动分担一些任务来做,在算法方面,虽然我们的算法有许多的不足,但是都是我们两个讨论出来的。我需要熬夜的话,他也会陪着我熬夜。(赞!)
需要改进的地方:想了许久没想出来。每一次合作都是两个人的摩擦与碰撞,如果有需要改进的地方的话,可能自己也有部分的原因。

雅辉说:

这次的队友是优秀的秋琴学姐优点嘛就很多啊,她会很耐心教什么都不会的我、给我打个样然后让我学着写;她自己很拼,为了做好这个项目也刷新了熬夜记录;她责任心也和能力一样强,看我这么菜就真的承担了很多很难的部分(呜呜呜呜我爱她)。说到 改进的话,其实我觉得她很好不要改了吧,要是非要写一个的话,那就希望她以后除了组队以外的平时也多带带我吧。


11、学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 6 6 上手Axure RP,基本设计好界面
2 200 0 21 27 讨论算法如何构建,大致分工,使用PyCharm和Qt5进行编写
3 1510 1510 21 48 改换安卓,使用AS和IDEA进行界面制作和算法编写
4 2107 3617 50 98 算法优化,交互,接口调试

12、视频

链接: https://pan.baidu.com/s/1yYJcE84MavfuBzpvmOPqeg

提取码: i5pk

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!