一.制作菜单menu
定义一个menu函数来打印游戏菜单
void menu() { printf("*****************\n"); printf("*** 1. play ****\n"); printf("*** 0. exit ****\n"); printf("*****************\n"); }
二.调用menu函数并设置判断
首先在do while内调用menu函数,然后用input接收用户输入并用switch判断,当输入0时退出游戏,输入1时进入游戏,为了防止用户输入0 1 以外的数字,用default进行提示并重新开始输入。此时一个简易的菜单便制作完成。
int main() { int input = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game();//尚未编写 break; case 0: printf("退出游戏!\n"); break; default: printf("选择错误,请重新输入!\n"); break; } } while (input); return 0; }
三.编写game函数
1.首先需要生成1~100的随机数
生成随机数是这个游戏最核心的部分。 C语言中提供了一个生成随机数的函数rand(),通过这个函数就可以生成随机数。但是如果只是调用rand函数,大家可以发现一些问题。
void game() { int ret = rand(); printf("%d\n", ret); return 0; }
可以发现,第一次运行的结果和第二次运行的结果是一样的,这貌似并不是随机数。这是因为rand函数生成的其实是伪随机数,伪随机数是通过某种算法生成的随机数,因此这个随机数就并不是很“随机”,生成范围是0~RAND_MAX(即32767)。
而正确使用rand函数的方法是,在rand函数产生随机数之前,使用srand函数设置随机数的生成器,srand函数的参数可以叫做种子,类型是unsigned int,头文件为:stdlib.h
1.当在rand函数之前使用srand(1)设置时,可以发现结果与上面的结果是一致的,这就证明了当只是使用rand函数生成随机数时,其默认种子便是1。一但种子固定了,生成的随机数也就固定了,这也就很好的解释了为什么两次运行出来的随机舒适一致的。
2.了解完这一点之后,我们就可以想,只要让srand的种子变动起来,那么rand函数生成的随机数便可以随机起来。
我们都知道时间是在不停发生变化的,C语言中提供了一个函数time,头文件为:time.h,该函数可以返回一个时间戳,时间戳代表的是当前机器时间相较于计算机的起始时间之间的差值,即1970年1月1日开始到当前时间的差值,单位是秒,通过这个时间戳也可以转换成正常时间。
因此只要我们能够获得这个时间戳, 并将它作为srand函数的种子,那么rand函数生成出来的随机数就能真的随机。因为srand函数的参数类型是unsigned int,因此time(NULL)还需要强制类型转换。
通过以上设置,此时出来的便是随机数了 ,但是此时的随机数范围仍然是0~RAND_MAX(即32767)。需要生成0-100的随机数,只要将rand()%100,就可以得到0~99的数,再在结果后+1,范围便是1~100了。那么生成1~100的随机数就完成了。
2.猜数字功能
有了随机数,剩下的就很简单了,只需要判断键盘输入的值与随机数的关系,比随机数大就输出猜大了,比随机数小就输入猜小了,相同则猜对了,那么完整的game函数如下:
void game() { int ret = rand() % 100 + 1; int guess = 0; while (1) { printf("请猜数字:>"); scanf("%d", &guess); if (guess < ret) printf("猜小了\n"); else if (guess > ret) printf("猜大了\n"); else { printf("恭喜你,猜对了\n"); break; } } return 0; }
如果觉得作者写的不错,求给作者一个大大的点赞支持一下,你们的支持是我更新的最大动力!