> 文档中心 > 二维数组的应用之-----------三子棋(精简版)详解

二维数组的应用之-----------三子棋(精简版)详解


前面:Hello!我是@每天都要敲代码,现在还在处于复习C和学习数据结构的阶段,今天我们来讲一下二维数组的应用之-------三子棋;一起学习吧!!!

目录

1.大体框架

2.游戏具体功能设计环节:

2.1 初始化(InitBoard)

2.2 打印棋盘(PrintBoard)

2.3 玩家下棋(PlayerBoard)

2. 4 电脑下棋(ComputerBoard)

2.5 进行状态判断(IsWinBoard)

2.6 所有的函数实现 

2.7 完整程序代码:

总结: 

1.大体框架

    对于设计一个游戏而言,我们最重要的就是框架的设计,有了框架我们就可以根据框架封装成不同的函数来实现具体的功能,三子棋的框架实际上是和猜数字游戏类似的,这里就不多叙述,不太明白的同学,欢迎来访一个改版的猜数字;进行学习;下面直接上具体代码:

    我们先测试一下框架的逻辑是否正确,是不是我们想要的那样;如果不是进行调试修正,如果正确,就继续实现功能呗:

进行测试:

 

2.游戏具体功能设计环节:

    我们首先要封装成一个函数,假如为game();用这个去代替printf("玩游戏\n");然后把所有的功能都写到game()函数里;那么我们要进行思考了,我们主要做什么样的功能接口呢?

1.初始化(InitBoard),首先我们肯定要进行初始化的,不然里面是随机值,才开始打印出来多难看

2.打印棋盘(PrintBoard),我们要把棋盘打印出来,看一下

3.玩家下棋(PlayerBoard),玩家进行下棋

4.电脑下棋(ComputerBoard),电脑进行下棋

5.进行状态判断(IsWinBoard),玩家赢?电脑赢?平局?继续游戏? 

注意:值得注意的是,我们下棋的时候用' *' 代表玩家下棋,用 '# ' 代表电脑下棋,所以为了使用方便,我们不妨设计为char类型的数组

2.1 初始化(InitBoard)

    对于初始化无非就是遍历整个数组,把他们全部初始化为空,因为是二维数组,我们需要写两层循环,根据行row和列col作为循环条件,具体代码如下:

2.2 打印棋盘(PrintBoard)

    初始化好后,我们肯定要打印出来看一下,是否初始化成功,并且我们可以在此时,把棋盘也打印上,具体代码如下:

 进行测试:

    有些小伙伴可能看不懂这个代码了,判断条件太多了,为什么有判断条件?i<row-1 和 j<col-1其实它只是用来限制边界的,有了这两个条件右和下的边界就不会被打印,我们不妨实验一下,看看效果,下面重新看一下,如果没有i<row-1 和 j<col-1的限制条件,代码和运行界面又是怎样?

进行测试: 

 

    下面这种方式的代码是不是更好理解一点,但是你仔细对比一下两者的界面对比,无非就是边界多打印了两个,当然使用第一种界面是更加的好看,毕竟四周都是没有边界的;下面这种两边有边界,两边没有边界,对于强迫症的我,多少有点难受!!!

注意:我们需要注意的是,无论是哪种方式,每打印好一行,都要进行printf("\n")换行

2.3 玩家下棋(PlayerBoard)

    对于玩家下棋我们要输入坐标,坐标输入过后我们首先要判断坐标是不是合法?坐标合法了,在判断要下的位置是不是被占用了?只要想明白了这两点,我们的逻辑就没啥问题了;下面看具体代码:

注意:这里我们需要注意一点,对于我们玩家来说,下标就是[1-row]和[1-col],但是对于程序来说二维数组下标是[0-row-1]和[0-col-1],所以我们在代码中具体应用时,要理清楚对应的关系!!!比如:下面代码中的判断坐标是否合法和是否被占用都用到了。

 进行测试:

注意:这里我是把玩家下棋写到循环里了,所以才能这样连续测试

2. 4 电脑下棋(ComputerBoard)

     对于电脑下棋,肯定是生成随机数,调用rand()和srand()两个函数,详细解释在开头提示的那边文章里有,这里就不在多赘述直接使用;对于电脑下棋我们是否需要判断坐标是否合法?坐标是否被占用?当然不用啦,我们在输入时,就让它的坐标在合法的范围内,(坐标怎么在合法范围?x=rand()%row和y=rand()%col)坐标被占用直接让它在随机生成就可以了;值得注意的是srand()函数还是要写在主函数里,下面看具体代码:

进行测试: 

2.5 进行状态判断(IsWinBoard)

    判断输赢:我们每一步都要进行判断,判断是:玩家赢返回*、电脑赢返回#、平局返回Q、继续游戏返回C;下面看具体代码:

 

2.6 所有的函数实现 

      写好了所有的函数,我们就需要利用条件把他们封装在一起,对于下棋来说我们不止一次需要下,所以把它们写到循环里,直到出现玩家赢、电脑赢、平局,就跳出循环;如果不是就继续下棋;直到出现上述三个结果之一,下面看具体逻辑代码:

2.7 完整程序代码:

测试1: 电脑赢逻辑没问题

 测试2: 玩家赢逻辑没问题

  测试3: 平局逻辑没问题

 

总结: 

     对于三子棋我们会了,五子棋也是肯定没问题的;对于上述这个代码而言,主要就是把判断输赢的函数里改一下,再把行列改一下;因为在这个代码中我们只有判断输赢IsWinBoard这个函数是写死了,其它都是灵活可以随着行列改变的!!!

    对于三子棋游戏,我们只要理清楚思路,自己试着敲个两遍,就能写出来啦。