Python版五子棋

机器博弈是人工智能领域的一个重要分支,其研究对象多为复杂的象棋博弈。几乎所有被解决的棋局都是因为过去半个世纪机器博弈的发展。计算机解题的优势在于,它可以借助现代计算机的运算速度优势,列举出所有合理的情况来解决难以分析的问题;但游戏问题的复杂性决定了它不能过分依赖机器的计算能力。很多待解或待解的棋类游戏,无论是状态空间的复杂度还是博弈树的复杂度都太大,需要我们加入约束,采用合理的算法进行优化。

五子棋问题是人工智能中的经典问题。当今世界,AlphaGo已经是围棋的领头羊,但是很少有人对五子棋领域感兴趣。基于课堂、文献、博客所学知识,实现了一个基于两种开发语言的智能对战AI五子棋游戏平台。

本文所做的工作如下:

(1)五子棋接口实现;

(2)智能判断棋盘走向;

(3)改进了棋盘扫描方式;

(4)改进了系统评分表的评价方法;

(5)找出最佳途径根据评分表的评价找出最佳途径。

五子棋AI问题最大的问题是如何实现智能博弈,即如何在棋手移动后,解读当前棋盘,并由算法进行分析,从而得到计算机的最佳移动点。其次是一个如何判断胜负的问题,可以看作是判断棋盘形势的子问题,也可以看作是一个单独的问题,但这个问题整体上比较简单,我就不详细解释了。

五子棋的整体知识结构包括以下几个部分:

(1)棋盘态势表示

(2)象棋胜利的判定

(3)象棋知识库

(4)智能游戏过程

对于问题(1),采用数组表示。棋盘中每个交叉点有三种状态,如:0表示空(没有放置棋子),-1表示黑子,1表示白子。数组表示的基本思想是,物理位置用交叉点对应的数组索引值表示,状态(空、黑子、白子)用交叉点对应的元素值表示。设V = {0 0,1,-1},棋盘第I个交叉点的状态Si ∈V,任何棋局都可以表示为一个n ×n二元组。

对于问题(2),在使用数组表示时,如果想知道任意两个元素Si和Sj是否为* * *线,就要通过I和j之间的数值规律来判断,从这个角度来看,数组表示是一种原始且低效的表示方法,但其性能损失对于评分表算法来说是可以接受的。判断一方是否获胜,只需要判断整个棋盘当前落点的纵、横、斜、斜方向最长的四个位置能否连成一条颜色相同的直线。具体操作可以看作:从落点开始,向两个方向延伸。如果遇到相同的颜色,计数器就递增,如果遇到不同的颜色(空白或者不同的颜色),就停止向这个方向延伸。一个计数器记录在这个方向两端的相同颜色的连续片的数量。当四个方向都探索完了,如果四个计数器中有一个达到5,那么就可以判断已经有五球连珠了,游戏结束。

问题(3)象棋知识库主要包括各种已建立的棋盘形式,包括以下几种:

?活动四:有两个连续的五个点(即两个点可以组成五个),图中的白点就是连续的五个点。当霍斯出现时,整个局势无法停止五连冠,霍斯的主人一定会赢。

?冲四:有五点系列,如下三图,都是冲四棋。图中的白点是五个连续的点。相对于活四,冲四的威胁要小很多,因为这个时候你只要在那个独特的五分连跟随防守,冲四就无法形成五分连。

?活三:三个可以组成活四,如下图,代表两种基本的活三棋型。图中的白点是活动的四点。活三棋是最常见的攻击类型,因为活三之后,如果对手不注意,他就能在下一手把活三变成活四,活四毫无防备。所以,在面对第三次生命的时候,我们需要非常谨慎。在没有更好的进攻手段的情况下,必须防守,防止其形成可怕的四棋格局。

?睡三:只能形成三种,如下图,分别代表六种基本的睡三形态。图中的白点代表四个点。相比于主动三,睡三棋型的危险系数要低很多,因为睡三棋型即使不防守,下一手也只能形成冲四,但对于单纯的冲四棋型,可以轻松防守。

?活动2:可以组成活动3的两个,如下图,是活动2象棋的三种基本类型。图中的白点是活动的三点。

?睡两个:两个可以组成睡三个。图中的四是睡二棋最基本的格局。细心且喜欢思考的同学会根据睡三介绍中的图2-13发现睡二与以下四种基本模式不同。图中的白点是三点。

对于上述棋型,我们主要考虑这几个主要进攻棋型的防守和组成:活四、冲四、活三、睡三。整体棋型遵循以下原则:以数为主,考虑在同数下是活还是睡。得分表算法设计整体偏向防守。

对于问题(4),在评估和分析棋型时,算法严格遵循以下流程:

当人类一方丢下一个孩子,算法就开始扫描整个世界,得到人类棋子的集合和计算机棋子的集合。全局扫描后,对当前情况进行排序和计算。每组中每个空白点的位置根据围绕该点的四个方向上相同颜色的连续棋子的数量来评分。根据这些最终得分,得出最大值。得到人端和计算机端的两个最大值后,对比一下。如果人方的情况较好(得分较高),则算法将下一个落地位置设置为人方得分最高的点,并尝试降低人方的下一个得分。如果电脑端的分数高,那么你可以直接把它掉在分数最高的点上。

在本次课程设计中,* * *设计了两个版本,一个是Java版本,是19X19的棋盘,配有简单的消息提示,基于AWT的GUI,开发工具IntelliJ IDEA 2018.1。

另一个版本是用Python设计的,核心算法一样,但是受图像源文件的限制。是一个15X15的棋盘,GUI是基于pygame实现的。开发工具是Jetrains py charm 2065 438+08 . 2 . 4x 64。

因为近期时间比较短,所以选择了一个比较简单的五子棋问题来设计人工智能的课程。在这次课程设计中,我的编码能力、调试能力、算法解释能力、函数优化能力都有了很大的进步。在这个设计过程中,也有几个问题,简述如下:

(1)对棋盘形势判断不足,因为单纯判断当前棋盘形势,基本相当于一个五子棋玩家对规则一知半解,没有天赋。如果对手小心翼翼,熟练各种布局策略,那么基本算法就会养成习惯,容易被人盯上,对方案起不到很好的作用;

(2)判断棋形时,边界的计分算法与中心区域的计分算法一致,不能有效提前识别边界,降低边界空白点的权重;

(3)用户图形界面需要改进。此外,还可以增加PK模式、颜色选择、棋盘大小选择功能。

以后可以试着对比一下博弈树算法和现在的算法。计分表算法为了快速得到最佳落点,牺牲了更高的精度;而博弈树可以通过提前进行全局预测,对人类一方进行更全面的追击和拦截。

此外,课堂上学到的知识,如BFS、DFS、A*算法、决策树算法等,都可以应用到五子棋的智能决策中。

《人工智能》这门课让我对图形学、知识表示、智能决策等方面有了更好的理解和体会。课堂设计内容丰富有趣,让我受益匪浅。希望以后能在这方面更深入,把课堂上学到的东西运用到实践中去。