具体分工
刘俊杰:原型设计
罗继鸿: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++;
}
}
}
Github代码签入记录
遇到的代码模块异常或结对困难及解决方法
问题描述
jsonarray数组一个套着一个,不知道怎么提取出来
做过哪些尝试
尝试各种奇奇怪怪的方法。
是否解决
解决了
有何收获
基本上学会了json怎么用
评价你的队友
值得学习的地方
需要改进的地方
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 2 | 2 | 学习axure rp9的使用 |