大家好,我是十一,今天给大家带来"猜数字游戏"的代码和讲解。
目录
前言
基本流程
1.打印菜单
1.1主函数逻辑
2.生成随机数
随机数生成结果
2.1srand函数
2.2时间戳
2.3time函数
2.4生成1-100的随机数
3.猜数字
代码运行效果
总体代码
main函数
game函数
menu函数
在做猜数字游戏之前我们先来了解rand函数:
rand函数是专门用来生成随机数的,他对应的头文件是
rand函数返回的是0-rand_MAX(0-32767)之间的一个随机数,既然有返回值,那么我们就需要创建一个变量来接收他的返回值: int ret =rand();
1.创建菜单选择开始游戏或退出游戏
2.生成随机数
3.玩家猜数字
我们需要生成一个菜单让玩家选择开始或退出
代码如下:
void menu()
{
printf("**********************\n");
printf("**** 1.play ****\n");
printf("**** ****\n");
printf("**** 0.exit ****\n");
printf("**********************\n");
}
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//生成1-100的随机数
do
{
menu();//打印菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
system("cls");//清屏让界面变整洁
game();//游戏函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("\n选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
我们想让游戏一上来就能玩,所以我们需要写一个do...while循环,循环的判断条件是玩家输入的数字,所以我们需要创建一个input变量来存放玩家输入的数字,如果玩家输入的数字是1,游戏就正式开始,游戏结束之后循环继续,如果玩家输入的数字是0,就会提示退出游戏,并终止循环,如果输入其他数字则会提示选择错误并让玩家重新选择(循环继续)。
代码如下:
int ret = rand();
当我们退出游戏再重新打开:
不难发现,两次程序运行生成的随机数一模一样,那这个游戏就缺少了重复可玩性了,那这个游戏还有什么意义呢?所以我们需要对我们的代码进行优化,其实rand函数在调用之前还需要调用一个函数:srand(设置随机数的生成起点)
srand函数的调用需要传递一个整数,那么我们先试着传递一个0
srand(0);
int ret = rand();
可以看到,如果我们传递一个固定的值给srand函数,那么这个函数生成的值也是一个固定值,
那么我们的思路就是传递一个会变化的值给srand函数,那么什么值是一直在变化的呢?没错,就是时间!这时候就要用到时间戳:
时间戳就是从1970年1月1日(00:00:00 GMT)至当前时间的总秒数
我们就可以给srand函数传一个时间戳,这时候又要用到一个 time函数(对应的头文件是:
time函数返回的是time_t,time_t本质上其实是一个整数。time函数还需要一个time_t*的一个参数,我们不需要time函数的参数,所以我们就给他传递一个空指针(NULL):
srand((unsigned int)time(NULL));
//为了不让编译器报警告,我们要在time函数前加(unsigned int)
注意:srand函数是设置随机数的生成起点,所以srand在程序中只需要调用一次就可以,不需要多次调用,否则会出现以下问题:
多次调用后生成的随机数十分接近,调用过快甚至会导致生成的随机数一致!
所以我们要把srand函数放在main函数里而非game函数!
我们要缩小随机数的生成范围为1-100,这样游戏会变得相对简单。
想要生成1-100的随机数我们就得对rand函数做一些改动:
int ret = rand() % 100 + 1;
任何数%100之后他的余数的取值范围必定是0-99之间,我们再对这个范围进行+1,就会产生1-100的随机数。
有了随机数我们就可以进行猜数字了,我们需要设置一个循环让玩家能一直猜数字,直到猜对为止
代码如下:
void game()
{
int n = 0;
int ret = rand() % 100 + 1;
while (1)
{
printf("请猜数字(1-100)->");
scanf("%d", &n);
if (n < ret)
{
printf("猜小了\n");
}
else if (n > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你猜对了,3秒后返回菜单\n");
Sleep(3000);
system("cls");
break;
}
}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
system("cls");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("\n选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
void game()
{
int n = 0;
int ret = rand() % 100 + 1;
while (1)
{
printf("请猜数字(1-100)->");
scanf("%d", &n);
if (n < ret)
{
printf("猜小了\n");
}
else if (n > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你猜对了,3秒后返回菜单\n");
Sleep(3000);
system("cls");
break;
}
}
}
void menu()
{
printf("**********************\n");
printf("**** 1.play ****\n");
printf("**** ****\n");
printf("**** 0.exit ****\n");
printf("**********************\n");
}
以上就是本文全部内容,如有不足之处,还请各位多多包涵与指出。
每一个成功者都有一个开始。勇于开始,才能找到成功的路。