C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

本节目总导演:rampant boy

本节目总编剧:rampant boy

本节目总策划:rampant boy

本集将详细讲解如何用C语言写一个猜数字游戏。下面进入正文:

文章目录

剧本

猜数字游戏:

  1. 自动产生一个1—100之间的随机数

  2. 猜数字

    • 猜对了,就恭喜你,游戏结束
    • 猜错了,就会告诉猜大了还是猜小了,然后继续猜,直到猜对
  3. 游戏可以一直玩,除非退出游戏

片前预告

打印菜单

既然我们要保证游戏至少玩一次,那么我们选择使用do…while()循环,同时创建一个菜单,让用户选择是玩游戏还是退出。代码如下:

void menu()
{
	printf("********************************\n");
	printf("*********** 1. play ************\n");
	printf("*********** 0. exit ************\n");
	printf("********************************\n");
}

int main()
{
	do
	{
		menu();//打印菜单
	} while ();
	return 0;
}

既然用户需要选择玩游戏或者退出,则需要一个变量,来储存用户的选择。同时,用户的选择不同,所实现的功能不同,所以我们选择使用switch()语句。具体代码如下:

int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("玩游戏\n");
            break;
		case 0:
			printf("退出游戏\n");
            break;
		default:
			printf("选择错误,请重新选择\n");
            break;
		}
	} while (input);

当然,当用户输入1开始玩游戏的时候,一个printf(“玩游戏\n”)是无法实现游戏的。于是我们创建一个game()函数来实现游戏。

自定义game函数

case 1:
	game();
	break;

rand函数

既然要实现游戏,那么就得实现生成随机数,并且猜数字。生成随机数,就得使用rand()函数。这个函数的头文件是<stdlib.h>。具体实现如下:

void game()
{
	//猜数字游戏的实现
	//1.生成随机数
	//rand函数返回0—32767之间的数
	int ret = rand();
	printf("%d\n", ret);
}

但是我们多次执行这段代码就会发现:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

每次我们执行这段代码的时候,所生成的数字是一样的。为什么会出现这种情况呢?

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

通过红色方框的这段解释我们就知道,在使用rand函数之前,得调用srand函数。

srand函数

下面是srand函数的用法:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

于是我们就得调用这个函数,代码如下:

void game()
{
	//猜数字游戏的实现
	//1.生成随机数
	//rand函数返回0—32767之间的数
	srand();
	int ret = rand();
	printf("%d\n", ret);

如果我们在srand函数中参数设为100,那么则显示:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

如果参数是200,则显示:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

那么从上面来看,srand函数的参数得是一个随机值。那么这里就得引入一个新的概念:时间戳。

时间戳

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

既然得使用时间戳,就得调用time函数,下面是time函数的使用方法:

time函数

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

其中time函数的返回类型是time_t,而time_t本质上是int类型。因为srand函数的参数类型是unsigned int,所以这里得使用强制类型转换。具体代码如下:

void game()
{
	//猜数字游戏的实现
	//1.生成随机数
	//rand函数返回0—32767之间的数
	srand((unsigned int)time(NULL));
	int ret = rand();
	printf("%d\n", ret);
}

这段代码的执行结果如下:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

我们可以发现,生成的数直接间隔很近,如果我们输入快的话,那么就会出现:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

还是会出现生成的数相同的情况。

出现这种情况的原因是:srand函数是在game函数内部,也就说我们玩一次游戏就得设置一次。由于时间戳是根据此时的时间减去1970.1.1的0:00,这种情况就会导致生成的随机数间隔差不多,甚至出现相同的情况。

要想避免这个问题,我们只需设置一次随机数的生成起点即可。也就说只需调用一次srand函数即可。所以我们将srand函数放在main函数内部。

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

此时我们再执行整段代码,结果如下:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

此时生成的数就比较随机了。

我们再回到猜数字游戏上来。

生成1—100之间的随机数

具体实现代码如下:

int ret = rand()%100+1;//%100的余数为0—99,那么再+1,范围就是1—100

我们再执行这段代码,结果为:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

那么第一步生成1—100的随机数即完成。

猜数字

第二步就是猜数字。

既然要猜数字,那么数字就不能先打印出来,所以我们注释掉printf("%d\n", ret),即:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

猜数字的代码如下:

int guess = 0;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}

game函数的完整定义

void game()
{
	//猜数字游戏的实现
	//1.生成随机数
	//rand函数返回0—32767之间的数
	int ret = rand()%100+1;//%100的余数为0—99,那么再+1,范围就是1—100
	//printf("%d\n", ret);
	//2.猜数字
	int guess = 0;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}

正片开始

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
	printf("********************************\n");
	printf("*********** 1. play ************\n");
	printf("*********** 0. exit ************\n");
	printf("********************************\n");
}

void game()
{
	//猜数字游戏的实现
	//1.生成随机数
	//rand函数返回0—32767之间的数
	int ret = rand()%100+1;//%100的余数为0—99,那么再+1,范围就是1—100
	//printf("%d\n", ret);
	//2.猜数字
	int guess = 0;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

这个就是猜数字游戏的完整代码。我们来玩一次,看看效果:

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

注:可能有小伙伴会对第一行和第二行代码有疑惑。

C语言大型连续剧(番外篇)——猜数字!怎一个妙字了得!!!

有疑惑的小伙伴可以参考这篇博客

本集完!!!

上一篇:C语言32人随机抽取10人


下一篇:srand()和rand(),生成随机数,留给我自己看