三字棋基本入门

简介: 三字棋基本入门

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

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

那今天就到这里吧。






目录
相关文章
|
8月前
|
存储 安全 编译器
c++入门
c++入门
90 0
|
8月前
|
存储 安全 编译器
【C++】C++入门(下)
【C++】C++入门(下)
|
8月前
|
开发框架 IDE .NET
c#入门必看
c#入门必看
59 0
|
8月前
|
存储 安全 程序员
【C++入门到精通】C++11 [ C++入门 ]
【C++入门到精通】C++11 [ C++入门 ]
45 0
|
8月前
|
Linux 编译器 开发工具
【c++】入门2
【c++】入门2
57 2
|
Web App开发 移动开发 IDE
laya入门,这一篇应该够了
laya入门,这一篇应该够了
5176 1
|
存储 Java
ASN.1入门(超详细)
ASN.1(Abstract Syntax Notation dotone),抽象语法标记1。是定义抽象数据类型形式的标准,描绘了与任何表示数据的编码技术无关的通用数据结构。抽象语法使得人们能够定义数据类型,并指明这些类型的值。抽象语法只描述数据的结构形式,与具体的编码格式无关,同时也不涉及这些数据结构在计算机内如何存放。
1120 0
|
存储 自然语言处理 安全
C++入门
正如标题一样,顾名思义,本节内容主要目的就是快速入门C++这门语言,很多人就想问了,为什么C++这么难的语言可以快速入门呢?不会又是标题党吧,嘿你别说,还真不是,因为在看本节内容之前我是默认你是扎扎实实的学过一遍C语言的,只有有了一门编程语言的基础之后才可以快速入门其他一门语言,当然这门语言最好是C语言,C生万物不是说说而已,强烈不推荐没有学习C语言的直接学C++。
C++入门
|
存储 安全 小程序
c++入门(下)
c++入门(下)
|
存储 安全 编译器
【C++】C++入门知识
【C++】C++入门知识

热门文章

最新文章