1.规则:
游戏在1-100之间随机生成数字,玩家根据游戏提示进行猜测随机生成的是什么数字,玩家共有5次机会,5次都没猜中则失败。
2.rand函数,srand函数及time函数的解读:
首先我们要明白,猜数字游戏的核心是什么,那就是猜。所以最关键的一步就是将要猜的那个数设置成随机值才行,因此为了实现运行出的数随机,就绕不开以下几个函数。
1)rand函数
(1)rand函数的原型
rand函数的原型如下:
(2)rand函数的作用
C语⾔提供了⼀个函数叫 rand,这函数是可以⽣成伪随机数的,什么叫伪随机数呢,即本次生成的随机数与下次生成的随机数相同。而调用rand函数还必须包含一个头文件#include<stdlib.h>.如图:
这是第一次生成的随机数:41
而这是第二次生成的随机数:还是41
对比两张图,可以看出,虽然第一次生成的随机数确实是随机的,但是第二次就不是了,应该说第二次生成的随机数与第一次生成的随机数相同,而之后的每一次都如此。这是为什么呢?
这是因为rand函数是对一个叫“种子”的基准数进行某种算法来生成随机数的,而rand函数生成随机数的“种子” 的默认值是1,所以每次生成随机数时“种子”都是1,这也就导致了每次生成的随机数是固定的。
所以只要改变了种子的大小,是种子一直在变化,那么随机数也就一直在变化了,因此我们不得不使用到另一个函数srand了。
2)srand函数
(3)srand函数的原型
srand函数的原型如下:
(2)srand函数的作用
srand函数的作用就是用来初始化随机数的生成器的,什么意思呢,就是说有了srand函数,我们就可以自己决定种子的大小。,通过srand函数的参数:(参数就是括号里的东西)来设置成rand函数的“种子”,但是参数是要自己设置的,这也就导致了我想在程序上打出随机数所以用了srand函数,结果括号里面还要设置随机数,根本办不到。所以前面说的只是只要种子一直在变化,而不是种子一直在随机。因此我们要将srand里面的参数设置成一个一直在变化的值即可。什么东西是一直在变化的呢,答案可能有很多,但最直观又最容易忽略的只有一个,那就是时间。
3)time函数
(1)time函数的原型
(3)time函数的作用
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类 型。time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。 如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
可以看到这个时间戳是一个值,且随着时间的变化,时间戳也是在变化的,所以只要将这个时间戳返回,将时间戳作为srand函数的参数即可。则写成代码形式就是如下这样:
srand((unsigned)time(NULL))
需要注意的是:在使用time函数时也要使用一个头文件#include<time.h>。
3.猜数字游戏代码的编辑
了解完了以上三个函数之后,我们就可以着手去编辑猜数字游戏的代码了。
1)首先是三个需要的头文件:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
2)第二步
就是创建游戏的菜单,为了方便我们将菜单单独存入一个函数中,将这个函数命名为menu。
void表示这个函数没有返回值:
void menu()
{
printf("************************\n");
printf("******* 1.play *********\n");
printf("******* 0.exit *********\n");
printf("************************\n");
}
3)第三步
创建游戏界面,为了方便我们也创建一个函数来单独存放游戏实现的代码,我们将这个代码命名为game:
这个游戏界面我们一步步解读:
(1)首先定义一个随机数ret,令ret等于rand()%100 + 1,即生成1--100之间的随机数。
int ret = rand()%100 + 1;//生成随机数,想生成a-b之间的随机数公式为"a+rand%(b-a+1)"。
(2)第二步创建两个变量a,count,a是你输入的数,count是你拥有机会的次数,因为规则是有5次机会,所以我们将count定义成5。
int a = 0;
int count = 5;
printf("你共有5次机会\n");
(3)第三步创建一个循环,来判断你输入的数字是否等于它生成的随机数
while(count)
{
printf("游戏开始,请输入你猜的数字:");
scanf("%d", &a);
if (a > ret)
printf("猜大了\n");
else if (a < ret)
printf("猜小了\n");
else
{
printf("奶奶的,被你蒙对了\n");
break;
}
count--;
printf("你还有%d次机会\n", count);
}
(4)总代码
void game()
{
int ret = rand()%100 + 1;
int count = 5;
printf("你共有5次机会\n");
while(count)
{
printf("游戏开始,请输入你猜的数字:");
scanf("%d", &a);
if (a > ret)
printf("猜大了\n");
else if (a < ret)
printf("猜小了\n");
else
{
printf("奶奶的,被你蒙对了\n");
break;
}
count--;
printf("你还有%d次机会\n", count);
}
if (count == 0)
{
printf("5次机会你都把握不住,废物,答案是%d\n", ret);
}
}
4)第四步
创建主函数界面
(1)第一步就是将时间戳作为srand函数的参数
int main()
{
srand((unsigned)time(NULL));
return 0;
}
(2)第二步定义一个变量input,用来决定玩不玩这个游戏,因为我们一运行程序就要进入游戏菜单界面,并且玩了一次还要决定玩不玩这个游戏,所以我们使用"do while"循环,并用switch语句选择不同的结果,还要将前面创建的两个函数放入进主函数界面。综上就打出如下主函数界面:
int main()
{
srand((unsigned)time(NULL));
int input = 0;
do
{
menu();
printf("请选择-> ");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("选择错误,请选择 1 或 0\n");
break;
}
} while (input);
return 0;
}
4.猜数字游戏总代码
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void menu()
{
printf("************************\n");
printf("******* 1.play *********\n");
printf("******* 0.exit *********\n");
printf("************************\n");
}
void game()
{
int ret = rand()%100 + 1;
int a = 0;
int count = 5;
printf("你共有5次机会\n");
while(count)
{
printf("游戏开始,请输入你猜的数字:");
scanf("%d", &a);
if (a > ret)
printf("猜大了\n");
else if (a < ret)
printf("猜小了\n");
else
{
printf("奶奶的,被你蒙对了\n");
break;
}
count--;
printf("你还有%d次机会\n", count);
}
if (count == 0)
{
printf("5次机会你都把握不住,废物,答案是%d\n", ret);
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择-> ");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("选择错误,请选择 1 或 0\n");
break;
}
} while (input);
return 0;
}