• 软工第二次结对编程作业


    罗继鸿的博客
    刘俊杰的博客
    Github地址


    具体分工

    刘俊杰:原型设计
    罗继鸿:AI算法,后端

    PSP表格

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


    解题思路描述与设计实现

    AI的思想:首先,对于任何一吨牌,按大小赋予一个等级,共计130各等级左右。对于一副牌,自己拿13,还剩39,剩余39张牌选出5张牌,共有575757种情况。开一个桶存下每个等级的牌型的数量。再取前缀和,则每个桶内存的值代表小于等于该等级的牌的数量的大致期望。自己拿的13张牌,共有72072种组合方法,其中有一些方法不合理。对于合理的方案,设每种方案的优秀度为X,方案的牌型分别为A,B,C。牌型A,B,C所代表的等级的桶内值分别为x,y,z。显然,方案的优秀度X和x,y,z成正相关。设X=ax+by+cz。其中a,b,c为常数,暂定为1。根据此方法找出优秀度最高的方案。

    网络接口的使用

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

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

    算法的关键在于评分,不过水平太次,写不出好的评分方案


    关键代码解释

    用dfs找出所有方案,并且一直更新最佳方案

        void get_suit_card()
        {
            All_Card play_A=get_all_card(chA,5);
            All_Card play_B=get_all_card(chB,5);
            All_Card play_C=get_all_card(chC,3);
            if ( play_C.less_equ(play_B) && play_B.less_equ(play_A) )
            {
                int nowval=Sum_Rank[ play_A.Trank ]+
                        Sum_Rank[ play_B.Trank ]+Sum_Rank[ play_C.Trank ];
                if ( nowval>top_val )
                {
                    ans_Card[1]=play_A;
                    ans_Card[2]=play_B;
                    ans_Card[3]=play_C;
                    top_val=nowval;
                }
            }
        }
        public void dfs_nowcard(int val[],int pos,int totA,int totB,int totC)
        {
            if ( pos==14 )
            {
                get_suit_card();
                return;
            }
            if ( totA<5 )
            {
                chA[totA+1]=val[pos];
                dfs_nowcard(val,pos+1,totA+1,totB,totC);
            }
            if ( totB<5 )
            {
                chB[totB+1]=val[pos];
                dfs_nowcard(val,pos+1,totA,totB+1,totC);
            }
            if ( totC<3 )
            {
                chC[totC+1]=val[pos];
                dfs_nowcard(val,pos+1,totA,totB,totC+1);
            }
        }
    

    性能分析与改进

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

    被调用了几万次。

    void get_suit_card()
        {
            All_Card play_A=get_all_card(chA,5);
            All_Card play_B=get_all_card(chB,5);
            All_Card play_C=get_all_card(chC,3);
            int a=10,b=10,c=1;
            if ( play_C.less_equ(play_B) && play_B.less_equ(play_A) )
            {
                if ( top_val==0 )
                {
                    int nowrank0=play_A.rank[0]+play_B.rank[0]+play_C.rank[0];
                    int nowrank1=play_A.rank[1]+play_B.rank[1]+play_C.rank[1];
                    tot_rank0=nowrank0;
                    tot_rank1=nowrank1;
                    ans_Card[1]=play_A;
                    ans_Card[2]=play_B;
                    ans_Card[3]=play_C;
                    top_val=1;
                }
                else
                {
                    int nowrank0=play_A.rank[0]+play_B.rank[0]+play_C.rank[0];
                    int nowrank1=play_A.rank[1]+play_B.rank[1]+play_C.rank[1];
                    if ( nowrank0>tot_rank0 )
                    {
                        tot_rank0=nowrank0;
                        tot_rank1=nowrank1;
                        ans_Card[1]=play_A;
                        ans_Card[2]=play_B;
                        ans_Card[3]=play_C;
                    }
                    else if ( nowrank0>=tot_rank0 && nowrank1>=tot_rank1 )
                    {
                        tot_rank0=nowrank0;
                        tot_rank1=nowrank1;
                        ans_Card[1]=play_A;
                        ans_Card[2]=play_B;
                        ans_Card[3]=play_C;
                    }
                }
    
            }
        }
    

    单元测试

    将转化后卡牌数据输入到my_val[],经过处理将输出的卡牌数据放入ans_val[]。

    /*
    	花色编号 红桃1,方块2,梅花3,黑桃4
    	红桃2~A编号为 1~13  *
    	方块2~A编号为 14~26 $
    	梅花2~A编号为 27~39 &
    	黑桃2~A编号为 40~52 #
    */
    
    public void get_ans(int my_val[],int ans_val[]){
            cnt=0;
            top_val=0;
            for( int i=0;i<140;i++ )
            {
                Rank[i]=0;
                Sum_Rank[i]=0;
            }
            for( int i=1;i<=13;i++ )
                for( int j=2;j<=13;j++ )
                    if ( my_val[j]<my_val[j-1] ) {
                        int temp;
                        temp=my_val[j];
                        my_val[j]=my_val[j-1];
                        my_val[j-1]=temp;
                    }
            int tt=0;
            for( int i=1;i<=52;i++ )
            {
                boolean have=false;
                for( int j=1;j<=13;j++ )
                    if ( i==my_val[j] )
                        have=true;
                if ( have==false )
                {
                    last_card[tt]=i;
                    tt++;
                }
            }
            dfs_lastcard(0,0);
            //System.out.println(cnt);
            for( int i=1;i<=130;i++ )
                Sum_Rank[i]=Sum_Rank[i-1]+Rank[i];
            dfs_nowcard(my_val,1,0,0,0);
            int cc=1;
            for( int i=1;i<=3;i++ )
            {
                int xx=5;
                if ( i==3 )
                    xx=3;
                for( int j=1;j<=xx;j++ )
                {
                    //System.out.println(ans_Card[i].my[j].num);
                    ans_val[cc]=Card_num_to_val( ans_Card[i].my[j].num,ans_Card[i].my[j].color );
                    cc++;
                }
            }
        }
    

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

    问题描述

    jsonarray数组一个套着一个,不知道怎么提取出来

    做过哪些尝试

    尝试各种奇奇怪怪的方法。

    是否解决

    解决了

    有何收获

    基本上学会了json怎么用


    评价你的队友

    值得学习的地方

    刻苦钻研的精神和热情

    需要改进的地方

    老熬夜


    学习进度条

    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 0 0 2 2 学习axure rp9的使用
    2 0 0 4 6 学习http相关
    2 400 400 10 16 学习java
    3 0 0 3 19 学习swing

    UI

    没得UI

  • 相关阅读:
    stm8s103 EEPROM烧程序时能否保留
    NEC芯片特别说明
    pic中断特别说明
    删除排序链表中的重复元素 II
    被围绕的区域
    计数二进制子串
    简单工厂模式
    打家劫舍 II
    打家劫舍
    相同的树
  • 原文地址:https://www.cnblogs.com/ljj237085795/p/11679937.html
Copyright © 2020-2023  润新知