
猜数字C语言
猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几...
猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。
Input
输入数据有多组。每组的第一行为一个正整数N(1<=N<=100),表示在这段对话中共有N次问答。在接下来的N行中,每行三个整数A,B,C。gameboy猜这个四位数为A,然后计算机回答猜对了B个数字,其中C个在正确的位置上。当N=0时,输入数据结束。
Output
每组输入数据对应一行输出。如果根据这段对话能确定这个四位数,则输出这个四位数,若不能,则输出"Not sure"。
Sample Input
6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2
2
4815 0 0
2999 3 3
0
Sample Output
3585
Not sure
#include<stdio.h>
#include<string.h>
char num[10001][5];
void panduan(char a[],int b,int c);
void panduan2(char a[],int b,int c);
void jinwei(char a[]);
main()
{
int n,i,b,c,j;
char a[5];
while(scanf("%d",&n),n)
{
for(i=0;i<n;i++)
{
scanf("%s %d %d",a,&b,&c);
if(i==0)
panduan(a,b,c);
else
panduan2(a,b,c);
}
for(j=0;num[j][0]!='\0';j++);
if(j!=0)
printf("Not sure\n");
if(j==0)
printf("%s\n",num[0]);
}
}
void panduan(char a[],int b,int c)
{
char cnum[5]="1000",cnum2[5];
int i,j,k,kc,kb=0,s=0;
while(strcmp(cnum,"9999")<=0)
{
kc=0;
kb=0;
strcpy(cnum2,cnum);
for(i=0;i<4;i++)
{
if(a[i]==cnum[i])
kc++;
for(j=0;j<4;j++)
{
if(cnum2[j]==a[i])
{
kb++;
for(k=j;cnum2[k]!='\0';k++)
cnum2[k]=cnum2[k+1];
}
}
}
if(kb==b&&kc==c)
{
strcpy(num[s],cnum);
s++;
}
cnum[3]++;
jinwei(cnum);
}
}
void jinwei(char a[])
{
int i;
for(i=4;i>0;i--)
{
if(a[i]>'9')
{
a[i]-=10;
a[i-1]++;
}
}
}
void panduan2(char a[],int b,int c)
{
int i,j,k,u,kc,kb,x;
char cnum[5];
for(i=0;num[i][0]!='\0';i++)
{
kc=0;
kb=0;
strcpy(cnum,num[i]);
for(k=0;k<4;k++)
{
if(a[k]==num[i][k])
kc++;
for(j=0;j<4;j++)
{
if(cnum[j]==a[k])
{
kb++;
for(u=j;cnum[u]!='\0';u++)
cnum[u]=cnum[u+1];
}
}
}
if(kb!=b||kc!=c)
{
for(x=i;num[x][0]!='\0';x++)
{
strcpy(num[x],num[x+1]);
}
}
}
} 展开
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。
Input
输入数据有多组。每组的第一行为一个正整数N(1<=N<=100),表示在这段对话中共有N次问答。在接下来的N行中,每行三个整数A,B,C。gameboy猜这个四位数为A,然后计算机回答猜对了B个数字,其中C个在正确的位置上。当N=0时,输入数据结束。
Output
每组输入数据对应一行输出。如果根据这段对话能确定这个四位数,则输出这个四位数,若不能,则输出"Not sure"。
Sample Input
6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2
2
4815 0 0
2999 3 3
0
Sample Output
3585
Not sure
#include<stdio.h>
#include<string.h>
char num[10001][5];
void panduan(char a[],int b,int c);
void panduan2(char a[],int b,int c);
void jinwei(char a[]);
main()
{
int n,i,b,c,j;
char a[5];
while(scanf("%d",&n),n)
{
for(i=0;i<n;i++)
{
scanf("%s %d %d",a,&b,&c);
if(i==0)
panduan(a,b,c);
else
panduan2(a,b,c);
}
for(j=0;num[j][0]!='\0';j++);
if(j!=0)
printf("Not sure\n");
if(j==0)
printf("%s\n",num[0]);
}
}
void panduan(char a[],int b,int c)
{
char cnum[5]="1000",cnum2[5];
int i,j,k,kc,kb=0,s=0;
while(strcmp(cnum,"9999")<=0)
{
kc=0;
kb=0;
strcpy(cnum2,cnum);
for(i=0;i<4;i++)
{
if(a[i]==cnum[i])
kc++;
for(j=0;j<4;j++)
{
if(cnum2[j]==a[i])
{
kb++;
for(k=j;cnum2[k]!='\0';k++)
cnum2[k]=cnum2[k+1];
}
}
}
if(kb==b&&kc==c)
{
strcpy(num[s],cnum);
s++;
}
cnum[3]++;
jinwei(cnum);
}
}
void jinwei(char a[])
{
int i;
for(i=4;i>0;i--)
{
if(a[i]>'9')
{
a[i]-=10;
a[i-1]++;
}
}
}
void panduan2(char a[],int b,int c)
{
int i,j,k,u,kc,kb,x;
char cnum[5];
for(i=0;num[i][0]!='\0';i++)
{
kc=0;
kb=0;
strcpy(cnum,num[i]);
for(k=0;k<4;k++)
{
if(a[k]==num[i][k])
kc++;
for(j=0;j<4;j++)
{
if(cnum[j]==a[k])
{
kb++;
for(u=j;cnum[u]!='\0';u++)
cnum[u]=cnum[u+1];
}
}
}
if(kb!=b||kc!=c)
{
for(x=i;num[x][0]!='\0';x++)
{
strcpy(num[x],num[x+1]);
}
}
}
} 展开
1个回答
展开全部
其实这个程序很简单,思路很清晰
首先产生一个随机的四位数,且每位都不相同
int a[10]={0,1,2,3,4,5,6,7,8,9};
int b,c,i,t;
for(i=0;i<100;i++) //思路就是产生两个10以内的随机数,交换a中这两个下标的数值,
{ //经过多次交换后,着a中的这10个数就打乱了次序,就像是随机数了
b=rand()%10; //这个交换多少次,随便了,只要打乱就可以
c=rand()%10;
if(b!=c)
{t=a[b];a[b]=a[c];a[c]=t;}
}
接着取出连续的a中的4个数,这样就是那个随机数
int suiji[4];
for(i=0;i<4;i++)
suiji[i]=a[i]; //这样随即中就是四个要猜的数,
要是想要第一位不是0,可以这么计算
int j;
for(i=0,j=0;j<4;i++)
{
if(a[0]==0)
continue;
suiji[j++]=a[i];
}
接下来就是输入数据,
int shuru,shr[4],s;
while(1)
{
scanf("%d",&shuru);
s=shuru;
i=3;
while(s)
{
shr[i--]=s%10;
s/=10;
}
if(shuru>1000&&shuru<9999&&shr[0]!=shr[1]&&shr[0]!=shr[1]&&shr[0]!=shr[2]&&shr[0]!=shr[3]&&shr[1]!=shr[2]&&shr[1]!=shr[3]&&shr[2]!=shr[3])
//shuru在1000~9999之间并且各各位不相等,就跳出,否则继续输入
break;
else
printf("Error");
}
接着这个输入的数据和这个随机数的比较了,其实很简单
m是位置和数字都对的。n是数字对,但位置不对的
int m=0,n=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(shr[i]==suiji[j])
n++;
for(i=0;i<4;i++)
if(shr[i]==suiji[i])
m++;
n-=m;
接着是打印输入的数和mn(这个就是判断的结果)这个我就不用再写了吧
清屏用system("cls");
最后是总装,先产生四位的随机数,接着用一个大循环把输入和比较还有打印判断结果包含进去。
退出这个循环的条件有两个,一个是m=4,一个是到了规定的次数
首先产生一个随机的四位数,且每位都不相同
int a[10]={0,1,2,3,4,5,6,7,8,9};
int b,c,i,t;
for(i=0;i<100;i++) //思路就是产生两个10以内的随机数,交换a中这两个下标的数值,
{ //经过多次交换后,着a中的这10个数就打乱了次序,就像是随机数了
b=rand()%10; //这个交换多少次,随便了,只要打乱就可以
c=rand()%10;
if(b!=c)
{t=a[b];a[b]=a[c];a[c]=t;}
}
接着取出连续的a中的4个数,这样就是那个随机数
int suiji[4];
for(i=0;i<4;i++)
suiji[i]=a[i]; //这样随即中就是四个要猜的数,
要是想要第一位不是0,可以这么计算
int j;
for(i=0,j=0;j<4;i++)
{
if(a[0]==0)
continue;
suiji[j++]=a[i];
}
接下来就是输入数据,
int shuru,shr[4],s;
while(1)
{
scanf("%d",&shuru);
s=shuru;
i=3;
while(s)
{
shr[i--]=s%10;
s/=10;
}
if(shuru>1000&&shuru<9999&&shr[0]!=shr[1]&&shr[0]!=shr[1]&&shr[0]!=shr[2]&&shr[0]!=shr[3]&&shr[1]!=shr[2]&&shr[1]!=shr[3]&&shr[2]!=shr[3])
//shuru在1000~9999之间并且各各位不相等,就跳出,否则继续输入
break;
else
printf("Error");
}
接着这个输入的数据和这个随机数的比较了,其实很简单
m是位置和数字都对的。n是数字对,但位置不对的
int m=0,n=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(shr[i]==suiji[j])
n++;
for(i=0;i<4;i++)
if(shr[i]==suiji[i])
m++;
n-=m;
接着是打印输入的数和mn(这个就是判断的结果)这个我就不用再写了吧
清屏用system("cls");
最后是总装,先产生四位的随机数,接着用一个大循环把输入和比较还有打印判断结果包含进去。
退出这个循环的条件有两个,一个是m=4,一个是到了规定的次数
追问
自己已经解决 我觉得我的更简单一些 我先进行第一次判断,吧第一次判断的值得放入一个数组,第二次判断直接从那个数组里面拿,最后判断那个数组是否有且只有一个数字
谢谢了
刚才那个程序少了break 和i--;
追答
我没有仔细看你的程序,模块的功能没有看懂
思路这条线:产生随机数(判断是否有重复)----输入一个数,判断是否符合条件(判断是否越界就是超过9999或者小于1000,判断是否重复,判断是否有非法字符),符合继续,不符合重新输入--------判断位置和数字的正确性。要是位置和数字都对应,正确或者超过输入次数推出;否则继续输入
思路很清晰,就是看你怎么实现这些功能
其实这个程序就是随机数好产生,就是判断是否不重复有点麻烦
其他的功能,只要仔细一些,没什么难度。
这个程序很小,用不用子函数模块意义不是很大。因为调用的次数不多
产生随机数,我看过几个类似的程序代码,感觉我写出的那个是最好的(这个不是我想出来的,是别人的思路)。就是一个10个数的数组,随机交换多次打乱(肯定不会重复)
要是产生一个随机数,取出四位,在判断重复性修改,这样判断起来麻烦。因为你修改了这一位后,还要判断和所有的别的单元是否重复
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询