距离上次更新本文已经过去了 331 天,文章部分内容可能已经过时,请注意甄别

这是一初学 c 语言的新人的第一篇博客,尝试使用 Markdown 的方式写入

这是一初学 c 语言的新人的第一篇博客
尝试使用 Markdown 的方式写入
(本来用的 51cto,发现人好少,于是跑过来了)

什么是 Markdown

Markdown 是现在普遍使用的一种文档书写语言格式,只需用一些非常简单易记的符号,如#*/>[]0\,就可以轻松写出一篇具有良好的排版和可读性的文
.
接下来进入我们的正题

猜数字游戏

这是一非常经典的代码应用
基本逻辑如下:

1.计算机生成一个随机数
2.玩家输入一个猜想的数字
3.计算机提示 “猜大了” 或者 “猜小了”
并在玩家猜测正确时提示 “恭喜你,猜对了”

先来看看游戏最终是什么样子的吧

image.png

玩家运行,可以看到一个菜单以及选择

image.png

键入 1 即为开始游戏

image.png

系统在玩家猜小或者猜大之后都会有对应的提示,猜对之后程序也会再次运行,玩家可以选择退出或者再来一次

那么这个猜数字游戏是怎么实现的呢?

首先我们制作一个简易的 menu

c
1
2
3
4
5
6
void menu()
{
printf("*****************************\n");
printf("**** 1.play 0.exit ****\n");
printf("*****************************\n");
}

光是这个 menu 还不够,我们需要写一个代码串来实现在 1.play 和 0.exit 之间选择的功能

switch case 语句

为了实现这个功能,我使用的是 switch 语句

css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();//猜数字游戏
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}

是不是觉得少了点什么?别急!

  • 玩家肯定想多次游玩这个猜数字游戏,总不能是一个一次性游戏吧
  • 所以我们需要给这个 switch 加上循环语句
  • 这里我用的是 do whlie 循环
css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
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;
}

因为我们这里用到了 scanf 库函数,所以我们需要引用头文件#include <stdio.h>

注意这里我们的 game() 函数是接下来要编写的猜数字游戏的主要函数

我们可以先屏蔽掉 game() 来测试目前代码是否正确

2.png

如果你能复现和我一样的运行框,说明目前编译的选择程序是没问题的

接下来便是重头戏

如何编写我们的 game() 程序?

这里我们要先引入一个 rand 函数:rand 是一个生成随机数字的函数 点击查看 rand 函数定义

image.png

从定义我们可以得知,rand 能生成的是 0 到 RAND_MAX 的整数

image.png

通过查询百度百科我们可以知道 RAND_MAX 最小为 7FFF

使用 WIN10 自带的计算器中的程序员计算器,可以得知 7FFF (16 进制) 即为 32767 (十进制)
接下来我们可以编译一个简单的程序查看 rand 会生成什么数字

c
1
2
3
4
5
6
7
void game()
{
int ret = 0;
int guess = 0;
ret = rand()%100+1; //生成1-100的随机数
printf("%d\n", ret);
}

image.png
程序很好的生成了 1-100 的数字,但是真的有这么简单吗?
如果你再次运行程序,就会发现两次运行每次生成的结果都一模一样
玩家即便是重新进行游戏,猜的还是上一次猜的数字,那怎么行?
这里我们就要引入和 rand 相关的另外一个小知识点

生成随机数起始点

如果你在上面提到的 rand 定义的网站继续往下滑,便能看到 srand

image.png

这就是我们接下来要用到的函数

css
1
2
3
4
5
6
7
8
void game()
{
int ret = 0;
int guess = 0;
ret = rand()%100+1;//生成1-100的随机数
srand(1);
printf("%d\n", ret);
}

我们先添加 srand(1) 查看效果

image.png

这时每次生成的随机数字变成统一的 42

如果我们改成 srand(2) 的话

image.png
会发现除了第一个数字是 42 之外,其他的数字都是 46
这是因为 rand 函数需要另外一个随机数作为它生成随机数的起点
如果我们想要 rand 每次都能生成不一样的随机数的话
就必须用 srand (这里需要一个随机数)
这不是套娃吗?我们需要随机数来生成一个随机数,程序不会死循环?
那什么样的数字是会一直变化的呢?

时间函数

这里又要引入另外一个 time 函数

c
1
srand((unsigned)time(NULL));

image.png

同时我们需要了解时间戳的定义

plaintext
1
当前计算机的时间 - 计算机的起始时间(1970.01.01 00:00:00) = (xxxx) 秒 

这个数字便是我们最易得的随时在变化的数字。我们同样可以在刚才查询 rand 定义的网站找到 time 的定义 点我查看

image.png

我们把刚才是 srand(2) 改成如下格式,再次调试代码

  • time 函数需要引用头文件#include<time.h>

image.png

这一次我们终于生成了完全随机的 1-100 的数字

image.png

但是有另外一个问题,这个 game 函数是处在 main 函数循环语句中的

image.png

也就是每次游戏的时候,game 函数都会重新生成一个新的随机数

玩家猜测的并不是一个固定的数字,那也永远猜不到答案

所以我们应该把 srand 添加到 main 主函数中,这样每一次游戏只会生成一个固定的随机数,这才是我们最终想要的效果!

image.png

接下来我们需要编写 if、else if 语句来实现游戏的猜测以及提示

css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while (1)
{
printf("猜数字:>");
scanf("%d", &guess);
if (guess>ret)
{
printf("猜大了\n");
}
else if (guess<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对啦\n");
break;
}
}

同时我们要屏蔽掉刚才放入 game 函数中的 srand 以及会告诉玩家答案的 printf

image.png

这样我们的猜数字游戏就大功告成了!

来试玩一下吧!

image.png

可以看到游戏正是我们需要的样子!玩家也可以重复游戏

这篇小博客到这里也就结束了

第一次尝试的时候,手贱不小心按了 F5,写了一半的博客直接无了

不管怎样,感谢你看到最后

还请 dalao 们对我的博客进行指正

如果能点个赞什么的就最好了