一、小项目的前提要求。
对二维数组和循环有了解。
二、项目结构
大家可以看到我这里创建了两个.c文件和一个.h头文件,头文件中放入函数的声明,定义的宏,和引用的库函数,game.c中主要是实现各个函数的功能,test.c是main函数的所在,我们在那里搭建好项目的结构。
上方代码即是项目的整体结构
用do...while循环来打印整个游戏,输入1便会执行game主程序开始游戏,输入0则会退出循环,因为while的循环条件便是我们创建的输入值。
三、game();的具体实现
这里我们可以看到game()函数的全貌,这里我将给大家一一讲解。
大家可以看到我们之前在game.h这个头文件中定义了的宏ROW(行)COL(列),之所以我们使用宏而非数字来之间创建3*3的二维数组是因为以后如果我们要改成5*5的棋盘只需改一下宏即可,而非一个个慢慢改。
char ret='0'是用来接受判断是否取胜的函数的返回值的字符变量,后面我会谈到。
一、初始化地图
在我们创建好一个3*3二维数组后我们的第一件事情便是初始化这个数组,于是便用到我们自定义的第一个函数,初始化改二维数组。
我们选择将其初始化为空格,便是为了实现棋盘上为空的效果。
二、打印地图
打印地图分为升级版和简易版两个版本
我们通过将棋盘的分割线分为几组来通过循环来实现打印
其中重点在于if的判断来让超出部分不进行打印。
三、玩家行动
注意点:1、我们需要用1表示第一行,因此需要x-1;
2、注意好判断的条件即可,x,y在正确的范围内并且该格子为空格方可下棋,下棋后跳出循环即可。
四、电脑移动
这里使用简单的方法实现电脑的下棋,即通过随机数的生成,rand()会生产随机的数字(需要配合之前main函数第一行的srand,在%ROW(之前定义的宏为3)后值必定在0-2之间的一个整数。
再判断格子是否为空,为空则下棋,不为空循环生产随机数,直到下到空处为止。
五、判断胜负
我们先约定玩家胜利返回字符*,电脑胜利返回#,平局为字符Q,游戏继续为字符C。
我们再函数内部先判断行和列是否相等,然后判断斜对角是否相同,记住判断条件中要不能是空格,当相同时我们便返回二维数组中该元素,因此玩家胜利返回字符*,电脑胜利返回#,很简单就能够实现了。
在判断平局的条件中我们用到了full函数,即如果遍历该二维数组后没有找到空格字符即视为满了,返回字符Q.
当以上条件均不满足后便返回继续游戏的字符C.
这里将函数写死了,大家可以开动脑筋进行修改。
六、运行逻辑
玩家移动->判断输赢->打印地图->电脑移动->判断输赢->打印地图,不断循环,直到结束;
在这里我们之前创建的ret便是接受判断胜负的函数的返回值,当返回值不是字符c(继续游戏)时我们便需要跳出循环,根据相应的返回值确定相应的结果后并打印出最终的棋盘。
七、总结
三子棋小游戏的实现并不复杂,只要我们理清楚思路和用好循环和数组便能写出来,让我们通过这个简单的小项目来锻炼自己的代码能力吧!
有空自己可以尝试将电脑写的更加聪明哦!