目录
1.前言
猜数字游戏游戏是一个简单有趣的游戏,相信大家在现实也会有一起玩过。通过一些简单的C语言代码,就能实现这个游戏。赶紧来看看吧!
2.编写思路
首先作为一个小游戏,点开程序的时候就应该先玩一次,完成一次游戏后可以再选择玩或者不玩。那么由此我们想到了do while 循环作为起始语句。
其次需要一个菜单来提示玩家进行继续或结束游戏的提示,我们选择用简单的函数来实现。
接着玩家会不断地进行猜数字,程序需要告诉玩家猜大了还是猜小了。
最后玩家猜中数字,根据菜单来决定是否进行下一次游戏。
3.代码实现
根据编写思路,我们可以简单构造出一个大体框架。
#include <stdio.h>
int main()
{
int input = 0;
do
{
//编写一个菜单函数
nemu();
printf("请选择:>");
scanf("%d", &input);
//根据玩家选择是否需要继续游戏
switch (input)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("游戏结束");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
接下来就是game函数的编写与nemu函数的编写,来充实我们游戏的主体内容。
3.1菜单代码
nemu函数起到一个提示玩家选择的作用,用printf即可实现,由于不需要返回值,所以nemu的类型是void。具体如下
void nemu()
{
printf("***********************************\n");
printf("*********** 1.play ************\n");
printf("*********** 0.exit ************\n");
printf("***********************************\n");
}
3.2游戏代码
进入game函数后,我们需要程序生成一个随机数。然后玩家再去猜这个随机数。
那么程序如何实现每一次都生成一个完全随机的数字呢?
3.2-1 rand函数
rand函数需要引用<stdlib.h>才可以使用,功能是随机生成一个数。那么这个数的范围是多少呢?答案是(0~32767)。我们的游戏不可能需要玩家猜那么大的数字!于是在使用rand函数后应该模上一个数,来圈定随机数的范围。
void game()
{
//随机数命名为num
int num = 0;
printf("请在0~100之间猜一个数字\n");
num = rand() % 100 + 1;
//此时num的范围在0~100
while (1)
{
//玩家猜的数字k
int k = 0;
scanf("%d", &k);
if (k < num)
printf("猜小了\n");
else if (k > num)
printf("猜大了\n");
else if(k = num)
{
printf("恭喜你,猜对了\n");
break;
}
}
}
用while即可实现之前我们所说的循环猜数字的功能,合理用break来打破循环,若不达到条件,则不会执行break语句,从而可以一直循环。while(1)这么写还是十分常见且实用的!
但是也存在一个问题,仔细调试的小伙伴们会发现,虽然程序中每次的随机数不同,但是再次打开程序,与上一次打开程序时,程序生成的随机数是相同的。
那么这个猜数字小游戏在玩过一次后,就已经失去了随机性和趣味性。那么我们该怎么解决这个问题呢?我们不妨先去了解一下rand函数!!
看得懂最好,看不懂也没关系。
总的来说rand函数使用之前,需要先调用srand函数来重置随机生成数起点。这样就能保证每一次打开程序所生成的随机数真正随机。
3.2-2 srand 函数
*由于文章是面向小白,所有srand函数不会过多介绍。*
调用srand函数需要引用头文件<stdlib.h>,功能是重置随机生成数起点。需要注意的是srand()括号内需要一个unsigned int 类型的数值。如果括号内我们设置成常量。那么每次生成随机数的起点都会相同,同样达不到完全随机的效果。
void game()
{
srand(1);
//随机数命名为num
int num = 0;
printf("请在0~100之间猜一个数字\n");
num = rand() % 100 + 1;
//此时num的范围在0~100
while (1)
{
//玩家猜的数字k
int k = 0;
scanf("%d", &k);
if (k < num)
printf("猜小了\n");
else if (k > num)
printf("猜大了\n");
else if(k = num)
{
printf("恭喜你,猜对了\n");
break;
}
}
}
所以我们需要一个每时每刻都在变化的一个变量,来放到srand的括号里,保持rand函数每一次的起点都不一样,才能真正达到完全随机的效果。
3.2-3 time函数
time函数,也叫时间戳 ,需要引用头文件<time.h>。这里介绍一下什么是时间戳:我们现实每一个时间与系统初始时间的差值叫做时间戳。时间戳是一串数字,一串无时无刻都在变的数字,这串数字可以转化成现实中的时间。知道这些,我们的问题也就能解决了!
void game()
{
srand((unsigned int)time(NULL));
//随机数命名为num
int num = 0;
printf("请在0~100之间猜一个数字\n");
num = rand() % 100 + 1;
//此时num的范围在0~100
while (1)
{
int k = 0;
scanf("%d", &k);
if (k < num)
printf("猜小了\n");
else if (k > num)
printf("猜大了\n");
else if(k = num)
{
printf("恭喜你,猜对了\n");
break;
}
}
}
time()函数的返回类型是time_t,之前有提到srand()括号内需要一个unsigned int类型的变量,于是我们在time()前面加上(unsigned int)来强制转换数据类型。
另外time()括号里需要一个指针变量。但是我们不需要这个指针变量,只需要他生成的随机数,所以time()括号内可以放NULL空指针。
这样,rand()函数就可以真正的做到完全随机!game函数的功能也完全齐全!
4.注意事项
srand函数只需要调用一次,如果每次使用rand函数前都调用srand函数,在循环足够快的情况下,还是有可能出现与srand()括号内放常量的那种重复情况!!!
5.完整的猜数字游戏代码展示
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
void nemu()
{
printf("***********************************\n");
printf("*********** 1.play ************\n");
printf("*********** 0.exit ************\n");
printf("***********************************\n");
}
void game()
{
srand((unsigned int)time(NULL));
//随机数命名为num
int num = 0;
printf("请在0~100之间猜一个数字\n");
num = rand() % 100 + 1;
//此时num的范围在0~100
while (1)
{
int k = 0;
scanf("%d", &k);
if (k < num)
printf("猜小了\n");
else if (k > num)
printf("猜大了\n");
else if(k = num)
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
do
{
nemu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("游戏结束");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
6.结语
此次示例代码仅写出猜数字游戏的核心功能,且引用的各种函数讲解也不是很透彻。希望有兴趣的小伙伴可以继续完善游戏代码,写出属于自己的功能更完备的猜数字游戏!!
最后还是请大家多多支持,点赞,关注,收藏!!!
https://cplusplus.com/reference/ ps:这个是查阅rand函数时博主使用的网站,可以收藏一下哦!