|
学习提示:如果没有C语言与Windows项目开发基础可以通过下方链接学习:
0基础C语言学习与训练
0基础C++学习与训练
Windows项目开发系列
1、棋子的描述
在五子棋中它只有两种类型的棋子,分别是黑子与白子,而AI程序如何认识棋子呢?
那么,我们可以把棋子最基本的共有属性提取出来,例如:棋子的颜色与位置,从而,形成一个节点,
而每个节点就代表着一个棋子,这样,AI程序就可以通过节点中的信息知道棋子是黑子还是白子,以及,
在棋盘中的位置,从而,AI程序就可以认识并辨别不同颜色的棋子了。
2、棋盘的标记
AI程序在落子前需要判断棋盘的位置上能否落子。就像人在落子前,会先(观察对应的位置)是否存在棋子,
如果没有,才可以落子。所以,就需要为AI程序构建一个棋盘标记,如下图。
例子:

例子分析:
通过上面的例子,我们可以直观地看到,在一个棋盘上没有落子的位置标记为0。
已经落子的位置标记为1或2,区分AI与对手,这样,AI程序就可以知道哪个位置可以落子了。
3、棋子的查找
对于AI程序,它需要知道当前的(对手与自己)落了多少棋子,以及,每个棋子的位置,
从而,作出正确的进攻与防守判断。
那么,AI程序可以每次都对(棋盘)进行扫描,从而,根据(棋盘上的标记)找出所有(棋子与对应的位置),
但是,这样做会耗费较多的时间,那么,怎样做才可以更有效率呢?请看下面的例子。
例子:

例子分析:
通过上面的例子,我们可以直观地看到,一共有3颗棋子,而每颗棋子描述的内容属性都是相同的,即(白子)
以及(所在位置的行列号)。
那么,我们只要在白子或黑子每次落子后,把信息保存到一个节点中,然后,与前一个相同属性的同色棋子
节点连接起来,从而,形成一个有序的队列,那么,当AI程序需要知道当前棋盘中有多少棋子,以及,每个棋子的
信息时,就可以从这个队列中快速地查找到,而不需要对整个棋盘进行扫描,从而,提高了运行的效率。
4、防守判断(活三威胁)
什么是五子棋中的活三?
(活三)就是在(连续4个位置)中,有3个同色的棋子,或者,3个连续的同色棋子,
同时,没有(不同色)棋子阻挡时,就称为(活三),而(活三)可以有多种不同的组合,
接下来,我们结合例子进行学习。
例子1:

在例子1中,我们可以看到(白子A、B、C)在(连续的4个位置)中,
同时,在同一行中(白子A)的左方与右方没有(不同色棋子)的阻挡,
(白子C)的右方也没有(不同色棋子)的阻挡,所以,这种情况就称为(活三)。
例子2:

当前的(例子2)与(例子1)都形成了(活三),只是(白子B)的位置改变了,如果要区分这两种情况,
可以使用(分值计算)进行辨别,因为,它们计算出来的分值是不一样的,而如何进行(分值的计算)
我们将在后面的章节中再为大家详细介绍。
例子3:

当前的(例子3)是3个白子相连,当AI程序(判断出)以上3种情况之一时,就需要进行防守落子,
(例子1与例子2)的防守位置比较好判断,(例子1)的防守位置就在(白子A与白子B)之间,
而(例子2)的防守位置在(白子B与白子C)之间。
但是,(例子3)的情况,在防守时可以有两个选择,要么在(白子A)的左方落子防守,
要么,在(白子C)的右方落子防守,具体选择哪个位置落子更好,就需要AI程序作进一步的分析,
而这些内容将会在后面的章节中再为大家详细介绍。
4、防守判断(冲四威胁)
什么是五子棋中的冲四?
(冲四)就是在某个方向(形成)4个同色相连的棋子,并且,只有一个位置可以(形成)五子相连的情况,
就称为(冲四)。
例子1:

在例子1中,我们可以看到(白子A、B、C、D)形成4个同色相连的情况,同时,(白子A)的左方被(黑子)
阻挡,并且只有在(白子A与B)之间落子,才可以形成五子相连,所以,这种情况就称为(冲四)。
例子2:

在例子2中,我们可以看到3种不同的情况,白子都形成了(冲四),那么,只要对不同的情况进行分值的计算,
AI程序就可以把它们区分形来,进行落子防守的判断。
目前,我们已经初步了解到一个AI五子棋是如何进行(棋子的描述、棋盘的标记、棋子的查找),
以及,什么是活三与冲四的防守判断,那么,在后面的章节中,我们会继续为大家介绍什么是分值的定义与计算
等的内容,从而,让大家一步一步地掌握到如何去开发一个人工智能的五子棋程序。
|