C语言三子棋(具备通用的判断函数)

废话不多说,先上代码:

 test.c

 game.c

 game.h

 这里简单解释一下各个函数的作用

test.c

这个函数用于构建整个函数的大体框架

game.h

声明函数的集合,便于各个文件间函数的调用

game.c

程序的主要实现内容

本文章主要介绍判断输赢的函数(因为其他的函数实现都很普通,很多博主写的都比我好,这里就不再赘述了)。

先来个全貌:

 现在咱再仔细刨析一下这玩意:

第一步:

先判断是否满了

 

 

 逻辑很简单,遍历棋盘,count计数并初始化为棋格总数(ROW(行)*COL(列)),有一个空格count-1,如果遍历结束后count仍为棋格总数,说明棋盘已满,返回‘^'。

现在给大家看一下test.c中的判断方式

 如果有返回值,那么跳出下棋的循环,并判断返回值,如果返回’^',说明棋盘已满,算是平局。

下面上个小菜,横行与竖列的判断

代码如下:

这是横行的判断

这里先解释一下Winnum, Winnum是规定的赢棋条件,比如Winnum 3 那么三子连成一线算赢,如果Winnum 5那么五子连成一线算赢。

第114行的循环表示对棋盘一行一行的进行检索 i表示第几行

 下面的count 仍是计数作用 用于记录一行中相邻位置的两个棋子相同的次数

j 则表示列

 而后从每一行中 从左向右依次遍历,因为是两个两个的检索,需要防止数组越界,所以一共遍历COL-1次,每检索一次,count++,之后判断是count否达到Winnum-1,如果count==Winnum-1直接返回当前检索的棋子符号。当一行中检索完毕之后若没有返回,则将count清零,以便下一行进行检索。

 列的检索与行的检索是十分相似的,仅需将i 与j 的位置互换即可,就不再展开讲述了,直接上代码

 

 好了,现在是大餐了!!

斜线的检索

我在这里使用了最暴力的遍历,即从左下角开始,即下图中的(3,1),方向则是从左上方到右下方(红色箭头,画的不太好,见谅见谅)

 

 我将蓝色方块组成的斜线称作中斜线(方便下面的描述),我的代码也分为两部分,一部分是在中斜线以下的,另一部分是在中斜线及其以上的。

我们先来看中斜线以下的代码

 

 count表示循环的次数(这里的循环是指从左上到右下的大循环),x是每次大循环起始位置的横坐标,y是每次大循环起始位置的纵坐标,n是每次大循环中该条斜线上的棋子数量,也用于判断是否越过中斜线。

161行的while是进行左下方循环,每大循环一次,count++, count1是统计此时相邻两个棋子符号相同的次数,同时用a 接收起始位置的横坐标,用b接收起始位置的纵坐标,在每一次大循环内,我们将用a,b来表示不断变化的棋子的位置。之后的逻辑与横行那里一致,如果count1==Winnum-1直接返回当前检索的棋子符号。当一行中检索完毕之后若没有返回,则将count1清零,以便下一行进行检索。需要注意的是在每次检索相邻的两个棋子之后,需要不断更新a,b的值以实现向右下方的不断检索(a++,b++),每次大循环结束后x--,表示起始位置向上,同时n++,表示下一次大循环中棋子的数量加一。

 当n的值为ROW时,意味着已经到了中斜线上,那么此时需要跳出中斜线以下的循环并进入到中斜线及其之上的循环。

(注意,中斜线以下的循环的条件是n<ROW)

 当程序跳出左下方的循环之后,会自动进入上图的循环,即中斜线及其之上的循环。此处的逻辑与左下方循环的逻辑基本类似,需要注意的点是起始位置改变是y++(纵坐标向右移动)。

最后就是从右上方到左下方的检索,这与从左下方到右上方的逻辑一致,区别仅在于起始位置的更改与检索位置的方向变化,直接上代码。

 这种判断函数的通用性是很不错的,可以实现五子棋的判断,缺点是棋盘必须是正方形,同时判断可以优化一部分算力(起点可以进行更精确的布置),希望后续可以实现上述的优化,同时希望将来我可以写出智慧的电脑下棋路线(现在还是人工智障)。

最后,如果我的博文真的帮到了你,还请赏个赞哦:)

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值