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

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

1.大体框架


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

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


进行测试:

de312ccd59a34a579733ec4c085617cb.png


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


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


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


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


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


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


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


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


2.1 初始化(InitBoard)


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



35de3566c7b343e3a438c1fcc61ef196.png


2.2 打印棋盘(PrintBoard)


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


c0564f41b3764a75bed175f81d83a5ad.png


进行测试:


a1c549c3b9e84e4090e33d168ce808cb.png


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


110006c4e0b944d4800e2816ca607029.png


进行测试:



b09e28524dee49cb9d9a87c11f6fdb88.png

 

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


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


2.3 玩家下棋(PlayerBoard)


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


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


21436454ace240b38b2f0829d5fda4fa.png

进行测试:

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


1492fef3bc634dd88eb51877ca0e765f.png


2. 4 电脑下棋(ComputerBoard)


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


012341a6c38540fb97166b5baae74416.png


进行测试:


6a50eb4b655e44d3971707daf3739e38.png

2.5 进行状态判断(IsWinBoard)


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


97a320c095b147f4875aae0dd99068c1.png


2.6 所有的函数实现


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



bc2421f55b644ea49d27ce812b13af0c.png

2.7 完整程序代码:


3656d1fc5c78409e802ea3ad9ef9c404.png

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


59d40573c43f45558a970487896182ca.png

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

a36db3eab8bc4e59a8b3167043f41e2e.png


 测试3: 平局逻辑没问题

38c6f0f001254d1882220c2579afa7e5.png


总结:

 

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

 

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


结束语


今天的分享就到这里,想要提升编程思维的,快快去注册牛客网开始刷题吧!各种大厂面试真题在等你哦!


💬刷题神器,从基础到大厂面试题👉点击跳转刷题网站


184068dc41e94efbb14e555f972eaa17.png



相关文章
|
8月前
|
C语言
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
|
存储 C语言
【C语言小游戏】三子棋(井字棋)(上)
【C语言小游戏】三子棋(井字棋)
104 0
|
8月前
|
程序员 C语言
实现三子棋游戏(C语言)----就是这么简单
实现三子棋游戏(C语言)----就是这么简单
42 2
|
8月前
c语言学完数组就可以完成的小游戏--三子棋
c语言学完数组就可以完成的小游戏--三子棋
|
8月前
|
存储 编译器 C语言
C语言之详解数组【附三子棋和扫雷游戏实战】(一)
C语言之详解数组【附三子棋和扫雷游戏实战】(一)
|
C语言
【C语言小游戏】三子棋(井字棋)(下)
【C语言小游戏】三子棋(井字棋)
66 0
|
程序员 C语言
【C语言小游戏】三子棋(井字棋)(中)
【C语言小游戏】三子棋(井字棋)
81 0
|
算法 程序员 文件存储
三子棋 --- C语言
三子棋 --- C语言
50 0
|
C语言
C语言三子棋小游戏--数组的应用
三子棋,顾名思义,就是三个子连在一起就可以胜出。在本节我们要介绍的三子棋模式是这样子的:在键盘输入坐标(表示落子),和电脑对下(当前电脑设计为随机下)
60 0
|
C语言
C语言数组第十课---------------三子棋-------数组经典练手题
C语言数组第十课---------------三子棋-------数组经典练手题