文章目录
一、游戏要求:二、打印简易菜单三、游戏大致模型四、生成随机数五、实现基础游戏内容六、猜数字游戏基础版完整代码七、拓展1:添加玩家可以猜数字的次数(附代码)八、拓展2:添加关机程序(附代码)七、将游戏分享给其他人的方法
一、游戏要求:
电脑⾃动⽣成1~100的随机数玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束拓展:(1)加入能够猜的次数(2)如果猜不对倒计时60秒关机,输入“我是猪”才取消关机二、打印简易菜单
按常规套路,玩游戏前都会有一个简易菜单,让用户选择是否开始游戏,由于现在讲到的知识有限,在这里我们利用函数printf直接做一个菜单
思路:我们需要用户输入一个值来确定是否开始游戏,在这里我们就定为:输入1开始游戏,输入0退出游戏,输入其他值就显示输入错误,请重新选择,后面我们会讲到具体实现
现在我们有了规定就开始动手吧,为了美观,我们将其包装为一个函数menu(),菜单代码如下:
void menu(){ printf("\n**********************\n"); printf("*****1. 开始游戏 *****\n"); printf("*****0. 退出游戏 *****\n"); printf("**********************\n\n"); printf("提示:输入1或0后回车\n\n");}
三、游戏大致模型
在进入游戏后,我们至少会让玩家选择一次玩还是不玩,再加上如果玩家要玩游戏,玩过之后还要询问是否还要玩,这就构成了一个循环,那用哪个循环最好呢?由于要让玩家至少选择一次,所以我们使用do······while循环最好,因为要让循环体的代码至少运行一次
在循环中, 我们需要做什么呢,首先要打印一次菜单,然后让玩家选择,选择的值有0或者1,有这种具体的整型值,我们最好使用Switch分支语句,但是也要注意如果用户输入其它值,那么也要提示他重新选择,就要用到default
为什么选择1或者0让用户输入呢,这是为了让我们循环判断方便一些,如果用户输入0,刚好0代表假,那么循环不会继续,输入1,非零为真,所以循环可以继续,输入其它值就显示输入错误
为了简化代码我们将游戏的具体实现封装为一个函数game(),等一下讲到具体实现的办法,现在先把它写到我们的主体中,游戏大致模型代码如下:
int main(){int n = 0;do{menu();scanf("%d", &n);switch (n){case 0:printf("游戏结束\n");break;case 1:game();break;default:printf("输入错误,请重新输入:");break;}} while (n);return 0;}
四、生成随机数
既然我们是猜数字游戏,那么我们肯定要生成一个数字让用户去猜,而且是随机数,我们先来看看随机数怎么生成的,再想办法来限定它的具体大小
此时我们需要一个函数来帮助我们实现,那就是rand()函数,它的参数为空,它的作用就是帮我们生成一个范围是0~RAND_MAX的伪随机数,一般最大值是32767,伪随机数是什么呢,就是电脑生成的数字,不可能是完全随机的,它是根据一定的算法实现看起来是随机数而已
使用rand()函数,需要包含一个头文件,接下来我们就使用一下它,多使用几次来看看是不是能生成随机数:
可以看出确实是生成了随机数,那么是不是就这样就能完成我们生成随机数的要求了呢?我们关闭运行窗口,让代码再次跑起来,结果如下:
我们惊讶的发现,这一次代码运行产生的随机数居然和上一次一模一样,这很明显不符合我们的要求,我们的要求是每一次都能生成不同的随机数,否则这一次生成的随机数和下一次一样,用户不需要猜都知道答案,游戏就没有意义了
那这是这是怎么回事呢?是因为rand()函数生成的是伪随机数,是通过一定的算法实现的,给算法一个值,它就能生成许多随机数,但是由于算法固定,所以随机数也固定了,这个值就是rand()函数的种子,默认情况下这个种子是1,如果我们不去改变它,那么种子永远都是1,生成的随机数也会固定,只有让我们的种子不固定,才能真正实现创造随机数
为了更改这个种子,C语言又提供了一个函数srand(),它的参数是一个无符号的整数,但是有一个问题,我们需要srand()的参数不固定,但是rand()不能真正生成随机数,也就不能让它作为参数,那怎么办呢?
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的,在C语⾔中有⼀个函数叫time(),就可以获得这个时间,用户每玩一次游戏,时间肯定就过去了,我们的种子也就跟着变了,生成的随机数也就变了,最终实现我们的生成随机数的需求
在使用time这个函数时,我们需要包含头文件<time.h>,在这里我们直接写出它的用法,等讲到指针我们再具体讲解time函数,如果不懂,也可以直接复制下面的代码:
#include <time.h>#include <stdlib.h>srand((unsigned int)time(NULL))//由于srand的参数是无符号整型,//所以这里我们就可以使用学过的//强制类型转换,将它转为无符号整数
此时我们的种子就在不断的变化,这下使用rand()函数就没有顾虑了,对于种子的改变我们将它写在主函数main中,如图:
五、实现基础游戏内容
上文中我们提到将游戏内容包装为一个函数game(),那么我们现在就来想想基本思路
首先我们要对用户进行提示,我们要猜的数字在哪个范围,这里我们将范围指定为1~100,代码为:printf("\n游戏开始,请猜1~100之间的数字\n\n");//其中三个\n是为了让输出的结果更好看,也可以自行调整
现在我们就要真正来生成一个1~100的随机数了,我们刚刚讲过rand()函数生成的随机数一般都在1 ~ 32767之间,怎么约束它呢,我们只需要给它**%100+1**就可以了,%100可以产生0~99的数字,+1后就变成了1 ~ 100了,代码如下: int num = rand() % 100 + 1;
生成随机数过后,我们就需要用户输入值来猜,就需要打印提示信息,以及输入数字,代码如下: int guess = 0;printf("请猜数字:");scanf("%d", &guess);
随后我们需要对生成的随机数num和玩家猜的guess的值进行比较,给玩家提示信息,比如猜的数字大于随机数就输出猜大了,反之就猜小了,如果猜对了就输出,“恭喜你,猜对了”,随后游戏结束,由于玩家不可能一次猜对,所以会重复猜,就要使用我们的循环,这里我们使用while(1)对代码死循环,如果猜对了就break跳出来,具体代码实现如下: while(1) { printf("\n请猜数字:");//由于每次用户都要输入 scanf("%d", &guess);//于是把它们放在循环内部 if (guess > num) { printf("\n猜大了\n"); } else if (guess < num) { printf("\n猜小了\n"); } else { printf("\n恭喜你,猜对了\n"); break; } }
上述代码中有许多\n是为了使游戏更好看,可以自行调整,此时我们就完成了这个猜数字游戏的基础版,赶紧试试吧!
六、猜数字游戏基础版完整代码
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <time.h>void menu(){printf("\n**********************\n");printf("*****1. 开始游戏 *****\n");printf("*****0. 退出游戏 *****\n");printf("**********************\n\n");printf("提示:输入1或0后回车\n\n");}void game(){printf("\n游戏开始,请猜1~100之间的数字\n\n");int num = rand() % 100 + 1;int guess = 0; while(1) { printf("\n请猜数字:"); scanf("%d", &guess); if (guess > num) { printf("\n猜大了\n"); } else if (guess < num) { printf("\n猜小了\n"); } else { printf("\n恭喜你,猜对了\n"); break; } }}int main(){int n = 0;srand((unsigned int)time(NULL));do{menu();scanf("%d", &n);switch (n){case 0:printf("游戏结束\n");break;case 1:game();break;default:printf("输入错误,请重新输入:");break;}} while (n);return 0;}
七、拓展1:添加玩家可以猜数字的次数(附代码)
大致思想:为了实现这个代码我们可以增加一个count变量来约束循环,我们这里就不把循环设置为死循环,将它的循环条件设置为count,我们每循环一次就让count自减一次,直到count变成0,循环结束,然后我们就在屏幕上输出:“次数耗尽,游戏失败”,最后我们将随机数打印出来,让玩家知道结果细节补充:我们可以在游戏开始前提示玩家一共有多少次机会猜数字,然后每猜一次就提示还剩几次机会,同时经过实验,将count设置为6最合理,当然也可以根据需求更改,拓展后代码:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <time.h>void menu(){printf("\n**********************\n");printf("*****1. 开始游戏 *****\n");printf("*****0. 退出游戏 *****\n");printf("**********************\n\n");printf("提示:输入1或0后回车\n\n");}void game(){printf("\n游戏开始,请猜1~100之间的数字\n\n");int num = rand() % 100 + 1;int guess = 0;int count = 6;printf("你共有%d次机会\n", count); while(count) { printf("\n请猜数字:"); scanf("%d", &guess); if (guess > num) { printf("\n猜大了\n"); } else if (guess < num) { printf("\n猜小了\n"); } else { printf("\n恭喜你,猜对了\n"); break; } count--; printf("你还有%d次机会\n", count); } if (count == 0) { printf("\n次数耗尽,游戏失败,随机数是:%d\n\n",num); }}int main(){int n = 0;srand((unsigned int)time(NULL));do{menu();scanf("%d", &n);switch (n){case 0:printf("游戏结束\n");break;case 1:game();break;default:printf("输入错误,请重新输入:");break;}} while (n);return 0;}
八、拓展2:添加关机程序(附代码)
我们先来了解一个Windows提供的命令:shutdown,我们这里了解它的两个参数(1)一个是-s -t +秒数,含义是多少秒后关机,比如shutdown -s -t 60就是60秒后关机
(2)另一个是-a,作用是取消当前的关机命令,如shutdown -a就是取消关机知道这两个命令有什么用呢?我们可以通过C语言来调用这个命令,方法就是用一个函数system(),只需要将命令写入括号中,并且用双引号引起就可以了,使用system函数需要包含一个头文件<windows.h>具体构思:在上面增加次数的代码中,我们说如果次数耗尽那么就显示游戏失败,我们现在可以将其改成:如果次数耗尽,首先利用system函数使用shutdown -s -t 60,让电脑一分钟后关机,随后就提示“游戏失败,次数耗尽,游戏失败,随机数是:···”,然后再提示“请注意,你的电脑将在60秒后关机,输入我是猪取消关机”这时我们需要注意的是,我们需要创建一个字符数组让玩家能够输入我是猪,代码如下:
char arr[10] = { 0 }; scanf("%s", arr);
这样就可以让用户输入字符,那么然后我们就需要比较用户输入的字符是否是我是猪,如果不是就提示输入错误,要求重新输入,这里我们就要引入字符串比较函数strcmp(),用法就是将两个字符串分别传入函数,用逗号隔开,使用这个函数需要包含头文件<string.h>
根据上面的思路,我们需要用户输入字符,并且输入错误我们还需要让其重新输入,很容易就联想到使用循环,这里我们使用while循环,使用while(1)来构成死循环,如果输入的值错误就重新输入,如果输入正确,那么就利用system函数使用shutdown -a来取消关机,最后使用break跳出循环经过上面的学习,相信你已经可以写出这个搞怪关机版的猜数字游戏了,在这里我提供代码仅供参考,可以根据自己的需要更改,代码如下:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <time.h>#include <Windows.h>#include <string.h>void menu(){printf("\n**********************\n");printf("*****1. 开始游戏 *****\n");printf("*****0. 退出游戏 *****\n");printf("**********************\n\n");printf("提示:输入1或0后回车\n\n");}void game(){printf("\n游戏开始,请猜1~100之间的数字\n\n");int num = rand() % 100 + 1;int guess = 0;int count = 6;printf("你共有%d次机会\n", count); while(count) { printf("\n请猜数字:"); scanf("%d", &guess); if (guess > num) { printf("\n猜大了\n"); } else if (guess < num) { printf("\n猜小了\n"); } else { printf("\n恭喜你,猜对了\n"); break; } count--; printf("你还有%d次机会\n", count); } if (count == 0) { printf("\n次数耗尽,游戏失败,随机数是:%d\n\n",num); char arr[10] = { 0 }; printf("请注意,你的电脑将在60秒后关机,输入我是猪取消关机\n\n"); system("shutdown -s -t 60"); printf("请输入:"); while (1) { scanf("%s", arr); if (strcmp(arr,"我是猪")==0) { system("shutdown -a"); printf("\n恭喜你,取消了关机\n"); break; } else { printf("输入错误,请重新输入:"); }} }}int main(){int n = 0;srand((unsigned int)time(NULL));do{menu();scanf("%d", &n);switch (n){case 0:printf("游戏结束\n");break;case 1:game();break;default:printf("输入错误,请重新输入:");break;}} while (n);return 0;}
七、将游戏分享给其他人的方法
相信你已经尝试玩了这个猜数字游戏,是不是特别想分享给朋友室友玩一玩呢?跟着我来学习吧
首先打开vs,将上方的debug模式改为release版本,随后将代码运行一次,如图:
然后找到存放该文件的文件夹,找到x64文件夹,然后找到release文件夹,打开后找到扩展名为exe的可执行文件,直接将其发送给朋友就可以了,是不是非常简单呢!
最后如果觉得本文的猜数字游戏有用,记得一键三连,拜拜~~