前面已经介绍过了分支循环的相关语法知识,但是并没有举相关的例子,所以这次我们就用分支循环语句来写一个比较好玩的代码。
写一个猜数字小游戏
要求:
电脑自动生成一个1~100之间的数字,玩家来猜,根据玩家猜的数字给出猜大了或猜小了的反馈,直到猜对为止,过程中也可增加次数等等限制来增加游戏的趣味性。
思路
初学者学编程时由于写的代码比较少,可能对一些问题无从下手,这就需要看别人写的一些代码,理解了别人写的代码之后,自己再尝试着模仿这些代码,注意不是原模原样的照着别人的代码敲,而是自己理解了之后独自再敲一遍。
刚开始写这种代码量比较大的程序时一定要先想清楚整个代码的逻辑,把一个大问题拆分成若干个小问题,这样写代码才会条例清晰而且思路不易乱。
目前这个问题最困难的可能就是电脑要自动生成随机数,有了随机数之后就可以利用分支循环实现猜数字游戏,所以这个代码大致可以先分为随机数的生成和猜数字两部分。
随机数的生成
rand函数:
如果我们要写代码让电脑生成随机数暂时还做不到,所以这里我们可以调用一个库函数rand,这个函数是可以生成随机数的。
由于会用到函数,所以这里先简单了解一下:C语言中的函数其实就是一个完成某种特定功能一段代码,所以函数也叫子程序。函数又分为库函数和自定义函数。库函数在使用时包含相应的头文件然后直接调用就行了,而自定义函数的写法可以参考主函数,因为主函数也是函数。
rand函数包含在头文件stdlib.h中,原型为:
int rand(void);
int代表该函数会返回一个整型类型的值,void表明这个函数不需要参数。例如在屏幕上直接打印rand函数生成的随机数可用如下代码
printf("%d\n", rand());
因为返回的是int类型,所以用%d来打印,\n是换行符,表示打印完之后光标会返回到下一行。
rand函数生成的随机数范围在0~RAND_MAX之间,RAND_MAX的大小是依赖编译器实现的,但一般是32767。而该函数是通过对一个叫“种子”的基准值进行某种运算生成的随机数,而rand函数默认种子是1,如果要每次程序运行时生成不同的随机数,就要让种子发生变化。
srand函数:
C语言提供了一个srand函数用来初始化随机数的生成器,原型为:
void srand(unsigned int seed);
在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的种子,只要参数seed是变化的,种子也就是变化的,每次生成的随机数也就不同了。如srand(2);表示rand的种子已经变成2了。但是要每次运行程序是都手动给srand一个不同的值好像也不太好。其实在程序中我们一般使用程序运行的时间作为种子,因为时间是变化的。在C语言中有一个time函数可以获得这个时间。
time函数:
time函数会返回从1970年1月1月0时0分0秒到现在程序运行时间之间的差值,单位是秒。该函数包含在头文件time.h中,函数原型:time_t time (time_t* timer);
time函数的参数timer如果是非NULL的指针的话,函数会将这个返回的差值放在timer指向的内存中带回去。
如果timer是NULL,就会返回这个时间的差值。time函数返回的这个时间差也被叫做时间戳。这里我们只让time函数返回时间戳,可以直接写成time(NULL);(这里没有接收返回值)所以我们可以将生成随机数的代码这样写:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned int)time(NULL));
//time函数返回值是time_t类型,srand函数的参数是是unsigned int类型,所以要强制转换
printf("%d\n", rand());
return 0;
}
猜数字
设置随机数的范围
我们要猜的数字范围是1~100之间,而rand生成的随机数范围是0~RAND_MAX之间,所以要对随机数设置范围。
如果我们对生成的随机数进行取模运算
rand() % 100;
取的是随机数除以100之后的余数,所以生成的随机数范围在0~99之间,再对该随机数加1得到的随机数范围就在1~100之间
rand() % 100 + 1;
代码实现
先可以打印一些信息,这里写成一个函数
void Print()
{
printf("****************************\n");
printf("*****欢迎来到猜数字游戏*****\n");
printf("***********请选择***********\n");
printf("*****1:玩游戏 *****\n");
printf("*****0:退出游戏 *****\n");
printf("****************************\n");
}
要调用这个函数打印信息时只需如下代码
Print();
由于打印出的信息是选择1玩游戏,选择2退出游戏,而这个游戏可能要玩不止一次,所以可以用分支循环语句来完成
int main()
{
//生成随机数
srand((unsigned int)time(NULL));
while (1)
{
//打印信息
Print();
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
//猜数字
break;
case 0:
//退出游戏
printf("已退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}
return 0;
}
现在游戏的雏形已经完成了,最后只要完成猜数字的部分就可以玩了,和前面一样,猜数字的部分我们也写成函数的形式
void game()
{
int guess = 0;
int num = rand()%100 + 1;
printf("请猜一个1到100之间的数字\n");
while (1)
{
scanf("%d", &guess);
if (guess > num)
{
printf("猜大了\n");
}
else if (guess < num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜对了\n");
break;
}
i--;
}
}
这里也可以增加次数的限制,代码可以写成如下形式
void game()
{
int i = 5;
int guess = 0;
int num = rand()%100 + 1;
printf("你只有5次猜数字的机会\n");
printf("请猜一个1到100之间的数字\n");
while (i)
{
scanf("%d", &guess);
if (guess > num)
{
printf("猜大了\n");
}
else if (guess < num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜对了\n");
break;
}
i--;
}
}
其实写到这里程序就可以运行了,但是为了增加游戏的趣味性,在给大家分享几个命令:
在windows的电脑上有很多系统命令如:cls清理屏幕、shutdown -s关机、shutdown -a取消关机、也可以设置时间关机shutdown -s -t 60代表60秒后关机。这些命令用库函数system可以执行。该函数包含在头文件stdlib.h中。例如我们可以写一个函数用于关机,代码如下:
void Shutdown()
{
printf("注意!!!你的电脑将在一分钟后关机,如果输入我是猪,则取消关机\n");
system("shutdown -s -t 60");
char arr[20];//字符数组,大小为20个字节
scanf("%s", arr);
//strcmp函数可以用来比较两个字符串是否相等,如果相等,则返回0,该函数包含在头文件string.h中
if (strcmp(arr, "我是猪") == 0)
{
system("shutdown -a");
}
}
在C语言中也有一个函数叫Sleep,可以让程序睡眠一定时间。该函数包含在头文件windows.h中。比如让程序睡眠1000毫秒可以这样写:
Sleep(1000);
综上,整个猜数字游戏就讲完了,下面是整个游戏的代码,供大家参考
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
void Print()
{
printf("****************************\n");
printf("*****欢迎来到猜数字游戏*****\n");
printf("***********请选择***********\n");
printf("*****1:玩游戏 *****\n");
printf("*****0:退出游戏 *****\n");
printf("****************************\n");
}
void Shutdown()
{
printf("注意!!!你的电脑将在一分钟后关机,如果输入我是猪,则取消关机\n");
system("shutdown -s -t 60");
char arr[20];
scanf("%s", arr);
if (strcmp(arr, "我是猪") == 0)
{
system("shutdown -a");
}
}
void game()
{
int i = 5;
int guess = 0;
int num = rand()%100 + 1;
printf("你只有5次猜数字的机会,若5次机会用完,你的电脑将在一分钟后关机\n");
printf("请猜一个1到100之间的数字\n");
while (i)
{
scanf("%d", &guess);
if (guess > num)
{
printf("猜大了\n");
}
else if (guess < num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜对了\n");
break;
}
i--;
}
if(i == 0)
{
Shutdown();
}
}
int main()
{
//生成随机数
srand((unsigned int)time(NULL));
while (1)
{
//打印界面
Print();
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
//猜数字
game();
break;
case 0:
//退出游戏
printf("已退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
Sleep(1000);
system("cls");
}
return 0;
}