目录
前言:
我们都知道,对于制作游戏,甚至说对于游戏开发,在市面上我们偏向采取运用C++来实现代码运作功能以及交互模块,并且运用类似easy_X等图形库来实现人物对象的塑造。为什么更愿意使用C++制作开发游戏而不是运用C语言或者C#等语言来制作游戏呢,其本质还是属C++是一门面向对象的开发语言,其对于对象的封装和实例化有着比C语言和C#更高效的方法,更高效的制作,这对于开发成本有着显著的下降。
而今天实现的《猜数字游戏》,可以不需要运用对象的封装和实例,就可以基本实现。并不是说C语言只能制作诸如此类这些简单游戏,而是借用《猜数字游戏》可以引用到游戏中的基本元素,对以后的游戏开发可以高效简洁的实现,让玩家一目了然,玩得尽兴。
关于猜数字游戏先解释标准规则,再介绍几种变体。
通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
而今天的猜数字游戏,我们以一种更简单的方法来玩。
系统给定一个1——100的数字,玩家来随机猜任何一个1——100以内的数,系统判断是否匹配,如果猜的数大于,就打印“大了”,如果小了,就打印“下了”,如果正确,就打印“正确”。
(一)制作菜单:
1.关于菜单
对于每一个游戏,我们都不会一上来就给玩家呈现游戏内容,而是给玩家提供菜单,一般包括:
“开始新游戏”、“读取存档”、“选项”还有“退出游戏”,可能还会加上介绍制作游戏的团队名称以及团队成员。因此,提供一份简洁高效的菜单是必不可少的。
2.编写菜单:
void menu() { printf("****************************\n"); printf("********* 1.Play ***********\n"); printf("********* 0.Exit ***********\n"); printf("****************************\n"); }
以上是运用C语言实现的最简单的菜单打印,包含“玩游戏”的实现,以及“退出游戏”的代码实现,以我的观点来看,我认为一个最基本的菜单,务必要实现“开始游戏”和“退出游戏”两个模块,这样可供玩家选择什么时候开始游戏,当玩完后可以选择直接退出游戏。
但是这仅仅只是一个函数的实现,那在主函数里我们应该如何调用这个菜单函数呢?
3.调用菜单并选择:
在主函数里,我们可以先创建一个input变量,这个input变量可以用来输入1或者0,当输入0时我们退出游戏,输入1时我们开始游戏。因此在这里,我们可以选择do..while循环和switch语句来帮助我们实现调用菜单并选择。
#include<stdio.h>
int main()
{
int input = 0;
menu();
do
{
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 0 :
printf("\n正在离开游戏....\n");
break;
case 1:
printf("\n猜数字...\n");
game();
break;
default:
printf("\n请重新输入...\n");
}
} while (input);
return 0;
}
以上是我们在main函数里实现调用菜单函数以及选择语句。
现在我们可以看到,为什么在菜单里面我们用输入0来表示退出游戏,而不是用2、3、4等来接收,因为当我们把input输入为0时,switch语句就会自动结束,而do...while循环也会就此结束。
(二)进行游戏:
case 1:
printf("\n猜数字...\n");
game();
break;
我们在case 1语句中,调用了一个game()函数,我们在对于这么简单的游戏操作,为什么我们不直接在main函数里面实现代码操作,而是另开一个函数去调用呢?这样多出几行代码,不会更复杂吗?
1.为什么在这里要调用函数?
如果我们直接在main函数里面实现全部代码过程,这样会使得我们的代码冗杂,代码健壮性低,而如果我们使用函数,就可以将main函数里的代码量进行缩短,在我们以后想要执行命令时,就可以直接调用函数,这样就不会再写一次,将代码变得冗长。
2.game()函数的实现
void game()
{
int n = 0;
printf("请输入你要猜的数字:");
int num = rand() % 100;
int count = 1;
while (1)
{
scanf("%d", &n);
if (num > n)
{
printf("小了\n");
}
else if (num < n)
{
printf("大了\n");
}
else
{
printf("猜对了!!!\n");
if (count <= 5)
{
printf("\n用了%d次就猜对了,真厉害!\n", count);
}
else
{
printf("\n菜\n");
}
break;
}
count++;
}
}
以上就是game()函数所实现的内容,在while(1)的死循环中实现猜数字游戏,这样猜错了就可以一直猜一直猜。而运用if条件语句实现这个代码的底层逻辑,“如果大了”就打印大了,“如果小了”就打印小了,“如果相等”就打印猜对了。
3.关于随机数:
随机数rand()是C语言库里面自带的一个生成随机数的库函数,但是在这里我们要生成100以内的随机数,因此我们将rand()%100,这样就可以实现100以内的数了。
我们都知道,如果我们只是引用rand()函数,这样是可以产生随机数,但是我们产生的随机数是固定的,这样我们就知道计算机产生的“随机数”了。所以我们利用一个时时刻刻发生变化的量,就可以彻彻底底的解决随机数这个问题了。
srand函数:
以上是srand的定义,“Initialize random number generator”的意思是“初始化随机数生成值”。
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用time(0)的返回值或NULL来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。"相同的种子对应相同的数值"。
所以我们在这里引入了一个概念——————时间戳(time())
我们利用时间函数time()来计算时间和秒数。
此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存。
所以就有了以下的代码
srand((unsigned int)time(NULL));
将这串代码放在main函数里,还应当包含头文件。
#include<stlib.h> #include<time.h>
这样生产的随机数,才是真正的随机数。
总代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
int n = 0;
printf("请输入你要猜的数字:");
int num = rand() % 100;
int count = 1;
while (1)
{
scanf("%d", &n);
if (num > n)
{
printf("小了\n");
}
else if (num < n)
{
printf("大了\n");
}
else
{
printf("猜对了!!!\n");
if (count <= 5)
{
printf("\n用了%d次就猜对了,真厉害!\n", count);
}
else
{
printf("\n菜\n");
}
break;
}
count++;
}
}
void menu()
{
printf("****************************\n");
printf("********* 1.PLAY ***********\n");
printf("********* 0.EXIT ***********\n");
printf("****************************\n");
}
int main()
{
int input = 0;
menu();
srand((unsigned int)time(NULL));
do
{
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 0 :
printf("\n正在离开游戏....\n");
break;
case 1:
printf("\n猜数字...\n");
game();
break;
default:
printf("\n请重新输入...\n");
}
} while (input);
return 0;
}
总结:
对于猜数字游戏,我们首先应当打印菜单,并且要用函数的方式实现菜单的打印,并利用do...while循环和switch语句来实现菜单的选择。
在生成随机数方面,要用到srand((unsigned int) time(NULL));
还要记得包含头文件。
以上就是怎样运用C语言实现《猜数字游戏》的全过程。