从三子棋到五子棋,智能AI的设计

目录 1.初始化棋盘与打印棋盘 2.玩家下棋 3.电脑下棋与AI的设计 4.判断谁赢 1.初始化棋盘与打印棋盘…

目录

1.初始化棋盘与打印棋盘

2.玩家下棋

3.电脑下棋与AI的设计

4.判断谁赢


1.初始化棋盘与打印棋盘

制作棋盘游戏,首先就是打印一个棋盘,而打印棋盘一定要知道他的长和宽,我们先在头文件里设置好行和列的长度,其他函数的实现则是接下来的事。

三子棋的棋盘一共有9个空位,五子棋就先设定为10*10个空位,玩家将在这些空位上下棋,在游戏的过程中,我们是需要对玩家和电脑的下棋情况进行收录的,所以我们先创建一个数组,在里面全部初始化为 空格 ,实现如下:

接下来就是打印棋盘,打印棋盘为了可以时刻控制棋盘的大小,我们借助之前设置行和列进行循环打印,这样如果需要不同大小的棋盘只需要更改在头文件定义的行列的数值即可,实现如下:

打印出来的效果:

当棋盘设置为3*3时:

当设置为10*10时:

2.玩家下棋

玩家下棋很简单,下三子棋时玩家输入坐标(1~3)(1~3)(五子棋则是(1~10)(1~10))后判断此位置是否有棋子,如果有则让其在输入一次,如果没有则记录下来,放到之前创建的数组board里。

3.电脑下棋与AI的设计

简单的电脑设计用随机数来进行下棋就可以了,如下:

困难的人机是如何设计的呢?我们先来讨论三子棋,和在之前具体描述三子棋的方法一样,

我们仅让电脑判断:

(下面是按照优先序排列的)

1)如果己方(电脑)在横排、竖排、斜排已有两个棋子,如果剩下的位置没有棋子,则下在此处

2)如果对方(玩家)在横排、竖排、斜排已有两个棋子,如果剩下的位置没有棋子,则下在此处

3)如果以上情况都没有那么中间优先下,没有则下四角,如果都没有空位,那么随机下。

三子棋的AI设计是相对简单的,即使把所有的情况都列举出来也不是什么难事,但是五子棋如果想把所有的情况都列出来拿可能需要上万行的代码了,博主之前也尝试过类似的方法,但是发现代码量太大,还没什么技术含量,大致代码是这样的:

可以看得出来,仅仅只是判断电脑的行和列是否成四就已经有了好几十行代码,这样的实现方法是在太过繁琐,所以我又思考了另一种方法,也是我现在用来实现AI的方法。

具体的思路就是:

1)在行列和斜行中找到5个连续的位置,如果有电脑已经4颗相同的棋子,并且剩下的位置是空位的话,则下在空位上。

2)判断玩家的行列斜是否有4,原理和1)是一样的,只不过没有1)优先。

3)接下来就是活三,所谓活三就是3颗相同的棋子,而两边都是空位,这种情况我自认为是仅次于4颗棋子的,当然也是电脑优先(毕竟要以赢为优先),然后才是判断玩家的。

4)活三结束就是有一侧被堵的三连棋子,这种情况和判断4颗的相似,是找到4个连续的位置,判断三个相同和一个空位,然后让电脑下在空位上,当然还是电脑优先更高。

5)三颗的结束就来到了2颗,实现的方法与4颗和半三是相同的。

6)最后一种就是只有一颗的时候,我给出的判断是,在这颗棋子的周围8个位置(有空位)随机下一颗,如果这颗棋子是贴边的情况则直接进行随机下棋,因为如果第一步就下在边上的话,他的下棋方向受限很大,在其周围下也没什么意义。

以上是我的个人思路,下面是实现过程:

玩家的判断只需要将“#”改为“*”即可。

活三:

半三、二连这两种情况与活四的情况没有什么太大差异,只有在第三层循环判断的时候更改一下循环的次数就可以了。

接下来是只有一颗棋子的情况:

4.判断谁赢

我们需要在每次下棋(玩家或电脑)后进行判断输赢,如果玩家有五颗棋子连在一起,则玩家赢,如果电脑有五颗连在一起则电脑赢,如果棋盘满了也没有输赢则平局。

如果赢了或者平局则返回0,在game里判断是否返回0,如果是则结束本场游戏

下面是实现:

玩家的判断是紧接在相应的机器下面的,实现起来也就是吧#改成*就可以了。

这样所有的思路就全部实现完毕,我们来看一下成果:

(#是电脑,*是玩家)

运行结果其实还是说得过去的,不过我感觉我的方法还是很笨重很麻烦,所有的代码加一起也过了1000行了,如果小伙伴们有更好的思路的话欢迎在评论区进行讨论啊。

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/1344.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部