凯升L 2017-08-29 09:46 采纳率: 0%
浏览 1175
已结题

C语言 新奇版 猜数字

只需要将以下代码改成电脑随机生取数,再由电脑猜出来,改int guess 那里即可
尽量使次数少一些。

#include
#include
#define M 4 //猜几个数字
//交换
void swap(int*a,int*b)
{
int t=*a;
a=*b;
*b=t;
}
//将数组随机打乱
void random_shuffle(int
a,int n)
{
int i;
for(i=0;i<n;i++)
{
int x=rand()%n;
int y=rand()%n;
if(x!=y) swap(a+x,a+y);
}
}
//生成数位不重复的M位全部数据,存在数组a中,并打乱,备用
int gen(int* a)
{
int count=0,i,j;
int max=1;
for(i=0;i<M;++i,max*=10);

for(i=0;i<max;++i)
{
_Bool flag[10]={0};
int t=i;
for(j=0;j<M;++j)
if(flag[t%10]) break;
else flag[t%10]=1,t/=10;
if(j==M)
a[count++]=i;

}
random_shuffle(a,count);
return count;
}
void test(int answer,int player,int* A,int* B)
{
int i=0,j;

int answer_a[M]={0},player_a[M]={0};
*A=*B=0;

while(answer||player)
{
    answer_a[i]=answer%10;
    player_a[i++]=player%10;
    answer/=10;
    player/=10;
}
for(i=0;i<M;++i)
    for(j=0;j<M;++j)
       if(player_a[i]==answer_a[j])
           if(i==j) ++*A;
            else ++*B;

}
//参数AB是上一轮猜测的反馈,
//如果得到猜中的信息表示下一把的开始
int guess(int A,int B)
{
//你的工作在这个函数
int x;
scanf("%d",&x);
return x;
}
int main()
{
srand(2);
int i;
//初始生成数据
int len;
for(len=1,i=0;i<M;++i)
len*=10-i;
int a[len];
gen(a);
//开玩
int n=1;//玩n把
int count=0;//总猜测次数
while(n--)
{
//每把从猜中开始,例如玩4个数,4A0B为猜中,
//此时进入下一把,会有新的数供猜测
//printf("%d\n",a[n]);
int A=M,B=0;
int count_cur=0;
do
{
int player=guess(A,B);
++count_cur;
test(a[n],player,&A,&B);
printf("%d:%0*d,%dA%dB\n",count_cur,M,player,A,B);
}while(A!=M||B);
count+=count_cur;
}
return 0;
}

  • 写回答

1条回答 默认 最新

  • 哈哈哈蜜瓜 2017-08-30 09:01
    关注

    #include
    #include
    #define M 4 //猜几个数字
    //交换
    void swap(int*a,int*b)
    {
    int t=*a;
    a=*b;
    b=t;
    }
    //将数组随机打乱
    void random_shuffle(int a,int n)
    {
    int i;
    for(i=0;i<n;i++)
    {
    int x=rand()%n;
    int y=rand()%n;
    if(x!=y) swap(a+x,a+y);
    }
    }
    //生成数位不重复的M位全部数据,存在数组a中,并打乱,备用
    int gen(int
    a)
    {
    int count=0,i,j;
    int max=1;
    for(i=0;i<M;++i,max*=10);

    for(i=0;i<max;++i)
    {
    _Bool flag[10]={0};
    int t=i;
    for(j=0;j<M;++j)
    if(flag[t%10]) break;
    else flag[t%10]=1,t/=10;
    if(j==M)
    a[count++]=i;

    }
    random_shuffle(a,count);
    return count;
    }
    void test(int answer,int player,int* A,int* B)
    {
    int i=0,j;

    int answer_a[M]={0},player_a[M]={0};
    A=*B=0;
    while(answer||player)
    {
    answer_a[i]=answer%10;
    player_a[i++]=player%10;
    answer/=10;
    player/=10;
    }
    for(i=0;i<M;++i)
    for(j=0;j<M;++j)
    if(player_a[i]==answer_a[j])
    if(i==j) ++*A;
    else ++*B;
    }
    //参数AB是上一轮猜测的反馈,
    //如果得到猜中的信息表示下一把的开始
    int guess(int A,int B)
    {
    //你的工作在这个函数
    int x;
    scanf("%d",&x);
    return x;
    }
    int main()
    {
    srand(2);
    int i;
    //初始生成数据
    int len;
    for(len=1,i=0;i<M;++i)
    len
    =10-i;
    int a[len];
    gen(a);
    //开玩
    int n=1;//玩n把
    int count=0;//总猜测次数
    while(n--)
    {
    //每把从猜中开始,例如玩4个数,4A0B为猜中,
    //此时进入下一把,会有新的数供猜测
    //printf("%d\n",a[n]);
    int A=M,B=0;
    int count_cur=0;
    do
    {
    int player=guess(A,B);
    ++count_cur;
    test(a[n],player,&A,&B);
    printf("%d:%0*d,%dA%dB\n",count_cur,M,player,A,B);
    }while(A!=M||B);
    count+=count_cur;
    }
    return 0;
    }

    评论

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试