你好, 欢迎｡
我想提供一个解决方案 玩井字游戏｡
记住, 有很多 解决给定问题的方法｡
这就是我的解决方案｡
如果您的解决方案不同
只要您遵循良好的编程实践并使用 用正确的方法来编写c语言, 那就好了｡
我只是提供我的解决方案｡
我相信它可以改进｡
那么我们开始吧｡
我将创建一个新的 这个项目叫做井字游戏, 我们将
开始尝试调整它｡
我试着把它分解 在演讲的描述中｡
我将创建一个 只有几个模块或者我应该说几个函数｡
希望这将是 好吧, 对你有好处
我所有的名字都用骆驼的名字 我已经习惯了｡
我们甚至可以把 如果我们愿意的话, 也可以将它转换成多个源文件｡
所以我们有我们的主要｡
让我们去掉这个printf｡
我将包括 一个额外的包括｡
这样我就可以 做一些清理我们的系统和一些好的事情, 允许
我也给我想撤个焦｡
所以除了这两个 库, 让我们包括conio｡ h.工作人员
我想做的是 我想解决这个问题｡
我想试着模 尽我所能｡
我说过我要去
使用一维数组, 二维数组 可能会更好｡
但我会实施
使用一个一维数组来表示我们的博弈 我们的井字游戏板｡
我将创建这个 作为全局变量｡
我使用了一个全局变量
因为我还没有展示 在c中通过引用传递数据｡
我不想把你弄糊涂｡
我就不必使用全局
我可以将数据传递给函数, 但是 需要使用按引用传递｡
我就得到处传 指针, 我们还没有讨论过这些内容｡
所以我将使用全球数据｡
请原谅, 记住全球数据
这通常不是一件好事, 但因为我们正试图 展示学习, 分而治之,
我们试图展示 我需要使用全局数据, 因为我们
我还没有谈到指针｡
我的全局数据 就是我的正方形, 代表我的格子,
我的井字游戏板｡
这将是一个
维面积10个要素主要是因为I 我不想使用0元素｡
我将使用此数组 选择号码来玩游戏｡
它还将允许 我有我的坐标｡
我将初始化它 只有值1到9｡
这将是一个 字符数组,
因为我需要在里面放x和o｡
我们还没谈性格呢 数组, 但这将允许我放置单个字符｡
这就像数组的概念 int, 除非它包含字符｡
记住, 人物有 用单引号括起来｡
所以一个239这个, 0这个 o我就跳过了,
我甚至都不会用到 因为我想用那些｡
它使编程变得更容易｡
我可以使用用户 输入为索引, 则为有效索引｡
我还得 创建2个全局变量供玩家在回合中选择｡
所以选择就是他们 通过键盘输入, 可以是1到9,
具体取决于 他们想把他们的x或o｡
玩家只需要
表示轮到谁的玩家, 玩家1或玩家2｡
我不需要任何其他全球数据｡
我只需要我的功能 声明｡
我要开始了 创建了3个函数｡
所以我会有3个 函式宣告｡
我要喝一杯 用于检查是否中奖｡
它不需要任何数据｡
它将返回一个int值｡
我会有一个 返回任何数据,
仅显示带有正确字符的纸板｡
它也不需要任何数据｡
我也会有一个 函数来标记棋盘｡
这将接受用户输入｡
根据他们输入的内容, 它将在阵列中的正确点上放置x或o
该阵列使用显示板｡
所以这里我们要说 标记板上会有一个带x或o的标记｡
这样我就可以重复使用这个了｡
我可以重复使用这个 玩家1或玩家2｡
3个函数声明, 这样我就可以 把我的函数放在程序的任何地方,
我已经在最上面声明了它们｡
你会注意到这两个 函数不返回任何数据,
并且只有一个函数接受参数｡
让我们实现这些函数 在我们实施游戏之前｡
首先, 让我们 实施绕组检查｡
这个函数基本上是 在公共牌中过牌, 看看是否有赢牌｡
所以它将包含 很多if语句｡
我也许可以改进 这段代码｡
但我会在这里 因为我们应该在函数的顶部添加注释｡
这些都是相当简单的｡
我们应该有函数名｡
这基本上就是说
函数将返回游戏状态1, 如果游戏 结束,
告诉你如果你赢了, 负一的结果如果 如果游戏结束并且是平局, 则为0｡
所以这个函数检查 一个是返回int｡
所以我要走了 并定义它｡
而这一切的目的就是
它会查看数组中是否有斑点 如果3x匹配｡
所以有很多 不同的if语句｡
那么我们怎么知道一个玩家是不是｡
我们知道如果一个玩家 如果它们在行对角线或列中匹配, 则为一个｡
所以我们必须检查每一个 那种情况｡
并且我们知道 列｡
所以如果我的平方等于
平方2和平方2等于平方3, 这意味着我们 在我们的第一排有一场比赛｡
所以我也要 在此处创建一个返回值｡
在最上面, 我只想说 返回值, 将其初始化为0
我们将初始化它 设为0表示游戏结束｡
如果我们在 第一行, 我将返回一,
游戏结束｡
然后我们要有一系列 我不想再回到
一个我想设置返回值的对象｡
因为我们可以回去 使程序更难执行｡
否则, 我们将 检查其他所有行｡
所以我要复制并粘贴 因为这里有很多冗余代码｡
唯一能让我 有趣的是如果我们打成平局｡
所以让我把所有的 否则就是赢家｡
然后我还要 返回不同值｡
而不是有一堆 如果, 我可以用“&”符号,
但这更难理解｡
所以如果我们有匹配的 在第一行中｡
让我们确保我们的 缩进是否正确｡
如果第二排有匹配的, 这就是第二个正在做的事情｡
如果第三排有匹配的, return one添加一些新行以提高可读性, 不需要任何括号
因为它们是单一语句｡
在第37行, 它看起来像 我们要匹配1号, 4号和7号
这看起来像是 对角线匹配, 返回1｡
40, 我们匹配25和8｡
看起来像是中央的 第二列｡
3 6, 可以看到 其他匹配也是如此｡
我们必须基本上捕捉所有匹配 用于行､ 列和对角线｡
这就是我们对所有 这些语句在数组中查找｡
现在有一件事告诉我们
没有匹配或者我们有平局的情况下, 我们必须比较所有的结果, 基本上就是确保它们不是初始化的数字｡
如果我们的数组是正方形的 并且不包含1 2 3 1 2 3
4 5 6 8或9 值, 这意味着我们有一个平局,
因为他们包含一个0或一个x｡
所以我们可以再写一个
如果这基本上表明这是平局我们可以设置返回值 设为0, 则传回相等0的值｡
这基本上就是 检查最后一个else如果, 如果数字相同
因为它们是初始化的｡
如果它们都不一样那么 这意味着我们可以返回0｡
我们把它挂起来吧｡
否则, 如果我们没有一 平局而我们还没有分出赢家那就意味着我们还没结束｡
所以最后一个else语句可以说 返回值等于负一｡
因为请记住, 函数是 如果游戏正在进行,
则返回负1, 如果游戏已结束, 则返回负1 而0表示没有结果游戏｡
我最不想做的就是 我想返回返回值｡
所以在这里我将 比如说返回值｡
而这将完成该功能｡
你注意到了什么 我们这样做, 我们是分而治之｡
我们所关注的是 现在正在检查棋盘看是否有赢家｡
我们会在小 我们会不断地进行测试｡
这使我们能够专注于 设计, 还可以让我们更容易地减少或隔离错误｡
既然我们已经完成了 游戏板,
我们要继续并实现显示板｡
显示板只是 要展示给董事会看｡
所以我们要做的就是 以特定格式绘制数组｡
所以我们要写一个 功能调用显示板｡
它不会返回任何数据, 它不需要任何参数｡
之所以是函数编号 一是因为我们需要画很多次板子 而且它更好是因为它在执行特定的任务｡
现在这一个将有 一堆printf函数｡
它将有 一堆格式｡
所以我要把它复制粘贴进去｡
这里的独特之处在于 我每次都在清理屏幕｡
但如果你说系统和 然后你说cls, 这将清空屏幕｡
这样更干净｡
然后我们将 做一堆打印｡
我们要打印出游戏的标题｡ 我们要打印出参与人1和0的数据｡
然后我们要 打印出电路板｡
董事会将会很好地
格式为一些平行条, 然后我们将打印出 数组中所有值的值｡
如果值为x或 0, 它将显示｡
如果不是, 则会显示
数字, 这样我们就可以使用该数字来选择要绘制的选项, 这就是这个函数的全部功能｡
既然我们已经完成了
现在我们要创建最后一个函数 在黑板上做记号｡
标记板将设置为
数组中的一个特定值, 它会输入 x或o中的标记｡
所以需要一个角色｡
这是要做的 它会有一堆else
if语句｡
在我们的记分板上, 我们 我想给予大家一些意见
将在棋盘上放置正确的字符x或o 在阵列中的正确点上｡
所以希望这是有意义的｡
如你所见的代码I 我得结束我的评论了｡
我想把它格式化得漂亮点 所以这里有两行｡
而这一切都将 它会检查用户输入的内容
请记住, 我们有2个全局数据 用户输入的值｡
我们还有一个价值 为当前播放器｡
所以选择基本上是 通过键盘输入的内容｡
我们尚未实现此功能 因为我们将在main函数中实现它｡
玩家将成为 当前播放器｡
我们两个都需要 留下我们的印记｡
所以我们要做的是 会有一堆else语句,
if语句
我们要过牌, 也就是用户输入的内容｡
而如果选择等于1, 我们 我想在广场上画点什么｡
我们还想确保 该正方形是可用｡
所以如果它等于1而不是 当前等于1,
这意味着基本上已经有人把x 或者是个o, 我们不能用它
如果它等于1 输入了一,
这意味着我们可以将数组设置为特定值｡
我们要将数组设置为 在x或o中传递｡
我们将重复 为每个选项执行此操作｡
如果是2､ 3､ 4､ 5､ 6､ 8或9｡
所以还有很多如果 做同样的事情｡
如果用户输入选项2,
则 确保压痕良好且方块2可用, 我们要用这里传递的信息来标记方块2｡
取决于轮到哪个玩家 我们要传入一个或一个x｡
现在我们最不需要做的就是 这个功能是我们必须验证｡
如果他们传递了什么 除了1到9之外, 那就是无效移动
最后一个else语句 这里会打印出一个消息, 说无效的移动, 它会 给这位运动员记一分｡
因为记住玩家 是1或2｡
我们将标记玩家 然后在主函数的循环中递增它｡
然后最后一件事 char只是暂停程序, 这样用户就必须点击
在无效移动后返回｡
否则, 无效移动将 然后它会立即被擦除
我们会重新画一遍｡
所以get char暂停了它｡
它会强迫你按回车键 以继续输入另一个值｡
这是我们的三个功能｡
记住, 这个函数 不返回任何内容｡
所以我们可以把它放在底部｡
现在我们必须 实施游戏｡
游戏规则是 框中选择自定义样式.
在游戏中, 这是 我们将要求用户输入一个数字, 我们将绘制
董事会, 我们要过牌, 看谁赢｡
所以我们要创建2个 本地变量,
我们要初始化播放器｡
在这里, 我们将 创建整数I｡
这将用于我们的循环｡
我们的分数要么是x 或者o, 这取决于轮到谁｡
我相信马克会是x或o｡
马克会是x或o｡
而选择就是 用户通过键盘输入｡
所以2个局部变量｡
我们还将设置 player, 这是一个全局变量｡
一开始, 它只会 成为一号玩家开始游戏｡
然后我们会有一个循环｡
我们将有一个基本上 一个循环直到我们玩完为止｡
我会用一个do while
因为我希望它至少执行一次｡
我想显示 至少登机一次｡
所以我将展示 直到我基本上和局或获胜｡
所以我会一直做下去 I等于-1｡
负1代表什么, 它 表示游戏正在进行中｡
我就要这个回报了 用于检查是否成功值
你马上就会看到
但基本上当我有一个循环在重复做同样的事情 直到游戏结束｡
游戏将会是 如果不是负数的话｡
那么我们首先要做什么｡
我们要做的第一件事 我们必须展示这块板子｡
所以我可以打电话给 功能显示板｡
那我们就得算高手了｡
玩家从一号玩家开始｡
我们要做的是 我们要用一个三元运算符 如果玩家模2, 则玩家等于1,
否则等于2｡
这是一种确定 合适的球员｡
循环的每次迭代 从1变为2或从2变为1｡
一开始是一号参与人
它会说玩家模2, 1除以2或余数 1除以2等于1｡
所以如果是一个 将成为第一参与人｡
当你回去
下一次迭代, 参与者将等于2 我们将递增它｡
2对2的模为0｡
所以如果它不等于 一, 那么参与人就等于参与人二
它只会将其设置为 如果玩家模2是1, 则玩家1｡
记住那个特纳 操作员希望如此｡
接下来我需要做的是 需要从用户那里获得输入｡
所以我要说, 我要 以要求用户输入数字｡
我会说参与者% d 要么是参与人1要么是参与人2, 输入一个数字, 然后我会把参与人 打印出来,
玩家1或2
然后我会读 来自用户的使用SCANF的输入｡
这是一个整数 代表了棋盘上的1到9的位置｡
我会储存 在我选择变量中
选择是一寸, 所以我 我必须输入地址,
我必须选择｡
如果是字符串我会 而不是传递地址｡
那我基本上可以确定 不管标记是什么｡
我必须确定这个标记 是基于玩家的x或no｡
所以我将使用 三元运算符｡
我将分配 来标记x或o｡
如果参与者等于1, 我会 来标记x, 大写的x｡
不然我就 给它赋一个大写的o｡
所以这个三元运算符非常 在必须根据条件分配变量时非常有用｡
这也说明了 如果参与者等于1,
马克等于x.
否则, 它将等于o｡
问号表示 布尔值为真,
冒号表示是否为假.
既然我找到了正确的字母,
我可以调用我的函数来标记电路板, 只需说mark 板, 传递x或o｡
我在黑板上做了记号之后 做出了选择,
我得看看是否有赢家｡
我有我的变量I 真的应该是个更好的名字
让我们将其命名为状态检查､ 游戏 查看游戏状态｡
游戏状态将是 等于负一或0｡
游戏状态将 等于从check for
win返回的任何值｡
因为记住, 这个函数 返回1､ 0或负1｡
如果游戏结束了 结果, 如果游戏正在进行, 则为负1, 如果游戏正在进行, 则为0
如果没有结果的话｡
现在我们储存了 状态, 我们还需要更改循环的条件｡
所以如果游戏状态是 等于-1, 我们就跳出这个循环
否则我们只需要 就是改变玩家的回合｡
我们如何改变玩家的回合, 我们就把参与者加1｡
这样下一次它就会上升 它会是2, 参与者等于2,
然后我们再往下算｡
当他们做了无效的尝试 发生在无效模板中, 它会减少播放器计数｡
当您减少播放器计数时, 你就回到正确的玩家那里｡
如果是1, 就递减到 0, 下一个回合是1,
基本上又是同一个回合｡
这就是我们增加它的原因
如果是2号参与人 我们将其加1｡
结果是2除以2等于0｡
所以它实际上 玩家回到1｡
就是这样的
但这是所有的逻辑｡
我们在这里做了很多｡
你不应该写所有 立即执行此代码和测试｡
你应该和 分而治之, 在运行代码时不断进行测试｡
现在我将提供 但让我们运行它并测试它｡
它会像以前一样工作 挑战讲座的演示｡
但是, 再一次地, 研究这个代码, 你肯定明白发生了什么｡
数组的使用和除法 conquer方法, 但是看看这个main方法看起来有多漂亮｡
很容易就能知道 在main方法中执行｡
显示板, 更换玩家和您 我可能想在这里发表意见｡
换圈, 然后 也在这里得到输入｡
然后设置正确的 字母,
根据玩家的回合设置正确的字符｡
你甚至不需要 这些注释是因为函数是如此的描述性｡
标记板, 设置板依据 用户选择或无效选择｡
然后是游戏状态检查 对于冬天来说, 这是不言而喻
然后我们跳出来 如果游戏结束的话｡
我们来建这个吧｡
希望没有错误, 没有 警告, 我们不这样做, 这很好｡
现在运行它, 您将 它的工作原理和我们的演示一样｡
它做的第一件事就是 将显示屏幕｡
它将允许 用户打印回车｡
它有我们的网格, 一个 2 3 4 5 6 7 8 9我们的阵列｡
它告诉我参与人1 输入一些内容, 我输入是有效的内容｡
它把它画出来 它将清除屏幕｡
所以看起来很不错｡
现在3里有个x｡
现在轮到2号了｡
我打算让做些无效的事｡
它说无效的移动, 它暂停｡
我按回车键 让二号玩家再来一次｡
现在我击中一个, 重画 o在一个点上｡
我一直这样, 直到 我们有赢家或输家｡
所以让我们为魔神造成一个赢家吧｡
现在x是, 2o是 x是6,
o是9.
游戏结束了, 因为我们刚抽到三张0｡
我忘了一件事 while循环后显示您赢得的祝贺｡
我们要做的就是 我们必须检查游戏状态｡
如果游戏状态等于 一个, 也就是说一个玩家,
他是最后一个获胜的玩家.
所以我们会打印出 玩家% d获胜｡
否则我们就 打印出一张图纸｡
因为如果我们脱离了这个圈子
而状态是否定的, 我们知道游戏结束了 有了一个结果,
它只是可能, 所以我们必须有最后一个如果 中双击子文档的名称｡
现在让我们以赢家的身份再来一次｡
现在我们将 看谁赢｡
所以我只需要输入valid
导致x快速获胜, 实际上必须在这个 因为那一个消失了
好了, 一号玩家赢了 它又发出了一种美妙的声音｡
所以这是一个很长的讲座｡
我为我的长篇大论道歉｡
研究一下这个代码, 我会 将其作为源文件提供｡
希望能学到很多 分而治之的方法
谢谢你