| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 537 人关注过本帖
标题:求大神帮助
只看楼主 加入收藏
q83607771
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-7-11
结帖率:0
  已结贴   问题点数:10  回复次数:2   
求大神帮助
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#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 i=0,j=0;   
char cai[5];
char ncai[5]={0};
int a=0,b=0;
int guess(int A,int B)
{   

    int x,t;
    while(i<10)
        {
            if(4==M)
                x=i*1111;
            else
                x=i*111;
                 
            if(A==1)
                cai[j++]=i+47;
            i++;
            if(M==j) break;
        
            return x;
        }
    if(A==M&&B==0){
        i=0;j=0;a=0;b=0;
    }
    else i=10 ;   
    cai[j]=0;  
   
    x=atoi(cai);
    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个3位或4位的十进制整数,各个数位上的数字各不相同,用户给出猜测,计算机回答XAYB(X个位置和数字猜中,Y个数字猜中但位置错误),重复用户猜计算机回答的过程,直到猜中为止(3A0B,4A0B)。
这里,将给出若干组相关的数据供猜测(即第i把猜123,第j把不可能是123)。比谁的程序猜测的总次数最少。
文件“猜数字测试代码.txt”是给学生的,函数int guess(int A,int B)是学生需要完成的,其中参数A和B就是计算机根据上次猜测返回的结果,若是3A0B(以猜3个数为例),表示新一把猜测的开始。
上面guess是我自己写的实在是不会了求大神帮忙!!!
搜索更多相关主题的帖子: int for count ++i player 
2018-08-23 00:33
q83607771
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-7-11
  得分:0 
求大神帮忙啊!!!!!!
2018-08-23 19:04
尘安
Rank: 2
等 级:论坛游民
威 望:1
帖 子:19
专家分:55
注 册:2018-8-9
  得分:10 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

/**
*   猜数字游戏规则:
*   电脑在0~9之间任意不重复地选择四个排列成四位数
*   玩家猜测使用的是哪四个数字和数字在第几位
*   A表示数字和位置都对了,B表示数字对了但位置不对
*   A,B前面的数字表示处于两种情况下的数字个数
*/

#define N 4

int main()
{
    int answer[N];          //存放答案
    int guess,times=0,a,b;  //玩家猜测的数,猜测次数,A情况的个数,B情况的个数
    int i,j;                //循环变量
    for(i=0;i<N;i++)
    {
        srand((unsigned)time(NULL));
        answer[i]=rand()%10;            //产生10以内的数
        for(j=0;j<i;j++)
            while(answer[i]==answer[j]) //判断是否与之前产生的随机数相同
            {
                answer[i]=rand()%10;    //若相同,则重新生成
                j=0;    //重新遍历
            }
        printf("%d",answer[i]);
    }
    while(a!=4)
    {
        a=0;
        b=0;    //初始化
        times++;
        printf("---------- 第%d次猜测 ----------\n",times);
        printf("请输入猜测的数:");
        while(1)
        {
            int t;  //临时变量
            t=scanf("%d",&guess);   //接收返回值
            fflush(stdin);
            if(t==1)    //判断输入的是否是纯数字
            {
                if(guess>1000&&guess<9999)  //判断是否是一个四位数
                    break;
                else
                    printf("输入有误,请输入一个四位数:");
            }
            else
                printf("输入有误,请重新输入:");
        }
        guess+=1;   //不知道什么原因,反正加了这句,基于下面的神经病表达式,然后程序就正常了
        for(i=3;i>=0;i--)
        {
            for(j=0;j<N;j++)
                if((int)(guess/pow(10,i))==answer[j])
                {
                    if(i+j==3)
                        a++;
                    else
                        b++;
                }
            guess=guess-(int)(guess/pow(10,i))*pow(10,i);     //这个表达式有毒
        }
        printf(" %d A %d B\n",a,b);
    }
    return 0;
}

这个程序没有考虑最高位为0的情况,楼主可以自己再加几句
2018-08-24 14:38
快速回复:求大神帮助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.083982 second(s), 9 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved