软工第二次结对编程作业

罗继鸿的博客
刘俊杰的博客
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

posted @ 2019-10-15 19:54  花式  阅读(165)  评论(3编辑  收藏  举报