C语言:猜数字游戏(保姆级教程)

游戏规则:
1、随机生成一个数字
2、通过反馈猜大或猜小,猜出该随机数

1.生成随机数

1.1 rand函数

   rand函数返回值是一个伪随机数,这个伪随机数的范围是0~0x7ffff,0x7fff(十六进制)转化为32767(十进制)。

rand函数在使用时需要引用 #include
为什么说rand函数返回值是一个伪随机数呢?接下来带大家看一段代码实现
在这里插入图片描述
无论这个程序运行几次,运行结果都是一样的,因此我们称rand函数返回值是一个伪随机数。伪随机数不是真正的随机数,是通过某种算法生成的随机数,真正的随机数是我们任何一个人都无法预测的数值,而rand函数时对一个叫“种子”的基准值进行运算生成的随机数。
之所以每次运行结果都是一样的,那是因为rand函数的“种子”默认值为1
要实现每次运行结果都是不同的数字,就需要让“种子”值变为一个不定值,接下来我们引入另一个函数 srand函数

1.2 srand函数

srand函数是用来初始化随机数的生成器的,我们可以通过srand函数的参数seed来设置rand函数在产生随机数时的种子,只要种子在变化,那么每次产生的随机数就都不一样了

srand函数定义一次就可以,不需要频繁使用,频繁使用反而会出问题
意思就是给srand函数传一个随时发生变化的值就可以了,那么我们只需要再找一个函数。

1.3 time 函数

在程序中,我们一般采用时间来作为函数的种子,因为时间是一直在变化的。time就可以获取这个时间,返回值为从1970年1月1日到目前的时间之间的差值,不包括闰秒,单位为秒。返回值为time_t类型的,其实返回的值就是32位或64位的整型类型。

time_t time (time_t* timer);

在这里插入图片描述
time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存
中带回去。
如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
time函数的时候需要包含头⽂件:#include<time.h>
如果只是让time函数返回时间戳,就可以写成

time(NULL);//调用time函数返回时间戳

在这里插入图片描述
在这里插入图片描述
这次我们发现生成的随机数就变得不一样了

1.4 设置随机数的范围

随机数的范围设置我们采用求余的方法,如下:
生成0~99的随机数

rand()%100;//进行求余,余数在0~99范围内

生成0~100的随机数

rand()%100+1;//%100的余数是0~99,%100+1的余数是0 ~100;

总结:
要想求a~b之间的随机数,方法如下:

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

2. 猜数字游戏代码实现

步骤一:设置菜单

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

步骤二:

int main()
{
 	int input = 0;
 	srand((unsigned int)time(NULL));
	do
 	{
 		menu();
 		printf("请选择:>");
 		scanf("%d", &input);
 		switch(input)
 		{
 				case 1://输入1时,开始游戏
 				game();
 				break;
 				case 0://输入0时,游戏结束
 				printf("游戏结束\n");
 				break;
 				default://输入不为1也不为0时,选择错误,重新进入循环选择
 				printf("选择错误,重新选择\n");
 				break;
 		 }
 	}while(input);

步骤三:代码核心实现

void game()
{
 	int r = rand()%100+1;
 	int guess= 0;
 	while(1)//让循环成为死循环
 	{
 		printf("请猜数字>:");
 		scanf("%d", &guess);
 		if(guess < r)
 		{
 			printf("猜⼩了\n");
 		}
 		else if(guess > r)
 		{
 			printf("猜⼤了\n");
 		}
 		else
 		{
 			printf("恭喜你,猜对了\n");
 			break;
 		}
 	} 
}

“拼乐高”,实现一个大工程

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
 	int r = rand()%100+1;
 	int guess= 0;
 	while(1)
 	{
 		printf("请猜数字>:");
 		scanf("%d", &guess);
 		if(guess < r)
 		{
 			printf("猜⼩了\n");
 		}
 		else if(guess > r)
 		{
 			printf("猜⼤了\n");
 		}
 		else
 		{
 			printf("恭喜你,猜对了\n");
 			break;
 		}
 	} 
}
void menu()
{
 	printf("***********************\n");
 	printf("****** 1. play ******\n");
	printf("****** 0. exit ******\n");
 	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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值