三子棋的游戏实现以及逻辑思维讲解

三子棋游戏是c语言中经典的一道题目了,很能锻炼初学者的思维以及逻辑能力。如下是我自行编写代码时的一些思维与想法,各位可以借鉴一些然后对其优化。如下是实现函数时的大体思维导图

1.

关于思路的问题,首先我考虑的是在main函数内采用何种方式来调用其它函数。因此我联想到了进行游戏前需先询问是否游玩,借助此点可以联想到dowhile循环,先执行再判断。接着让玩家自行选择是否进行游戏,可以给个菜单,因此联想到了写一个menu函数用来打印菜单。

关于menu函数,我们可以打印出两个选项,让玩家选择是否进行游戏,比如输入数字1就是开始游戏,输入数字2就是退出游戏。

2. main函数主体以及优化

接着在do whlie 循环里通过menu函数的启示我们可以想到switch case语句,以此来满足menu函数中让玩家输入数字来选择是否进行游戏的功能。同时,我们要着手考虑while的条件,前面说过,选择1进行游戏,2退出游戏,我们可以在switchcase语句里添加case2:break,但是这样的话while的条件很难想到如何处理,因此我们需要优化。在c语言中非0表示真,0表示假。因此我们可以将case2退出游戏相结合。最终变为定义input变量,采用while(input)这种形式,既能满足switch case语句也能满足while的条件

3.二维数组创建以及运用define

main函数的部分实现了,现在就是game()函数的实现,关于三子棋,我们可以联想到有棋盘,下棋流程,判断输赢等部分,但是一次性很难想全,所以我先要做的就是打印出一个棋盘,因此我们要联想下棋的时候肯定是下在棋盘某个位置,但是不能凭空储存吧,在此基础上我们想到用数组来储存所下的棋。

三子棋是三行三列,而平时所用的一维数组要想完成三子棋要创建多个数组,这样未免太过麻烦。所以我们想出了使用二维数组。

在此我定义了一个board数组,当定义数组的行和列时我们可以想像到这个数组肯定是贯穿整个程序,会使用到很多次,如果一个地方出错的话很难修改。所以我们可以用define定义两个常量ROW COL来作为数组的行和列。到此二维数组创建完毕board[ROW][COL]

4.initboard函数实现

初始化数组的函数,我们所熟知的下棋类游戏是往一个空白的地方下棋,因此我们为了美观选择将二维数组所有的元素初始化为空白符号,函数实现如下:(主题思想运用循环)

5.printborad函数实现

打印棋盘,首先我们认识里的三子棋是井号,所以可以想到凭借我们所创建的二维数组是做不到的,还要接着打印其它字符。我所做的三子棋利用了|---这两种字符,并不唯一。但是在打印数组的时候我们如果选择优化的话是要调整循环的。例如未来如果你要打印5x5的棋盘或者其它类型的。使用print时选择(”---|---|---“)这种打印方式是不行的,所以我对其做出了优化,如下图,这样就能很好解决这个问题,同时也和define定义的常量相呼应。

6.palyermove函数实现

接下来就是玩家下棋了,玩家下棋时也要限制其范围,不能随意输入,所以我们采用if else来判断下棋的位置是否正确,同时在下棋前我们还要判断所下的位置是否已经落子。所以这部分函数并不难写,如下图

7.compuermove函数实现

实现电脑下棋时我们只能想到让其随机下棋,智能下棋对于初学者来说是做不到的。在随机下棋时我们要想到如何设置随机数,这时就有了srand与rand函数的配合,我们在srand里面调用时间戳来实现这一功能,再在函数里定义x,y两个变量去接受值,但是此时的值可能超出了棋盘范围,我们就要对其进行限制,int x = rand()%ROW就完美的解决了这个问题。因为是随机下棋,可能下到了已经落子的位置,此时我们就需要使用while(1)来让它确保能下棋,下棋完break跳出,如下

8.iswin函数

无论是玩家还是电脑,下完棋之后都要判断一次输赢,防止赢了但是程序还没结束这种情况的出现,通常都是使用循环来判断是否获胜,如下图,若双方都未赢,则继续游戏,iswin函数的实现部分如下

9.接下来就是isfull这个函数的实现

判断数组是否已经满了,然后判断输赢还是平局,这个只需遍历一遍数组看看是否还有空格就行。

10.拼装

game()内组装这些函数,因为下棋是反复的,所以我们采用while(1)循环执行,在其中添加break的跳出条件即可。以及要注意下一步棋就要判断一步输赢,能够优化的方面很多,还需要大家多多研究

test.c部分

game.h部分

game.c部分

希望大家能学到一点思路,并且进行优化,写出更加优秀的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_60285125

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值