C 语言猜数字游戏

游戏要求:生成一个随机数,范围在1~100之间,根据猜到的数字大小给出反馈,直到猜中为止。

1.rand函数

        rand()这个函数可以生成一个随机数,但要注意,rand()函数生成的是伪随机数。这个随机数的范围是在0~RAND_MAX之间,RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767。

rand()函数的函数原型:

int rand(void);

使用:rand()函数不需要参数。

        实际上多运行几次程序就会发现,说是rand()函数会生成随机数,但是程序每次输出的值都是一样的。因为rand()函数是对一个叫“种子”的基准值进行运算生成的随机数。在不设置种子的情况下,种子默认为1,如果要生成不同的随机数,就要让种子是变化的。此时就需要用到另一个函数:srand()来设置种子。

补充:随机数可分为真随机和伪随机。

        真随机:本质上是不可预测的,没有规律

        伪随机:通过确定性算法生成的序列,看似随机但实际可复现。

2.srand函数

        srand()函数用来初始化随机数的生成器的。

基本原型:

void srand (unsigned int seed);// seed就是种子

        程序中在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,rand()函数生成的数字就在变化。rand()函数生成的伪随机数序列是由srand()设置的种子决定的。

使用:

        因此只要保证srand()里边的种子随机,就能做到rand()函数生成随机数,但是用随机数生成随机数套娃有点离谱,所以只要保证srand()函数里边的种子只要时刻在变化就好,这点利用time函数就可以做到。

3.time函数

        使用srand()函数时可以用时间来当做种子,因为时间是时刻都在变化的。

time函数基本原型:

time_t time(time_t *timer);

        time函数可以返回一个时间戳。时间戳指的是:19701月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。其中time_t*是一个指针类型,time_t是函数返回值类型,是时间类型,但是本质是无符号整型类型。如果传入NULL,函数仍会返回当前时间,但不会通过指针存储结果。如果传入非NULL的指针,时间值会同时存入该指针指向的变量。

举例:

4.随机数的范围

        若想指定随机数的范围可以使用%。

举例:生成0~99范围内的随机数

rand()%100// 一个数取余100的所有结果是0~99

想要生成1~100的数就可以让生成的随机数+1,范围就从0~99变为1~100.

rand()%100+1;

由上可得一个公式:rand() %(b-a+1)

生成a~b之间的随机数

	1.  rand() %(b+1);
	//先取余b+1得到b之前的余数,此时范围是0~b.

	2.  rand() %(b+1) + a;
	//但是最小值要从a开始,因此可以左右两边的数字同时加a,得到的范围就是a~b+a.

	3. rand() %(b-a+1) + a;
	// 想要解决这个问题,就要把右边的范围减去一个a,此时范围正好

	简洁版:想要生成a~b的范围,就需要生成的余数范围控制在[0~b-a],所以需要rand() %(b-a+1),此时再加a的范围就控制在了[a~b]

结果展示:

        加入次数限制:

完整代码:

#define  _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>   // 使用rand()和srand()函数 需要包含的头文件
#include <time.h>  // 使用time函数需要包含的头文件
void menu() // 菜单
{
	printf("请选择是否开始游戏\n");
	printf("---- 1.play ----\n");
	printf("---- 0.exit ----\n");
	printf("请选择:");
	
}
void game() // 游戏实现
{
	int ret = rand()%100+1; // 控制生成数范围
	int guess = 0;  // 你要猜的数字
	int count = 6;  // 次数限制
	printf("游戏开始!生成数字范围在(1~100)\n");
	while (count)
	{
		printf("输入你的数字:");
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("数字大了\n");
		}
		else if (guess < ret)
		{
			printf("数字小了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
		count--;   // 每猜一次数字-1
		printf("还有%d次机会\n", count);
	}
	printf("差一点点\n"); //写在循环外,循环自然结束表示次数归零,输出差一点
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL)); // 设置种子,写在主函数中只需要调用一次
/*若是放在自定义函数game()中,则每次游戏开始都会初始化一次srand.用户短时间内连续开始新的游戏,时间戳的值可能会保持不变,导致每次随机数结果相同*/
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("请重新输入正确数字\n");
		}
	} while(input);
	return 0;

}

                                                                完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值