猜数游戏c实现

猜数游戏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,让大家明白状态的重要性,以后编代码的
时候遇到复杂问题,通过这种标定会让问题简单化

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值