目录

C语言实现猜数字游戏

目录

C语言实现猜数字游戏

描述:电脑随机生成一个1~100之间的数字,要求玩家去猜数字。

  • 玩家猜小了,电脑会告诉,猜小了;
  • 玩家猜大了,电脑会告诉,猜大了;
  • 玩家猜中了,电脑会告诉,恭喜你,猜对了

下面先给出代码

#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()
{
int random_num = rand() % 100 + 1;
int n = 0;
while (1)
{
printf("请输入数字:");
scanf("%d", &n);
if (n > random_num)
{
printf("猜大了\n");
}
else if (n < random_num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}

int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}

大家可能有许多不理解的地方下面,我来解释一下。

你可能不理解为什么多了两个头文件:

#include<stdlib.h>
#include<time.h>

添加 stdlib.h 头文件,是因为使用了库函数 rand() 和 srand() ,而添加 time.h 头文件,是因为使用库函数 time(), 而添加 stdio.h 头文件,不用我说大家都知道,是因为使用了库函数 printf() 和 scanf()

说到这里,大家可能都要问了为啥要使用库函数 rand() ,srand() 和 time()?

别急,  请朝后看:

首先,这个游戏的操作重点在于电脑处理生成随机数这块内容,那么 C 语言中生成随机数的方法是什么呢?这里就要提到库函数 rand() 了。

https://i-blog.csdnimg.cn/blog_migrate/85b47e103314c21af27fbf1c70346aa0.png

没错这是英文文档,其实也能找到很多中文版本的,但是大家要学习着看英文文档哦,毕竟以后进入公司,很多专业文档他喵的几乎都是英文的。

这段话的意思翻译过来大概就是: rand()生成随机数的范围是 0~RAND_MAX 之间的数字 ,而 RAND_MAX 大小是 0x7fff ,这是十六进制表示形式,转换成十进制就是 32767,所以 rand()生成随机数的范围就是 0~32767。

那么  int random_num = rand() % 100 + 1; 又是什么意思呢?

    //0~32767 之间的范围太大了,本题要的是 1~100 之间即可
    //rand() % 100 == 0 ~ 99
    //rand() % 100 + 1 == 1~100

//所以才写成下面的形式
    int random_num = rand() % 100 + 1;

而在使用 rand()函数之前,我们需要先设置随机数的生成器

那这里就要讲解一下库函数 srand() 了

https://i-blog.csdnimg.cn/blog_migrate/af7101d0842b819ea1dff505ac24c1f9.png

srand()函数里面需要传入一个不断变化的值 ,才能让 rand()函数生成随机数,如果传入的是常数的话,那么每次生成的随机数都会是同一个数,那什么值是不断变化的呢,当然是时间啦。

这就引出了下面这段代码

srand((unsigned int)time(NULL));

而这段代码括号里的一大坨是啥意思呢?

如果想要把这个讲解清楚,首先讲一下库函数 time()

那为什么要引入 time()函数呢?

这里补充一下“ 时间戳 ”的概念: 何为时间戳?

任何一个时间都能转化成一个时间戳,时间是在不断变化的,所以时间戳也是不断变化的,而获取时间戳,需要调用 time()函数

https://i-blog.csdnimg.cn/blog_migrate/8036efe2fad0fa3a4458c716e5a092f0.png

time() 函数里面参数的数据类型是指针型,所以传入一个 NULL(空指针)进去,变成 time(NULL)

这里大家先别刨根问底问为什么传进去的是空指针而不是别的,因为这里涉及的知识比较多,在这里大家只要知道 time()函数里面的参数类型是指针型,此题传入的是空指针就行啦。

因为 time()函数的返回值类型是 time_t 类型,但是 srand()函数参数类型是 unsigned int 型,所以要进行强制类型转换

还有,为什么 srand()函数不直接写在 rand()函数的前面,而是放在主函数中?

那是因为啊,设置随机数的生成器,整个程序只要设置一次就可以了,如果放在 game()中,那么调用一次函数就会设置一个随机数的生成器,所以才放在主函数中。

好咯,这个小游戏就这么多内容了,确实很简单,后面笔者还会更新一些小游戏哦,觉得有所收获的铁汁们可以动动小手,给笔者来个三连。