C语言-----猜数字小游戏(逐步完善)

*****猜数字小游戏原理:计算机随机产生一个数字,之后由用户来猜,再比较两个数大小即可。

**1.**先看一下初级代码,用到了rand()函数,但是直接使用这个函数的话会有一些缺陷。就比如说:调用rand()函数之后,其返回值是一个伪随机数。反复调用rand()所产生的一系列数看似是随机的,但每次执行程序时所产生的随机数字序列却是一样的,都是相同的一个数列,而程序又每次只用到了数列中的第一个随机数。
除了这个之外,rand()产生但是一个0到RAND_MAX之间的整数,猜数的话需要缩小这个范围。

#include
#include//rand()产生的符号常量RAND_MAX是在头文件stdlib.h中定义的
int main() {//计算机随机产生一个数让用户猜,猜对的话返回“Ringht!”
	//错误返回“Wrong!”,并告诉用户所猜的数是大还是小。
	int ran;//定义rand()随机产生的随机数
	int guess;//所猜数字
	ran = rand();//程序多次运行之后发现,计算机产生的那个数的确是随机的
	//但是是一个伪随机数!反复调用rand()所产生的一系列数看似是随机
	//的,但每次执行程序时所产生的随机数字序列却是一样的,都是相同的一
	//个数列,而程序又每次只用到了数列中的第一个随机数。
	printf("            -----猜数游戏开始!!!-----\n");
	printf("请你输入一个数:\n");
	scanf("%d",&guess);
	if (guess>ran) {
		printf("Wrong!大了!!!\n");
	}
	else if (guess<ran) {
		printf("Wrong!小了!!!\n");
	}
	else {
		printf("Right!恭喜你猜对了!!!");
	}
}

执行第一个程序,当你发现一个数字被猜对之后,下次执行程序,这个数字还是正确的。这就能看出rand()函数需要被改善
C语言-----猜数字小游戏(逐步完善)_第1张图片
**2.**若想解决程序1中的问题,办法就是使程序每次运行时产生不同的随机数序列,由于不同的随机数序列中的第一个随机数是不同的,这样每次运行这个程序时,计算机所产生的的随机数就会不一样了。这需要通过调用标准库函数srand()为函数rand()设置种子数来实现。但是为了避免每次都要输入种子数,所以需要把种子数随机化,可以使用函数time()读取计算机的时钟值,并把该值设置为随机种子数:srand(time(NULL));使用NULL作为time()的参数时,time(NULL)的返回值被转换成一个无符号整数,可作为随机数发生器的种子。
此外,ran = rand() % 51;//生成0到50之间的随机数。

#include
#include
#include
int main() {//rand()生成的是0到32767之间的数字,范围有些大,猜数游戏
	//需要改变这个范围
	int ran;
	int guess;
	int counter = 0;
	srand(time(NULL));//为rand()函数设置随机种子数
	ran = rand() % 51;//生成0到50之间的随机数
	do {
		printf("            -----猜数游戏开始!!!-----\n");
		printf("请你输入一个数:\n");
		scanf("%d",&guess);
		counter++;//每猜一次,counuer会+1
		if (guess>ran) {
			printf("Wrong!大了!!!\n");
		}
		else if (guess<ran) {
			printf("Wrong!小了!!!\n");
		}
		else {
			printf("Right!恭喜你猜对了!!!\n");
		}
	} while ((guess!=ran)&&(counter<10));//只要guess和ran不相等,这个循环体就会继续下去
	//这两个数相等的话会结束此循环;且最多猜10次
	printf("counter=%d\n",counter);
}

程序2中每次猜数只允许用户最多猜10次,即用户猜对了或者猜了十次仍未猜对,都结束游戏,看似是没毛病的,但是当遇到用户输入的不是数字是,是其他字符时,程序会发生错误,发生错误不要紧,我们需要的是当用户输入错误时,我们提醒用户输入错误并允许用户再次输入。
C语言-----猜数字小游戏(逐步完善)_第2张图片
**3.**来!!!咱们继续完善我们的代码,当然,scanf()这个函数是有函数值的,我在这里用ret来接收这个函数值,scanf()的返回值等于正确输入的个数。例如:如果2个数字都正确则返回2(一个正确返回1);如果一个都没有接收到就返回0;发生错误时返回-1(ctrl+z)。
while ((ch=getchar() )!= ‘\n’);//清除输入缓冲区中的非法字符,(此代码尤为重要)
程序3中,我又增加了一些东西:每次运行程序可以猜多个数字,每个数字可猜10次,若10次仍未猜对,则停止本次猜数,然后给出printf(“你还想继续猜嘛?(Y/y or N/n)\n”);这条语句,用do-while做一个外循环,Y/y的话继续游戏,N/n的话结束程序。

//完善猜数游戏,使其遇到不正确使用或非法数据输入时避免出粗能力
#include
#include
#include
int main() {//rand()生成的是0到32767之间的数字,范围有些大,猜数游戏
	//需要改变这个范围
	int ran;
	int guess;
	int counter = 0;
	int ret=0;//用于保存scanf()函数的返回值
	char answer;//保存用户输入的回答
	srand(time(NULL));//为rand()函数设置随机种子数
	ran = rand() % 51;//生成0到50之间的随机数
	do {
		counter = 0;
		ran = rand() % 51;
		do {
			printf("            -----猜数游戏开始!!!-----\n");
			printf("请你输入一个0到50的数:\n");
			ret=scanf("%d", &guess);
			while (ret != 1) {//若存在输入错误,则重新输入
				while (getchar() != '\n') {//清除输入缓冲区中的非法字符
					;
				}
				//while ((ch=getchar() )!= '\n');//清除输入缓冲区中的非法字符

					printf("你的输入有误!!!请重新输入\n");
					printf("            -----猜数游戏开始!!!-----\n");
					printf("请你输入一个0到50的数:\n");
					ret = scanf("%d", &guess);
			}
			counter++;//每猜一次,counuer会+1
			if (ret ==1 ) {
				if (guess > ran) {
					printf("Wrong!大了!!!\n");
				}
				else if (guess < ran) {
					printf("Wrong!小了!!!\n");
				}
				else {
					printf("Right!恭喜你猜对了!!!\n");
				}
			}
		} while ((guess != ran) && (counter < 10));//只要guess和ran不相等,这个循环体就会继续下去
		//这两个数相等的话会结束此循环;且最多猜10次
		printf("counter=%d\n", counter);

		printf("你还想继续猜嘛?(Y/y or N/n)\n");
		scanf(" %c", &answer);
	}while(answer=='Y'||answer=='y');
}

经过多次完善,我们走到了这一步。但是唯一一个bug我还没有解决,就是当用户输入20a时,也就是数字加上一个字符,这个时候scanf会读取20,此时也会提示用户输入错误。我们知道20a是属于非法字符输入,是不正确的输入,但由于个人能力有限,也曾问过其他老师,要解决这个问题对于c语言来说需要比较难的步骤,如果有哪位大佬知道如何再次修补这个bug,可以在评论区指导我一下。谢谢!!!
C语言-----猜数字小游戏(逐步完善)_第3张图片
推荐大家参考程序3!!!
我的分享就到这里了,希望本次分享能够帮助需要的人或者学习c语言的人群,谢谢!!!

你可能感兴趣的:(笔记,分享一下我的心得,c语言,c算法,算法)