【C语言】猜数字游戏的实现

简单不先于复杂,而是在复杂之后。

89efcc89ac61428db4d5b6639b2bd948.jpeg

目录

1.思路(代码会附在最后面)

2.随机数函数rand


1.思路(代码会附在最后面)

首先实现一个猜数字游戏我们先要有一个思路:
1.产生一个随机数

2.猜数字

3.可能猜大了

4.可能猜小了

5.直到猜对了结束

2.随机数函数rand

想要生成一个随机数,就要用到 rand 函数。

d01ffbe5f7d34581ad175e244af627f8.png

 rand 会返回一个 0 到 RAND_MAX 的整型

我们需要知道RAND_MAX是个什么样的值

把RAND_MAX转到定义如下图

a5e33764d5a94bc78b2fa8a10262e81e.png

 0X开头的是十六进制的数字

把鼠标移到十六进制数上方换算出的结果是32767

所以我们生成随机数的范围是0~32767之间的一个值

 a88e06b4b0664193a77dc3e6ca344d04.png

以上是测试出生成的值

bd5ebdcceccb4ead943f74a8e5b015ec.png

当关闭程序再次运行,我们会发现生成的随机数和上一次一模一样。

这显然不是我们想要生成的随机数,因为它并不随机。

085ecd4ff16e4141b7fdf9128627d8d8.png

 在调用 rand 函数之前需要使用 srand 函数来设置我们的随机数生成器。

e09197156062428f91c2dd8dd6034bcd.png

srand 函数的是作用是设置一个随机数起点。


a98570d58f134133b00b3444a0c81301.png

 且需要一个无符号整形的一个数值。

fe29e15188434d90b70bfd7fcc5d38dd.png

 可是当我们用 srand 设置起点时,参数为100,生成的随机数的值全部都是 365。

这时我们发现,当 srand 中的参数变了,再次运行,生成的随机数也就改变了。

如果 srand 的参数是一个随机数,生成的数也就是随机的了。

我们为了生成一个随机数,需要一个随机数,很明显是不太现实的。

我们转换思路,参数只需要是时刻变化的数就可以,那么什么东西在时刻变化呢?

时间。

想要获取一个时间,就要引入时间戳的概念:

909ae5e2eb8e43b29fb9457078b34bdc.png

时间戳就是这个时间相对于计算机起始时间之间的一个差值。单位是秒。

时间在变,时间戳就在变。

使用 time 函数来获取时间戳。

time参数可以传一个空指针,time 的返回类型是 time_t, 但是 srand 参数需要一个无符号整型,所以就要强制类型转换。

2530b9542dfc49879944d21a4122c3aa.png

 转到定义看一下,空指针本质上就是0,表示我们不需要这个参数。

time 库函数需要的头文件是 #include<time.h>

srand 库函数需要的头文件是 #include<stdlib.h>

不是每一次生成随机数都要设置一个起点,所以 srand 函数就不必放在 game 函数中,在主函数中设置一次就可以了。

如果每次生成都设置,就会发现,如果开两次生成随机数时间过短,有可能生成的随机数相同。可以自己试一下。

59f4d668432e4b4faf362390f0de7dbb.png

 现在我们已经可以生成足够随机的数了,但是我们想让这个数的生成范围是1~100

因为 rand 函数的生成范围是0~32767,所以这样处理:

rand()%100+1

范围就在1~100之间了。

下附代码:

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//电脑产生一个随机数(1 ~ 100)
//猜数字
//猜大了
//猜小了
//直到猜对了结束

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

//生成的随机数范围  0 ~ RAND_MAX(32767)
void game()

{
	int guess = 0;
	//time 函数返回 time_t(时间戳),用于获取系统时间。需要一个指针参数,如果不需要使用参数,传一个空指针。
	//time_t 为一个数据类型 - 整型

	//RAND_MAX;
	//在调用 rand 函数之前要使用 srand 来设置随机数生成器
	//srand : 设置一个随机的起点
	//1.生成随机数]
	//0~99 ----> 1~100
	int ret = rand() % 100 + 1;//生成随机数的函数,返回一个随机的整数
	//2.猜数字
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}

	}


}


//指针
//int *p = NULL; - 初始化空指针,本质是0
int main()
{
	srand((unsigned int)time(NULL));
	//不是每次生成随机数时都要设置一个起点,设置一次就就可以
	int input = 0;
	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;
}

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2024_极限年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值