在写三子棋代码之前,我们首先需要梳理好如何封装函数这一个概念,因为像此类代码量不小的项目不会只在一个文件中实现。
我自己用来封装函数或者文件的时候是如下理解的---
第一个文件就是逻辑运行文件该文件不属于各类函数实现(定义的文件),是自己头脑里过的第一遍逻辑,如我想实现三子棋---1.我需要菜单,2.我需要拥有棋盘,3.我需要可以落子,4.我需要判断胜负。此类属于逻辑文件。少定义多调用
第二个文件就是函数的声明文件,该文件只用于对于函数的声明或者是引入一些库函数,等多个文件都需要的函数。
第三个文件就是函数的定义文件,该文件只用于函数的定义,这个文件才属于对于函数功能的实现且要尽量达到高内聚低耦合(说白了就是函数功能尽量的单一,便于操作和使用)。
如图
这就是封装好的三个文件
接下来开始围绕如何实现三子棋代码来展开
首先我们要将自己想象成用户:
映入眼帘的肯定是游戏菜单这也是个函数
menu()函数
值得一提的就是这里采用的是0,1即真假概念,可以与后续switch和do while语句联动
至此之后就是我们的大体函数game()函数---此函数包括我们所有的游戏函数的调用---当前游戏函数肯定还没有声明和定义
既然说了是三子棋也可以是n子棋自然不会像之前写代码一样引入一个局部变量,不断通过改变局部变量来达到我们的目标,这次我们就引入了一个宏的定义,也就是---标识符常量
而且我们能看见这个是在我们的函数主声明文件中的为了方便我们所有的文件都能使用,我们创建了一个头文件
想要下棋肯定得需要一个棋盘,但是我们利用什么东西来存放我们的数据呢?存放多组数据用的是数组,这里我们定义一个二维数组来表示我们的棋盘,且我们需要将它初始化 --- 为全" (空字符--也就是空格) "
再将其打印出来
在声明文件中声明
在定义文件中实现
效果如图
棋盘有了那就可以开始下棋了
下棋原理就是用特定的字符去代替我们刚刚初始化的二维数组 如:用'*'去代替' '
我们声明 定义 调用和 初始化棋盘一样
利用函数PlayerMove(参数)
玩家下棋完成后就该电脑下棋了
电脑下棋就需要一个库函数叫做rand()但是rand()一般与srand连用,所有我们要优先写出srand()既然是随机数,也就是可变的数字,一般我们利用的是随时都在变化的时间来当作参数 即 srand((unsigned int )time(NULL))
unsigned int 代表着为无符号整形,确保了随机数是正整数,time是时间函数,NULL是空指针
这里值得提点的就是%运算,利用取模运算来保证这个随机数的范围存在于我们的数组之中,不会产生数组越界访问的这种错误。
最后就是判断输赢的这个函数(没给大家截图,希望大家自己想一下有没有什么更好的方法)
我利用了两个计数器来分别去测试每个棋子落下的情况来分别讨论胜负的情况,这样做的好处是,无论是几子棋都不必大篇幅的修改。
代码就放在这里了,希望大家能早日写出来这个项目
game1/game1 · 李行者/study C - 码云 - 开源中国 (gitee.com)
逻辑文件 test.c
声明文件 game.h
定义文件 game.c