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

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

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



相关文章
|
API 数据安全/隐私保护 开发者
探索RESTful API设计的最佳实践
【10月更文挑战第25天】在数字时代的浪潮中,API成为了连接不同软件组件的桥梁。本文将深入探讨如何设计高效的RESTful API,通过实际代码示例揭示背后的逻辑和结构之美。我们将从基础原则出发,逐步展开到高级概念,旨在为读者提供一套完整的设计蓝图。
|
人工智能 数据挖掘 大数据
爆赞!GitHub首本标星120K的Python程序设计人工智能案例手册
为什么要学习Python? Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。此外,Python还具有免费开源、跨平台、面向对象、胶水语言等优点,在系统编程、图形界面开发、科学计算、Web开发、数据分析、人工智能等方面有广泛应用。尤其是在数据分析和人工智能方面,Python已成为最受开发者欢迎的编程语言之一,不仅大量计算机专业人员选择使用Python进行快速开发,许多非计算机专业人员也纷纷选择Python语言来解决专业问题。 由于Python应用广泛,关于Python的参考书目前已经有很多,但将Pytho
|
vr&ar 图形学 UED
优化图形渲染与物理模拟:减少Draw Calls与利用LOD技术提升性能
【7月更文第10天】在现代游戏开发和实时渲染应用中,性能优化是至关重要的环节,它直接关系到用户体验的流畅度和真实感。本文将深入探讨两种关键技术手段——减少Draw Calls和使用Level of Detail (LOD) 技术,来提升图形渲染与物理模拟的效率。
822 2
|
运维 数据安全/隐私保护 Python
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
|
Java 应用服务中间件 Maven
【终极解决方案】IDEA maven 项目修改代码不生效。
【终极解决方案】IDEA maven 项目修改代码不生效。
1874 1
|
人工智能 自然语言处理 搜索推荐
智源研究院开源中文互联网语料库CCI3.0,1000GB数据集,498GB高质量子集,魔搭社区可下载
近日,智源研究院正式发布中文互联网语料库CCI 3.0(Chinese Corpora Internet,简称 CCI)
|
Ubuntu Linux 测试技术
探索Linux中的`dbus-send`命令
`dbus-send`是Linux中用于进程间通信的D-Bus系统的命令行工具,允许应用程序通过消息总线相互交互。要安装它,可以使用包管理器(如`apt-get`或`dnf`)。基本语法包括指定总线类型、目标服务、消息类型、对象路径、接口及方法等。示例用法包括使用`dbus-send`来锁定屏幕(通过调用`org.gnome.ScreenSaver.Lock`)和设置音量(通过与PulseAudio服务交互)。在使用时,需了解目标服务的接口和方法,并确保具备相应权限。
746 10
|
自然语言处理 关系型数据库 数据管理
阿里云百炼|析言GBI产品入门指导
析言基础入门的操作体验,带领大家一起探索阿里云百炼|析言GBI的奥秘。
4203 19
|
Linux Go C语言
【ERROR】chaincode install failed with status: 500 - failed to invoke backing implementation xxx
【ERROR】chaincode install failed with status: 500 - failed to invoke backing implementation xxx
398 0
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)