C语言实现猜数字游戏

猜数字游戏要求:

1.创建一个menu函数,实现菜单选项,选择0表示退出游戏,选择1表示开始游戏(即可以连续多次游玩猜数字游戏)

2.系统随机产生一个1-100的数字,要求每次产生的随机数不一样

3.只允许猜5次及5次以下,超过5次则为失败

注意点:

1.怎么生成随机数?

C语言提供了一个函数 rand,用于产生随机数

函数原型:

int rand ( void );

使用该函数需要使用库函数:<stdlib.h>

该函数会生成一个伪随机数,范围是在0~RAND_MAX之间,RAND_MAX的⼤⼩是 依赖编译器上实现的,但是⼤部分编译器上是32767。

出现问题:

因为rand函数生成的是伪随机数,默认的种子是1,直接使用每次生成的随机数其实是确定的,我们需要做以下事情来实现真正的生成随机数:

1.改变种子的值,使得每次游玩的种子值不一样,这样每次生成的随机数也不一样

2.每次改变的种子值和之前不相同,若相同,那和默认种子为1没区别,只是把1变成了2or3or其他数字。

 解决方法:

C语言中的srand函数,用于改变种子值

函数原型:

void srand ( unsigned int seed);

如何使得每次种子值都不一样?

现实生活中时间在不断变化,我们可以根据时间的变化来生成种子值,从而改变rand函数生成的随机值。

C语言中的time函数,可以获取时间

函数原型:

time_t time ( time_t * timer);
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。
返回的类型是time_t类型,time_t 类型本质上其实就是32位或者64位的整型类型。
如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做: 时间戳
使用该函数需要使用头文件:<time.h>

因此使得rand函数实现真正的随机值的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
	//srand要求函数类型为unsigned int类型,但是time函数的返回类型为time_t类型,因此需要强制转换
	srand((unsigned int)time(NULL));   
	printf("%d\n",rand());
	return 0;
}

2.怎么使得生成的随机数在1-100之间?

在刚刚的代码中,每次生成的随机数位数都不一样,因为我们需要进行运算将随机数控制在1-100之间。

int r = 0;

// %100后的数字在0-99之间,再加1即可实现数字范围在1-100之间 

r = rand() % 100 + 1;

由上面可以得出一个结论:

生成a~b的随机数,所写代码如下:

a + rand()% (b-a+1)

代码实现:

#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-100 
	int randNumber = 0;
	int guess = 0;
	randNumber = rand()%100+1;
	//猜数字 
	int count = 5;
	while(count)
	{
		printf("你还有%d次机会\n",count);
		printf("请输入你猜的数字:");
		scanf("%d",&guess);
		if(guess>randNumber)
		{
			printf("猜大了\n");
		}
		else if(guess<randNumber)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你猜对了!\n");
			break;
		} 
		count--;
	}
	if(0 == count)
		{
			printf("机会用尽,你失败了!\n");
		}
}
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;
}