第二次结对编程作业


1.链接地址


2.具体分工

  • 杨忠燎同学负责后端AI代码以及前端接口等一系列复杂的操作
  • 严喜同学负责前端UI设计

3.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 30
Estimate 估计这个任务需要多少时间 50 30
Development 开发 1000 1400
Analysis 需求分析 (包括学习新技术) 240 360
Design Spec 生成设计文档 60 20
Design Review 设计复审 30 30
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 20
Postmortem & Process Improvement Plan 事后总结 并提出过程改进计划 30 40
合计 2620 3170

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

  • 网络接口的使用(

    API文档已详细说明

    ,<-可点击查看)

    1. 登录注册和历史战局等接口-->按API文档指定的POST,GET请求。发送请求得到相对应的JSON数据。并对相对应的数据进行处理。登录POST用户名,密码到服务器,得到登录反馈信息。
    2. 开启战局,POST自己token值得到一副牌,并传到AI进行数据出来,最后返回结果。
    3. 最后再POST结果到后端,得到分数。
    4. 历史排行榜,个人历史记录通过GET请求得到JSON数组,解析即可使用。
    5. 注册,POST注册信息到服务器即可使用
  • 代码组织与内部实现设计(类图)

    1. img
      总体一览
    2. img
      ScardAI处理部分
    3. img
      UI接网络接口,接AI
  • 流程图

    img

    -->自己用手机玩十三水很久,发现我每把的游戏思路好像就是这样-->于是我就把他实现了。

    -->后来发现其实对各种牌加权算法很重要(发现自己就是个菜鸡)


5.关键代码解释

-->整体情况

img

--> 把牌存入二维数组,以及把牌化成花色数组和顺子顺子。 以便于后面取牌时使用。

       int x = 0,y = 0;
        for (int i = 0 ; i <cardto.length ; i++){
            if (cardto[i] == '$'){
                x = 0;
            }
            else if (cardto[i] == '&'){
                x = 1;
            }
            else if (cardto[i] == '*'){
                x = 2;
            }
            else if (cardto[i] =='#'){
                x = 3;
            }
            i ++;
            if ('1' < cardto[i] && cardto[i]<='9'){
                y = cardto[i] - '0';
            }
            else{
                if (cardto[i] == '1' && cardto[i+1] == '0'){
                    y = 10;
                    i++;
                }
                else if ( cardto[i] == 'J'){
                    y = 11;
                }
                else if (cardto[i] == 'Q'){
                    y = 12;
                }
                else if (cardto[i] == 'K'){
                    y = 13;
                }
                else if (cardto[i] == 'A'){
                    y = 14;
                }
            }
            i ++;
            scard[x][y] = 1;
            shun[y]++;
            huase[x]++;

-->找出同花顺,其实后面代码差不多。就是遍历二维数组,和花色数组,顺子数组找到并输出。

        flag = 0;
        int temp = 0;
        for (int i=0,j=0;i<scard.length && temp==0;i++){
            for ( j=scard[i].length -1  ;j>=0 && temp==0;j--){
                if ( scard[i][j] == 1 && j-4>=0){
                    if (scard[i][j-1] == 1 && scard[i][j-2] == 1 && scard[i][j-3] == 1 && scard[i][j-4] == 1){
                        scard[i][j] = rank;
                        scard[i][j-1] = rank;
                        scard[i][j-2] = rank;
                        scard[i][j-3] = rank;
                        scard[i][j-4] = rank;
                        shun[j]--;
                        shun[j-1]--;
                        shun[j-2]--;
                        shun[j-3]--;
                        shun[j-4]--;
                        huase[i] =huase[i] -5;
                        flag = 1;
                        temp = 5;
                        break;
                    }
                }
            }
        }
        return;

-->最后再遍历下数组,把前墩,中墩,后墩取出来。转成String字符串输出。

       for (int i = 0;i <scard.length;i++){
            for (int j = 0;j<scard[i].length;j++){
                if (scard[i][j] == 1){
                    if ( i == 0){
                        answer1 = answer1+"$";
                    }
                    else if (i == 1){
                        answer1 = answer1+"&";
                    }
                    else if (i == 2){
                        answer1 = answer1 +"*";
                    }
                    else if (i == 3){
                        answer1 = answer1 +"#";
                    }
                    if (2 <=j && j <= 10){
                        answer1 = answer1 + j;
                    }
                    else if (j == 11){
                        answer1 = answer1 + "J";
                    }
                    else if (j == 12){
                        answer1 = answer1 + "Q";
                    }
                    else if (j == 13){
                        answer1 = answer1 + "K";
                    }
                    else if (j == 14){
                        answer1 = answer1 + "A";
                    }
                    temp1 ++;
                    if (temp1 < 3){
                        answer1 = answer1 + " ";
                    }
        }

-->反正整体思路就是 同花顺->炸弹->葫芦->同花->顺子->三条->两对->一对->散牌(Debug是真麻烦)


6.性能分析与改进

  • 描述你改进的思路

    • 学习一波权衡算法,减少谈心算法带来的毛病
    • 由于是用数组硬遍历的,所以有很多冗余,可以优化
    • 减少后墩取牌时,拆掉前面牌的牌型
  • 展示性能分析图和程序中消耗最大的函数

    img


7.单元测试

-->传入一个String牌型,然后经过处理,看下输出结果是否正确

    public static String trycard(String string) {
        System.out.println(string);
        String gcard =  string;
        Scard scard = new Scard(gcard);
        String res = scard.Doit();
        System.out.println(res);
        return res;
    }
    void display(){
        for (int i =0,j = 0;i<scard.length;i++){
            for ( j=scard[i].length - 1;j>=0;j--){
                out.print(scard[i][j]);
            }
            out.println();
        }
        for (int x : shun){
            out.print(x + " ");
        }
        out.println();
        for (int x : shun){
            out.print(x);
        }
        for (int x: huase){
            out.println(x);
        }
    } 

-->每次随机构造13张牌,并且转化为符合接口参数格式的字符串,再调用接口方法,打印出结果


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

img


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

  • 问题描述 -->接口交互问题,不知道怎么把数据传输。跨域问题。
  • 做过哪些尝试 -->首先度娘找了好久的相关问题以及解析,然后再和同学交流问题。
  • 是否解决 -->几乎解决了吧,百度上看了很多样例。再看了同学的代码(弱者无能,没办法,白嫖)。
  • 有何收获 -->有问题是真的很痛苦,但是解决问题的感觉是真的爽

10.评价你的队友

  • 值得学习的地方
    • 忠燎大佬强强强,实力带飞,不嫌弃我拖后腿,感动!!!
  • 需要改进的的地方
    • 注意休息,劳逸结合,身体重要

11.学习进度条

周数 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 0 0 2 2 Java起步学习
2 400 400 9 9 学习美工和前端
3 800 1200 5 5 对于前后端交互的理解
4 500 1700 4 4 对于代码的优化,Debug