欢迎来到白刘的领域 Miracle_86.-CSDN博客
系列专栏 C语言知识
先赞后看,已成习惯
创作不易,多多支持!
————这里是白刘,好长一段时间没更新了,在思考人生,但是这两天看着源源不断的粉丝数上涨,重新点燃了我创作的热情,虽然可能是官方平台在鼓励新星作者,但是我会把每一位,虽然可能是机器人,但是我会用心地去写每一篇文章,坚持下去!————
目录
上次我们浅谈了一下分支与循环,了解了C语言的几种基本结构。今天我们将聊到新的几个东西,然后搭配着上次学的结构,做一个小游戏——猜数字。这个游戏大家应该都玩过,有没玩过的也没关系,我简单介绍一下游戏规则:首先,我们会在一个范围里,取一个随机数,玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束,你听懂了吗,管你听没听懂,看就完了~
一、随机数的生成
1.rand
C语言中有一个函数叫rand,这个函数就是我们用来随机数的根本。前面我们讲过printf和scanf,这俩函数需要被调用就要<stdio.h>这个头文件,rand也同理,它需要的是<stdlib.h>.
但是光光只有rand是不够的,因为它返回的是一个伪随机数,为什么这么说呢,因为它生成的随机数范围是0~RAND_MAX,这个RAND_MAX是由编译器决定的,大部分编译器上的RAND_MAX都是32767。
我们可以测试一下这个rand函数,看看它有什么效果。
但是我们多运行几次就发现问题了,我们发现结果都是一样的,这是为什么呢?刚刚我们说了,rand生成的是伪随机,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数是无法预测下一个值是多少的。rand函数是对一个叫“种子”的基准值进行运算生成的随机数。而之所以每次都一样,是因为rand函数默认种子为“1”,这个种子一直没变,所以随机出来一模一样。那该怎么办呢?于是我们想出来一个新的函数,srand。
2.srand
这个srand,是用来干什么的呢?刚刚我们说了,种子总是“1”,所以它是用来初始化种子的。
它的原型是这样的:
void srand(unsigned int seed)
我们要给它里面传一个无符号整形(确实可能现在各位不知道什么是无符号整形,这个怪我,我忘写数据类型和变量了,后续会补上的)的种子。
所以如果想实现随机数的话,我们只需要一个随机的种子即可,但,这不是自相矛盾嘛。所以聪明的人们想出来一个新的函数,time。
3.time
虽然我们现在还不知道随机数,但是我们在生活中可以找到跟随机数相似的一个东西——时间。
你若仔细想想,就会发现它们两个其实本质上都是在变化的,所以我们可以完美避开上述矛盾。
time函数原型是这样的:
time_t time(time_t timer);
time函数会返回当前日历时间,其实返回的是1970年1月1日0时0分0秒到现在的时间差值,以秒为单位。而这个time_t类型,实质上是以32或者64位的整形类型 。
time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。如果 timer 是NULL(空指针,以后我们也会谈到),就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
代码如下:
#ifndef _CRT_NO_TIME_T
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
#endif
typedef long __time32_t;
typedef __int64 __time64_t;
#include<time.h>
time(NULL);
就这么用,直接写,其他不用考虑。
所以以上的所有一结合,我们可以得到真·随机数。
我们再来运行一次:
好的,现在我们已经得到了真·随机数,但是,我要是想猜那个数字,咱得有个范围吧。
每日一句“白话文”(b言b语):“猜数字要有范围,要有个边界,要有个标准,要有个度。做人亦是如此”。
4.随机数范围
首先我们要记住,虽然数是随机的,但是我们可以用式子来控制它,比如说我想要0到100的随机数,那我想到了用取余。
rand()%100
;这个式子得出来的肯定是小于100的,也就是0到99,那要是想要0到100怎么办,%101
就好了。这里还有个公式(自己可推),若要a~b的随机数,则a+rand()%(b-a+1)
。
二、猜数字游戏
万事俱备,我们可以开始操作了。
首先我们来构思一下这个游戏的部分,设计好之后,我们再上代码。
首先确定一个范围,然后生成一个随机数,然后开始猜数字,系统给出大了还是小了,然后把范围更新一下。
1.主函数
整个主体可以是个循环,根据玩家的选择,来选择是否进入游戏或者退出游戏。
#include<stdio.h>
int main()
{
int input = 0;//玩家选择的选项
srand((unsigned)time(NULL));
do
{
scanf("%d", &input);
switch(input)
{
case 1:
//开始游戏
break;
case 2:
//退出游戏
input = 0;
break;
default:
//玩家可能瞎输入,提示他好好输入。
input = 1;
break;
}
} while (input);
return 0;
}
整体我们采用了do while,然后让玩家输入1或者2,选择是否游戏,避免他1瞎输入,还可以提示一下。大家想想我们还缺点什么——菜单,不然玩家怎么知道1是什么2是什么,所以我们写一个菜单函数放在上面。
2.menu函数
void menu()
{
printf("***************************\n");
printf("**** 1.开始游戏 ****\n");
printf("**** 2.退出游戏 ****\n");
printf("***************************\n");
}
这里很简单就不再赘述了,就是要注意换行,void类型不需要返回任何值。
然后把menu加到循环里,再进一步完善:
3.game函数
接下来就是正题了,首先确定范围,这里我们拿1到100来举例,
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;
}
}
}
如果想增加游戏难度,我们这里还可以用for循环,给玩家规定多少次机会,比如,给玩家五次机会:
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
int i = 0, left = 1, right = 100;
for ( i = 5; i > 0; i--)
{
printf("您还有%d次机会\n", i);
printf("范围%d到%d\n", left, right);
printf("请猜数字>:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
left = guess;
}
else if (guess > r)
{
printf("猜大了\n");
right = guess;
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
if (i == 0)
{
printf("抱歉,游戏失败\n");
printf("正确答案为%d\n", r);
}
}
4.代码实现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***************************\n");
printf("**** 1.开始游戏 ****\n");
printf("**** 2.退出游戏 ****\n");
printf("***************************\n");
}
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
int i = 0, left = 1, right = 100;
for ( i = 5; i > 0; i--)
{
printf("您还有%d次机会\n", i);
printf("范围%d到%d\n", left, right);
printf("请猜数字>:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
left = guess;
}
else if (guess > r)
{
printf("猜大了\n");
right = guess;
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
if (i == 0)
{
printf("抱歉,游戏失败\n");
printf("正确答案为%d\n", r);
}
}
int main()
{
int input = 0;//玩家选择的选项
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择-->");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 2:
printf("退出游戏\n");
input = 0;
break;
default:
//玩家可能瞎输入,提示他好好输入。
printf("输入错误,请重新输入");
input = 1;
break;
}
} while (input);
return 0;
}
5.拓展
虽然这个游戏很简单,但是可以玩出很多种花样,比如当回答错误,你可以让他做一个惩罚;亦或是你一直让随机数变,这哥们肯定始终猜不出来;或者你可以把范围故意搞反。总而言之,只有你想不到,没有你做不到,程序设计本身就是创新,白刘相信大家能玩出名堂,今天就先聊这么多吧,86.