欢迎来到 Claffic 的博客
前言:
猜数字是一项简单的小游戏,跟着C看看如何从无到有,有逻辑地把这项小游戏用C语言写出来吧。
初学C语言的小伙伴放心食用~~~
目录
❤️1.整体框架
2.简易菜单
3.游戏逻辑
3.1随机数字的生成
3.2猜数字
4.最终成果展示
猜数字游戏的要求:
1.生成1~100之间的随机数;
2.猜数字:
1>猜小了,程序会告诉你猜小了,继续猜;
2>猜大了,程序会告诉你猜大了,继续猜;
3>才对了,程序会告诉:恭喜你猜对了!!!,游戏结束。
3.游戏可以反复玩。
进入程序,输入1开始猜数字,输入0退出游戏,此处可用switch-case执行分支;
要使游戏至少能进行一次,可以使用do while循环;
这样可以先写出整体框架:
#include
int main()
{
int input = 0;//要作为循环判断条件,所以初始化在循环体系外
do
{
//打印菜单
menu();
//选择入口
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字\n");
//游戏逻辑
geme();
break;
case 0:
//退出
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新输入");
break;
}
} while (input);//input是0时为假,是1时为真,可以作为判断标志
return 0;
}
打印一个简易菜单,创建一个菜单函数:
void menu()
{
printf("****************\n");
printf("* 1.play *\n");
printf("* 0.exit *\n");
printf("****************\n");
}
到这里游戏的基本框架就有了
运行:
在C语言中,有专门生成随机整数的函数,那就是rand函数
C/C++资源网站
rand函数返回的是0~RNAD_MAX之间的整数值
转到定义,可以看到RAND_MAX代表的十六进制数字 7fff
转换为十进制就是32767
那就明白了:
rand()随机生成0~32767之间的整数
按照思路创建game函数:
void game()
{
int ret = rand();
printf("%d\n", ret);
}
运行几次:
发现每次生成的数字都是相同的,
每次生成的数字是相同的?那可没意思,
怎么解决这个问题呢?
其实rand函数并不是这么使用的,我们忽视了一个关键点:
那就是在使用rand函数之前要调用srand函数来设置随机数的生成器
要调用srand函数,找到关于srand函数的信息
应用srand要返回一个整数值
下面随机给srand一个整数并运行程序:
诶?
如果给srand的值是固定的,那生成的数也是固定的
反过来想,如果给srand的值不是固定的,那生成的数不就不是固定的了吗?也就是实现了随机数的生成
问题又来了,有没有随时变化的值?
没错,那就是时间
于是我们引入一个概念:时间戳
恰好 C语言中,time函数会返回时间戳
time_t本质上就是整形,这里不做过多阐述
需要注意的是time函数需要的是time_t* ,也就是指针
而我们对返回的值没有确界要求,只要让time返回一个数就可以了
那我们给空指针NULL
srand(time(NULL));
此时出现了警告:
解决方法很简单,把time强制转化成unsigned int就好
于是就有了:
srand((unsigned int)time(NULL));
加入game函数:
void game()
{
srand((unsigned int)time(NULL));
int ret = rand();
printf("%d\n", ret);
}
运行几次:
问题双来了:
每次生成的数字都很接近,尤其是前后选择时间较短的时候
原因是每次选择都会调用一次srand函数,相当于每次进行游戏都会重置起点
其实srand函数只要调用一次就行了,不需要频繁调用
通过把srand函数放到main函数开头就可以解决这个问题了
最后,我们需要的是1~100的整数
只需要把rand返回的值模100并+1就ok
void game()
{
int ret = rand()%100+1;
printf("%d\n", ret);
}
常规思路
输入并判断:
printf("猜一个吧");
scanf("&d", &num);
if (num > ret)
{
printf("猜大了");
}
else if (num < ret)
{
printf("猜小了");
}
else
{
printf("恭喜你猜对了!!!");
}
猜大和猜小都需要重新猜,知道猜对为止
所以while循环给死,猜对跳出
void game()
{
int ret = rand()%100+1;
int num = 0;
//printf("%d\n", ret);
while (1)
{
printf("猜一个吧:");
scanf("%d", &num);
if (num > ret)
{
printf("猜大了\n");
}
else if (num < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜对了!!!\n");
break;
}
}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include//包含rand和srand函数
#include//包含time函数
void menu()
{
printf("****************\n");
printf("* 1.play *\n");
printf("* 0.exit *\n");
printf("****************\n");
}
void game()
{
int ret = rand()%100+1;
int num = 0;
//printf("%d\n", ret);
while (1)
{
printf("猜一个吧:");
scanf("%d", &num);
if (num > ret)
{
printf("猜大了\n");
}
else if (num < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜对了!!!\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
//打印菜单
menu();
//选择入口
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
//游戏逻辑
game();
break;
case 0:
//退出
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新输入");
break;
}
} while (input);
return 0;
}
这游戏我能玩一天!!!
如果你觉得这篇文章还不错并且对你有帮助,不妨动动手指点赞收藏加转发,给一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!