实现猜数字游戏——详细版

        前言:大家好! 在学习完分支结构和循环结构后。我们可以来实现一些有趣的小游戏,而今天,我们就来实现猜数字游戏,那么就让我justin 来讲解下吧

实现猜数字游戏——详细版_第1张图片

猜数字要求如下:

1.电脑能自动生成1-100的随机数字(数字要求可以自己设定)

2.玩家在猜数字的游戏中,如果选择大了会提示 “猜大了”  , 选择小了会提示 “ 猜小了 ” ,直到猜对正确的数字,游戏结束  

3.可以设定猜数字的次数,提高游戏难度

在正式介绍猜数字游戏之前,需要介绍3个函数 rand函数 , srand函数, time函数 

一 .rand 函数

1.rand函数 需要包含头文件,如下:

#include 

2.想要电脑自动生成随机数,就需要 使用一个函数为rand , 这个函数可以自动生成随机数,函数的使用,如下:

int rand (void);

但是!但是!但是!rand函数返回的随机数其实是伪随机数,这个伪随机数的范围是 0 ~  RAND_MAX之间, 是依赖于编译器实现的,大多数的编译器上是32767

3.我们可以来验证一下 rand 函数,让它给我们生成几个随机数 

#include 
#include 
int main()
{
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());

	return 0;
}

在这里我运行了2次,结果如下 , 我们发现 2次的运行结果是一模一样的 ,那可想而知 ,虽然rand 函数生成了 几个随机数, 但是我们每一次运行的结果都一样,而这就是伪随机数,而不是真正的随机数。这不是我们想要的结果                                                                         实现猜数字游戏——详细版_第2张图片

实现猜数字游戏——详细版_第3张图片

二.srand 函数

那如何才能实现真正的随机数呢,C语言提供了一个函数为 srand  , 用来初始化随机数的生成器,使用如下:

void srand(unsigned int seed);

程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了

三.time 函数

在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的,而time 函数,可以获得时间,time函数以及头文件,使用如下:

#include
 time_t time(time_t * timer);

time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。 time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去。如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)

如果只想让time 返回时间戳,可以这样

time(NULL); //调用time函数的返回时间戳,这里没有返回值

也就是说time函数的时间是不断变化的,我们运用time函数,这样我们的随机值也是不断在变的,而这就是真正的随机值。

四.三个函数的结合使用

#include 
#include 
#include
int main()
{
	// 使用time 函数的返回值设置种子 
	// 因为srand 的参数为 unsigned int 类型 ,
	// 我们将time函数的返回值强制转换
	srand((unsigned int)time(NULL)); //调用time函数的返回时间戳,这里没有返回值
	
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	
	return 0;
}

运行结果

实现猜数字游戏——详细版_第4张图片

实现猜数字游戏——详细版_第5张图片

和之前的运行结果不同,随着时间的变化,随机数也变化 ,所产生的数字。这才是真正的随机数。

五.实现猜数字游戏

// 猜数字游戏 
#include
#include
#include
void menu() // 菜单的打印
{
	printf("***************\n"); 
	printf("*** 1.play  ***\n"); 
	printf("*** 0.exit  ***\n"); 
	printf("***************\n"); 

}

void game() // 游戏的实现
{
	int r = rand() % 100 + 1; // 因为要随机1-100的值,所以 %100的余数范围为0-99 , +1 范围才是 1-100 
	int guess = 0;  
	int count = 5; // 计时游戏次数为5次
	while (count)
	{	
		printf("你剩余次数:%d\n", count);  
		printf("请输入数字\n");
		scanf_s("%d", &guess); 

		if (guess > r) // 如果猜的数字 大于 随机数 ,则反馈猜大了
		{
			printf("猜大了\n"); 
		}
		else if (guess < r) // 如果猜的数字 小于 随机数,则反馈猜小了
		{
			printf("猜小了\n"); 
		}
		else // 最后猜对正确的随机数 ,反馈猜对了
		{
			printf("恭喜你猜对了,数字为:%d\n", r); 
		}
		count--;  // 总共有5次机会,因为我们设置了5次,每猜一次 减一次,直到5次机会用完
	}
	if (count == 0) // 机会用完了提示,并且告诉随机数是多少
	{
		printf("很遗憾你的次数用完了,正确的数字为:%d\n", r); 
	}
}
int main()
{
	srand((unsigned int )time(NULL)); // 随机数的生成
	int input = 0;
	do
	{
		menu();    // 实现菜单   
		printf("请选择:>"); 
		scanf_s("%d", &input); // 选择输入选项
		switch (input)  // switch 来完成选项的选择
		{
		case 1: 
				game();  // 如果选择case 1 就play 玩游戏 , game()实现游戏
				break;  
		case 0:  // 如果选择case 0 就exit 退出游戏
				printf("你选择退出\n");  
				break; 
		default: // 如果选择不是 以上两种 就提示 选择错误 请重新选择
				printf("你选择错误,请重新选择\n"); 
				break;

		}


	} while (input); 

	return 0; 
}
如果想要生成 a ~ b的值,方法:a + rand()%(b-a+1)

运行结果:

实现猜数字游戏——详细版_第6张图片

结尾

感谢大家的观看,希望可以帮助到大家

实现猜数字游戏——详细版_第7张图片

你可能感兴趣的:(游戏,c语言)