掌握了C语言中几个基本的分支,选择语句后,我们可以尝试写一个猜数字的小游戏
程序设计
猜数字游戏的原理我们可以简化为以下几点:
1,系统在给定范围内生成一个随机数;
2,玩家输入一个数,系统判断是否为生成的随即数;
3,若不是,系统根据玩家输入的数字给出对应的提示;若是,玩家胜利游戏结束。
游戏实现
一:生成随机数
1.1rand函数
首先我们要让系统生成一个随机数,需要借助rand这个库函数。
rand的作用:
rand在C语言中的作用就是生成一个随机数,如下:
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
输出结果为
可以看到生成了五个不一样的数字,那这就解决了随机数的生成问题吗?
答案是没有
当我们再一次运行程序就可以发现,程序生成的数字和之前是一样的。这是因为rand函数是根据算法生成伪随机数,是基于一个“种子”进行运算生成随机数。而rand函数默认的种子为1,所以当种子不变时,rand函数每次运行生成的随机数是一样的。如果要生成不同的随机数,就要让rand函数的种子不断的变化。C语言中提供了一个srand函数来初始化rand函数的种子。
1.2srand函数
srand的原型为
void srand(unsigned int seed)
程序在执行rand函数前会先调用srand函数来初始化“种子”的值,只要让种子不断变化,那就能使rand函数每次生成的随机数是不一样的。但要做到让srand函数的参数不断变化不能使用rand,一般是使用time函数来作为srand的参数,因为时间是不断变化的。
1.3时间戳
在C语言中用来获取时间的函数为time。其原型为:
time_t time(time_t* timer);
该函数会返回1970年1月1日到现在程序运行时间的差值,单位为秒,返回的类型为time_t的整型类型。
若time函数的返回参数timer为非NULL指针的话,函数会将差值放在timer指向的内存中带回去。
若为NULL的话,函数只会返回该时间的差值。函数所返回的这个差值就被称为:时间戳。
该函数使用时需包含头文件time.h
因为时间是不断变化的,所以时间戳的值也是不断变化的,我们就可以做到让种子的值不断变化,如:
srand((unsigned int)time(NULL));
为了避免编译器报警告,我们可以指定返回值的类型为unsigned int类型。
综上所述
我们就可以每次运行程序的时候生成不同的随机数了,例:
第一次生成
第二次生成
完成生成随机数后,我们就可以根据之前学习过的循环知识来编写猜数字游戏主体了
二,游戏程序
首先我们需要设计一个游戏菜单,来选择是否开始游戏,可以使用do…while循环和switch来实现
2.1游戏菜单
我们首先打印一个菜单,可以编写一个menu函数来实现:
然后我们就可以通过do while和switch来选择是否开始游戏了。我们已经知道do…while循环会先执行一次循环体在判断条件是否成立,且0为假非0为真,所以我们就可以设计在switch语句中0为退出游戏(exit),1为开始游戏(play);当然我们要考虑若玩家输入了其他数字的情况,所以就需要default,所以我们可以把程序设计成如下所示:
int main()
{
int a = 0;
do
{
menu();
printf("请输入:");
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入:");
break;
}
} while (a);
return 0;
}
我们运行一下看一下效果:
这样我们就实现了选择功能。
2.2生成给定范围的随机数
在玩家选择开始游戏后,我们需要生成一个在给定 范围的随私数,例如生成一个在1~100范围的随机数,用上面介绍的srand和rand函数来实现,首先初始化随机数生成器
srand((unsigned int)time(NULL));
然后生成随机数并赋值给i,
int i=rand()%100+1;
因为给定范围为1~100 ;而除以100取余的范围为0~99,所以我们还要加上1,我们可以将值打印出来看下效果:
可以看到这里两次结果不一样,这就代表我们生成随机数成功了。
2.3玩家输入值,系统判定大小
在生成随机数后,玩家就开始猜数字,系统会根据玩家输出的数字来给出提示,数字大了,或者数字小了,或者猜对了,这里因为要重复猜测所以需要用到while循环和if判断来编写,我们命名一个game函数来实现这个功能,因为不需要返回值所以用void来定义
void game()
{
srand((unsigned int)time(NULL));
int i = rand() % 100 + 1;
}
生成随机数后,玩家输入一个值并与生成的随机数比较,根据结果给出提示:
void game()
{
srand((unsigned int)time(NULL));
int i = rand() % 100 + 1;
int j=0;
scanf("%d",&j);
if(j<i)
printf("太小了");
else if(j>i)
printf("太大了“);
else
printf("猜对了!");
}
因为要重复猜数,所以我们将其放入while循环,当猜出数字时跳出循环:
void game()
{printf("game start\n");
srand((unsigned int)time(NULL));
int i = rand() % 100 + 1;
while(1)
{
int j=0;
scanf("%d",&j);
if(j<i)
printf("太小了\n");
else if(j>i)
printf("太大了\n");
else
{printf("猜对了!\n");
break;}
}
}
我们可以运行一下看下效果:
可以看到,游戏成功运行,这样猜数字游戏就完成了。
2.4游戏扩展
当然,我们可以在上述的游戏内容上进行扩展。例如我们可以设置猜数字的次数,每次猜数字错误次数就减少一次;当剩余次数为零时游戏也结束且显示失败,这时候我们就需要引入第三个值来判断次数,当次数为0时跳出循环且显示游戏失败:
void game()
{printf("game start\n");
srand((unsigned int)time(NULL));
int i = rand() % 100 + 1;
int count=5;
while(1)
{
if(count==0)
{printf("游戏失败\n");
break;}
int j=0;
scanf("%d",&j);
if(j<i)
{ printf("太小了\n");
count--;}
else if(j>i)
{ printf("太大了\n");
count--;}
else
{printf("猜对了!\n");
break;}
}
}
我们运行一下看下效果
可以看到当我们失败五次后游戏就结束了。
当然,猜数字还有其他的扩展方法,例如根据玩家输入的数字与随机数的差值的大小给出不同范围的提示等等…有兴趣的朋友可以自己去试一试。