今天咱们来一起做一个游戏,可以算上是一个中小型的项目了,大概120多行代码,哈哈哈。来一起加油吧!
当我们面对一个不小的项目的时候,我们先不要着急着手于项目的制作,我们要先学会在脑海中对项目的整体进行构思。一个游戏可能会有什么?游戏说明?游戏选项?是不是也得有游戏菜单呢?没错我们就根据我们平时玩的游戏为模型来构造一个猜数字游戏,等你完成之后就会恍然大悟,原来程序这么简单!
首先在一个项目的刚开始我们毫无疑问会引用一系列的头文件,在正式开始行动的时候我们先来认识一下一些头文件。
1.<stdio.h> 使用printf和scanf需要引用的头文件
2.<stdlib.h> 在使用rand和srand函数的时候需要引用的头文件。
3.<time.h> 在使用time函数的时候需要引用的头文件。
4.<string.h> 在完善程序的时候可能会用到的头文件(在使用strcmp的时候会用到的头文件)
5.<Windows.h> 在完善程序的时候会用到的头文件(在使用system函数以及Sleep函数的时候需要引用的头文件)
(最常用的头文件用法你可以翻阅本人的博客空间,有一篇超详细的头文件博客解析哦。)
其次我们应当了解在一个项目的所有内容肯定不能都放到主函数当中,那样的话就会显得杂乱无章,因此我们就可以将每个部分分装成不同模块的小函数进一步对程序进行编制。
在我们做足了准备,就可以开始我们的程序的制作了。
1.游戏菜单的设计
在我们的想象中,我们的菜单比较简化的话应该是这样的,那么我们先来制作一个最简单的菜单吧! 首先我们想到的就是生成一个菜单的方法不就是打印码?没错我们可以利用一连串的printf函数进行菜单的打印,我们可以将他们密封到一个菜单函数我们就将其命名为menu1。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<Windows.h>
void menu1()
{printf("***********************************************************\n");printf("** **\n");printf("** 《猜数字游戏》 **\n");printf("** **\n");printf("** 0.退出游戏 1.开始游戏 **\n");printf("** **\n");printf("** 2.游戏介绍 3.神秘彩蛋 **\n");printf("** **\n");printf("***********************************************************\n");}
int main()
{menu1();
}
其总的代码形式就是如上图所示。那么下一步呢?菜单打印好了,下一步不就是该我们下一步的选择了吗?我们就可以着手完善自己的程序,我们会想到的是在屏幕上要输入一个数字进行选择判断,我们这里的按键有有四个选项,要是利用四个if语句进行判断的话就会显得比较繁琐,所以我们利用switch分支选择控制语句进行操作。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<Windows.h>
void menu1()
{printf("***********************************************************\n");printf("** **\n");printf("** 《猜数字游戏》 **\n");printf("** **\n");printf("** 0.退出游戏 1.开始游戏 **\n");printf("** **\n");printf("** 2.游戏介绍 3.神秘彩蛋 **\n");printf("** **\n");printf("***********************************************************\n");}
int main()
{int input = 0;menu1();printf("请选择\n");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");break;case 0:printf("退出游戏\n");break;case 2:printf("游戏说明\n");break;case 3:printf("想什么呢?没有彩蛋,好好C语言吧,傻憨憨\n");break;default:printf("输入错误,请重新输入\n");break;}return 0;
}
到此我们的大致的框架结构就已经完成了。我们下一步再来制作其中的细节。对于一个游戏只能玩一次肯定是不行的,我们要想让我们的程序可以反复使用肯定要用到循环语句。我们又想让我们的程序至少进行一次那么我们就应该利用do-while循环语句,那么我们的程序再循环一次之后就多了一次选择的机会。那么我们就将我们的设想进行实现。并且完善我们的使用说明,姑且将我们的说明命名为 introduce吧。那么我们的程序在接下来就会使如下的情况:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<Windows.h>
void menu1()
{printf("***********************************************************\n");printf("** **\n");printf("** 《猜数字游戏》 **\n");printf("** **\n");printf("** 0.退出游戏 1.开始游戏 **\n");printf("** **\n");printf("** 2.游戏介绍 3.神秘彩蛋 **\n");printf("** **\n");printf("***********************************************************\n");}
void introduce(void)
{printf("***********************************************************\n");printf("** 游戏名称:《猜数字游戏》 **\n");printf("** 游戏规则:当你输入一个数字的时候会根据你输入的数字 **\n");printf("** 判断你猜的数字是否正确,当你输入的数字偏 **\n");printf("** 大时候系统会提示你数字偏大,反之数字偏小 **\n");printf("** 当数字猜对时取得胜利。 **\n");printf("** 游戏制作人:大明超听话 **\n");printf("** 制作时间:2022年11月9日 **\n");printf("***********************************************************\n");
}
int main()
{int input = 0;do{menu1();printf("请选择\n");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");break;case 0:printf("退出游戏\n");break;case 2:introduce();case 3:printf("想什么呢?没有彩蛋,好好C语言吧,傻憨憨\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}
当我们的一切都准备好了的时候,我们就可以开始着手制作我们游戏的主要内容了。一个猜数字游戏,这个游戏的核心是什么呢?就是对生成一个随机数的猜测,那么我没就需要系统随机生成一个随机数。这个时候我们就需要用到rand函数了,rand函数会随机生成一个很大的数字,但是在使用rand函数之前我们必须引出一个srand函数,来重置我们每次生成随机数的数值。但是要是单纯的引用srand函数就会发现,每次开始游戏的时候生成的数值都是一样的,这大大降低了游戏的可玩性,我们该怎么解决这个问题呢?我们需要引用time函数了,引用一个时间戳,世间是随时都会变化的所以我们每次生成的数字也会因为时间的改变而改变。特别指出:我们的srand函数只需要引用一次就行,多次引用可能会造成我们程序上的错乱。
因此我们将srand放在主函数中。之后我们就可以在系统中进行简单的逻辑进行构造游戏了。比如:输入一个数字,判断是猜大了还是猜小了,或者是相等。到此为止我们的游戏基本上就已经做好了,在进行一下后来的完善就行了,比如:觉得一大堆提示框太烦人我们就可以利用windows的清屏函数进行系统的清屏,为了是我们的播放速度减慢便于我们观看说明我们可以利用Sleep函数进行系统休眠。在游戏结束之后我们像可以直接提问玩家,是否想要退出,如果输入Yes则退出,输入No则游戏继续,这就需要使用到exit(0)就可以直接选择退出游戏了。在这其中我们还需要strcmp函数进行判断输入的字符串是否为Yes或者No。最后我们程序完成之后的效果如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<Windows.h>
void menu1()
{printf("***********************************************************\n");printf("** **\n");printf("** 《猜数字游戏》 **\n");printf("** **\n");printf("** 0.退出游戏 1.开始游戏 **\n");printf("** **\n");printf("** 2.游戏介绍 3.神秘彩蛋 **\n");printf("** **\n");printf("***********************************************************\n");}
void menu2()
{printf("***********************************************************\n");printf("** 是否想要继续 **\n");printf("** **\n");printf("** 选择: Yes **\n");printf("** **\n");printf("** 选择: No **\n");printf("***********************************************************\n");}
void introduce(void)
{printf("***********************************************************\n");printf("** 游戏名称:《猜数字游戏》 **\n");printf("** 游戏规则:当你输入一个数字的时候会根据你输入的数字 **\n");printf("** 判断你猜的数字是否正确,当你输入的数字偏 **\n");printf("** 大时候系统会提示你数字偏大,反之数字偏小 **\n");printf("** 当数字猜对时取得胜利。 **\n");printf("** 游戏制作人:大明超听话 **\n");printf("** 制作时间:2022年11月9日 **\n");printf("***********************************************************\n");printf("你有五秒的阅读时间\n");Sleep(5000);system("cls");printf("请重新输入:\n");
}
void game()
{int input = 0;int ret = rand() % 100 + 1;while (1){printf("请猜数字:\n");scanf("%d", &input);if (ret > input){printf("猜小了\n");}else if (ret < input){printf("猜大了\n");}else if (ret == input){printf("恭喜你,猜对了\n");Sleep(2000);system("cls");menu2();char arr[20] = { 0 };again:scanf("%s", &arr);if (0 == strcmp(arr, "Yes")){system("cls");break;}if (0 == strcmp(arr, "No")){exit(0);break;}else{printf("输入错误,请重新输入\n");goto again;}}}
}
int main()
{int input = 0;srand((unsigned int)time(NULL));do{again:menu1();printf("请选择\n");scanf("%d", &input);switch (input){case 1:system("cls");printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");break;case 2:system("cls");introduce();goto again;case 3:printf("想什么呢?没有彩蛋,好好C语言吧,傻憨憨\n");Sleep(2000);system("cls");goto again;default:system("cls");printf("输入错误,请重新输入\n");break;}} while (input);return 0;}
以上我们的猜数字游戏也就完成了,感谢您的观看,祝您天天开心。