本节目总导演:rampant boy
本节目总编剧:rampant boy
本节目总策划:rampant boy
本集将详细讲解如何用C语言写一个猜数字游戏。下面进入正文:
文章目录
剧本
猜数字游戏:
-
自动产生一个1—100之间的随机数
-
猜数字
- 猜对了,就恭喜你,游戏结束
- 猜错了,就会告诉猜大了还是猜小了,然后继续猜,直到猜对
-
游戏可以一直玩,除非退出游戏
片前预告
打印菜单
既然我们要保证游戏至少玩一次,那么我们选择使用do…while()循环,同时创建一个菜单,让用户选择是玩游戏还是退出。代码如下:
void menu()
{
printf("********************************\n");
printf("*********** 1. play ************\n");
printf("*********** 0. exit ************\n");
printf("********************************\n");
}
int main()
{
do
{
menu();//打印菜单
} while ();
return 0;
}
既然用户需要选择玩游戏或者退出,则需要一个变量,来储存用户的选择。同时,用户的选择不同,所实现的功能不同,所以我们选择使用switch()语句。具体代码如下:
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("玩游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
当然,当用户输入1开始玩游戏的时候,一个printf(“玩游戏\n”)是无法实现游戏的。于是我们创建一个game()函数来实现游戏。
自定义game函数
case 1:
game();
break;
rand函数
既然要实现游戏,那么就得实现生成随机数,并且猜数字。生成随机数,就得使用rand()函数。这个函数的头文件是<stdlib.h>。具体实现如下:
void game()
{
//猜数字游戏的实现
//1.生成随机数
//rand函数返回0—32767之间的数
int ret = rand();
printf("%d\n", ret);
}
但是我们多次执行这段代码就会发现:
每次我们执行这段代码的时候,所生成的数字是一样的。为什么会出现这种情况呢?
通过红色方框的这段解释我们就知道,在使用rand函数之前,得调用srand函数。
srand函数
下面是srand函数的用法:
于是我们就得调用这个函数,代码如下:
void game()
{
//猜数字游戏的实现
//1.生成随机数
//rand函数返回0—32767之间的数
srand();
int ret = rand();
printf("%d\n", ret);
如果我们在srand函数中参数设为100,那么则显示:
如果参数是200,则显示:
那么从上面来看,srand函数的参数得是一个随机值。那么这里就得引入一个新的概念:时间戳。
时间戳
既然得使用时间戳,就得调用time函数,下面是time函数的使用方法:
time函数
其中time函数的返回类型是time_t,而time_t本质上是int类型。因为srand函数的参数类型是unsigned int,所以这里得使用强制类型转换。具体代码如下:
void game()
{
//猜数字游戏的实现
//1.生成随机数
//rand函数返回0—32767之间的数
srand((unsigned int)time(NULL));
int ret = rand();
printf("%d\n", ret);
}
这段代码的执行结果如下:
我们可以发现,生成的数直接间隔很近,如果我们输入快的话,那么就会出现:
还是会出现生成的数相同的情况。
出现这种情况的原因是:srand函数是在game函数内部,也就说我们玩一次游戏就得设置一次。由于时间戳是根据此时的时间减去1970.1.1的0:00,这种情况就会导致生成的随机数间隔差不多,甚至出现相同的情况。
要想避免这个问题,我们只需设置一次随机数的生成起点即可。也就说只需调用一次srand函数即可。所以我们将srand函数放在main函数内部。
此时我们再执行整段代码,结果如下:
此时生成的数就比较随机了。
我们再回到猜数字游戏上来。
生成1—100之间的随机数
具体实现代码如下:
int ret = rand()%100+1;//%100的余数为0—99,那么再+1,范围就是1—100
我们再执行这段代码,结果为:
那么第一步生成1—100的随机数即完成。
猜数字
第二步就是猜数字。
既然要猜数字,那么数字就不能先打印出来,所以我们注释掉printf("%d\n", ret),即:
猜数字的代码如下:
int guess = 0;
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
game函数的完整定义
void game()
{
//猜数字游戏的实现
//1.生成随机数
//rand函数返回0—32767之间的数
int ret = rand()%100+1;//%100的余数为0—99,那么再+1,范围就是1—100
//printf("%d\n", ret);
//2.猜数字
int guess = 0;
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
正片开始
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#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()
{
//猜数字游戏的实现
//1.生成随机数
//rand函数返回0—32767之间的数
int ret = rand()%100+1;//%100的余数为0—99,那么再+1,范围就是1—100
//printf("%d\n", ret);
//2.猜数字
int guess = 0;
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
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;
}
这个就是猜数字游戏的完整代码。我们来玩一次,看看效果:
注:可能有小伙伴会对第一行和第二行代码有疑惑。
有疑惑的小伙伴可以参考这篇博客。
本集完!!!