猜数游戏c实现
正好刚刚c写了个猜数游戏,一同和大家分享下,代码没有进行
任何优化,但其中有些编程的思想还是值得探讨的
这个猜数游戏的功能是:
计算机产生一个随机四位数,让人猜这个四位数是多少,人输入
这个四位数后,计算机首先判断这个四个数字有几个猜对了,并且
在猜对的数字中又有几位位置也是对的,将结果显示出来,给人以
提示,让人再猜,直到人猜出计算机所想的四位数为止,游戏结束
时,显示一个数用了几次
直接贴代码了
#include <stdio.h>
#include<time.h>
int b[10];
int c[10];
int d[10];
int e[10];
int f[10];
void division(int n,int s[]){
s[0]=n/1000;
s[1]=n/100-s[0]*10;
s[2]=n/10-s[0]*100-s[1]*10;
s[3]=n%10;
}
int main(void)
{
srand((int)time(NULL));
int a=(rand())%10000;
if(a<1000){
a+=5000;
}
division(a,b);
int cont=0;
while(1){
cont++;
int x;
printf("请您输入\n");
scanf("%d",&x);
division(x,c);
int i=0;
int j=0;
int t=0;
int o=0;
for(i=0;i<4;i++){
d[i]=1;
e[i]=1;
f[i]=-1;
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(e[i]==2)
continue;
if(b[i]==c[j]){
if(d[j]){
if(e[i]==1){
t++;
}else{
d[f[i]]=1;
}
d[j]=0;
e[i]=0;
f[i]=j;
}
if(i==j){
o++;
e[i]==2;
}
}
}
}
printf("您有%d个数字猜对\n",t);
printf("其中有%d个数字位置也正确\n",o);
if(o==4){
printf("完全正确!!!\n");
break;
}
printf("请您再接再厉\n");
}
printf("您一共猜了%d次",cont);
return 0;
}
ok,由于c不熟悉库,所以全是基本数据类型
题目中的数字分割我写了个函数很简单,就不说了,然后关键在于
各个数的比较上
1.如何让已经成功的数字不再比较,避免成功数字变大?
解决这个问题的方法是状态的标定,我用d[10]标定c[10],e[10]标定b[10]
这样比较过置0,没比较过为1。
2.成功数字,还得比较,因为万一对应位置上有呢,又该怎么办?
继续状态标定,我让e[10]有另外一种状态,那就是当比较到对应位置成功时置2
当e[i]==2时,那就真正不去比较了
3.如果对应位置对应上了,那前面置d[i]为0的地方应该置1,还人家自由,但我如何
知道对应关系呢
继续增加标定,我用f[10]来标志每个b[i]和c[j]比较成功的时候的对应关系
问题解决,题目很简单,但是通过这个简单的demo,让大家明白状态的重要性,以后编代码的
时候遇到复杂问题,通过这种标定会让问题简单化