三字棋基本入门

简介: 三字棋基本入门

花了点时间把三字棋给打了出来,就讲讲具体的操作吧,也算是给自己巩固一下知识。

image.png

先把主函数打出来,一条一条看,首先先打出名字,srand先不看后面再来讲,定义一个参数,这里就要讲到关于这边循环语句的选择了,在这个地方我们要做到的是根据菜单进行选择,如果输入非法则需要重新输入。用while循环也可以,不过for循环就没有那么贴合实际应用了。同时,input的值为以0开始的整数因此可以设置成0退出游戏,1开始游戏,即当输入0时循环就自动结束。输入其他数值时便会循环。因此使用switch语句进行选择(if也行啦)再使用break跳出循环。同时设置了menu和game函数再主函数外进行声明和定义。这样子主函数大致就写完了。由于刚开始比较菜所以这次电脑下棋是通过取随机随机值来下的,以后精进一些就可以提升电脑的难度,让游戏更加完善。

image.png

随便打印了一个菜单,怎么顺眼怎么来,后面的\n很重要,码的时候不要忘记打了,不然就会全部连在一起。


该游戏是关于函数应用的一个拓展,这边都是以自定义函数为主。在开始写game函数之前必须要懂得这个游戏的原理。我们需要建立一个二维数组作为棋盘的内容,由于二位数组是以arr[x][y]的形式来使用,正好符合我们棋盘使用的需求。

image.png

同时,在game函数里还有多个不同的函数因此我们需要新建一个game.c文件和game头文件进行管理避免过于复杂和凌乱。

image.png

image.png

在game.h文件中定义行和列的数量,方便以后随时更改。 同时我们在

清空棋盘


每一局开始时我们都要确保棋盘是空的,所以自定义一个 Initboard函数(当然取其他名字也可以),同时在game.c和game.h文件中进行实现和声明。将我们要用到的参数传输出去。text.c和game.c文件中都要引用game.h文件(注意:引用自己的头文件时使用的是" "而不是<>)

image.png

image.png

image.png

只要我们将' '赋值给数组中的每一个数,就能实现棋盘的清空。使用两个for循环将有效范围覆盖到整个数组,而且数组下标是从零开始的所以实际上我们只需要i j 的范围是0~2。

打印棋盘


将棋盘清空后,将棋盘打出让玩家先走。这里我们设置一个DisplayBoard函数来打印棋盘。跟上面相同的方式在game.c和game.h文件里进行操作。

image.png

image.png

我们想打出一个这样的棋盘

image.png

直接打印并非不行,但若我们想要棋盘随着我们前面定义的行和列的改变而发生变化的话,就无法通过直接莽的方式来实现。将棋盘拆分之后我们可以发现第一行是   |   |   第二行是---|---|----以此类推,在最后一行没有 ---|---|----在最后一列没有一整条竖直线,这时候我们就想该如何实现这个函数。在细化之后我们可以看到第一行就是"   |"且最后一列不打印"|"第二行就是"---|"最后一列也不打印"|",同时最后一行不打印"---|"。即我们使用for循环将这几个小步骤实现,并加上一些小条件使其在部分位置无法打印。

image.png

玩家走


棋盘也打印完了,前期准备都已经准备好了,接下来就是正式开始游戏了,我们设置成玩家现在(电脑先走也可以,把电脑走的函数放到玩家走的函数前就行)跟前面的一样设置一个新函数然后放到另外两个文件中。

image.png

然后到game.c文件中进行实现,简单想就是我们输入一个坐标然后将其放入到该数组之中,这样再将棋盘打印出来的话,就相当于我们下了一子。而且玩家并非程序员输入的坐标自然是根据棋盘上的坐标来输入因此输入的坐标会比数组的下标大一,使用我们要在涉及数组的定位时将输入的数值减1。同时要判断其合法性,必须要比0大但是要不能超过棋盘的行和列,否则驳回,且这阶段如果一直输入非法则要反复输入即要使用循环语句,while(1)则表示恒为真即无限循环,直到输入正确后用break跳出。

image.png

电脑走


电脑走的流程跟玩家走的流程大相径庭,首先我们需要取一个随机值,用时间戳进行定义使每次的随机值都不相同

image.png

image.png

由于改返回的随机数的数据类型不同使用使用unsigned进行重定义,且生成改随机数的范围为由0~randmax而我们需要的值只要在0~row-1就行了。这时候我们应想到一个数取另一个数的余数必定会比这个数来的小且范围就在0~这个数-1。接着判断这个坐标是否有其他字符?没有的话就下这里,有的话就重新取随机值,即也是要无限循环。(注意两个=才是判断是否相等,一个=是赋值,打错的话就会出现只走一条路的结果)

image.png

当我一步---打印棋盘---你一步---打印棋盘,不知不觉间棋盘就满了,或是在满之前就已经分出胜负。因此最后一个关键步骤就是判断胜负!!而且在玩家走完跟电脑走完都要判断。

image.png

当一个人下完之后便会有四种结果即玩家赢 电脑赢 平局 继续走,那我们就以三字棋的规则来判断是否结束游戏再反馈不同的数字表达不同的结果。(这边return 的是字符类型的数据所以在声明的时候要用char来声明。

image.png

8ea230b46c9c4ac1b6dce32be92fb9d3.png

若非胜利则判断是否平局,新建了一个IsFull函数来判断棋盘是否全满,直接两个for循环一个判定。

image.png

最后根据Check函数反馈的不同值进行不同的操作。

daeedc8cb6164ac2a90f3b1ba7593d3f.png

这样我们的代码就写完了。我把整个代码的图放在最下面,这样看起来可能比较清楚。

text.c


01ddb6ee11e04f4e8f44fa3c45063872.png

game.h


image.png

game.c


884c4c1c6d684706b86fb0dae234e9c8.png

那今天就到这里吧。






目录
相关文章
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的多功能智能手机阅读APP附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的多功能智能手机阅读APP附带文章和源代码部署视频讲解等
110 0
|
人工智能 运维 API
AIGC产业对中小企业的容纳性高
【1月更文挑战第12天】AIGC产业对中小企业的容纳性高
173 2
AIGC产业对中小企业的容纳性高
|
安全 关系型数据库 MySQL
MYSQL数据库-基本操作(上)
MYSQL数据库-基本操作(上)
|
消息中间件 RocketMQ
六.RocketMQ极简入门-RocketMQ消息批量发送
RocketMQ极简入门-RocketMQ消息批量发送
|
网络协议 网络架构
IP协议的相关特性
IP协议的相关特性
190 0
|
运维 Java 开发者
配置文件的加载位置|学习笔记
快速学习配置文件的加载位置
配置文件的加载位置|学习笔记
Flutter 125: 图解自传 ACE_ICON.ttf 图标库
0 基础学习 Flutter,第一百二十五步:简单了解自定义图标库!
464 0
Flutter 125: 图解自传 ACE_ICON.ttf 图标库
|
存储 缓存 算法
Java集合详解5:深入理解LinkedHashMap和LRU缓存
《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。 这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star、fork哈 文章首发于我的个人博客: www.how2playlife.com 今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存。