五子棋人工智能权重估值算法

五子棋人工智能权重估值算法

一、五子棋介绍

五子棋是中国古代的传统黑白棋种之一。现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。黑白双方依次落子,任一方先在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个(含五个以上)棋子的一方为胜。这种规则适合初学的五子棋爱好者。因为这种规则下黑棋胜算较大。甚至已经有人证明在黑白双方都不出现错误的情况下,黑棋可以必胜。所以一般要求连续玩两盘,即任一方执黑,执白各一次。

二、逻辑变量与常量

逻辑变量与常量的分析如下:

Public Const Five As Integer = 3000 '五子连线得分

Public Const FFDL As Integer = 2900 '双活四得分

Public Const FFSL As Integer = 2800 '活四成四得分

Public Const FTDL As Integer = 2700 '活四活三得分

Public Const FL As Integer = 2600 '单活四得分

Public Const FFNL As Integer = 2500 '双成四得分

Public Const FTSL As Integer = 2400 '成四活三得分

Public Const TTDL As Integer = 2300 '双活三得分

Public X%, Y% '水平与垂直坐标

Public Xt%, Yt% '临时横纵坐标

Public CountNum% '棋步总数记录变量

Public Piece() As Integer ' 0表示空闲,1为玩家1,2为玩家2

Public Piecet() As Integer '用于估值函数使用的临时数组

Public GameOrNot As Boolean '是否游戏中

Public Flag As Byte '行棋变量,表示该谁下棋,数值与棋子变量相同Public PieceRec() As Integer '定义棋步记录变量以记录所走棋步

Public AIOrNot As Boolean '是否人机对战模式,人机对战则为True

Public LBlock(4) As Boolean, RBlock(4) As Boolean '左堵右堵记录变量数组

Public EmptyNumE(4) As Byte '定义空个数记录变量数组

Public PieceNum(4) As Byte '定义棋子个数记录数组

Public ScoreE(4) As Integer '定义得分数组

Public ScoreS As Integer '定义得分记录空间变量

Public FirstMove As Boolean '是否玩家先行

注:以上声明均在模块中进行。

三、算法概述

为了实现电脑行棋的人工智能化,需要实现对棋局面分析与估值的人工智能化。即实现对一定棋局的数值化反馈。首先应有一个函数来判断某一条直线上的棋形。根据单线棋形的不同,可将不同的单线棋形分为五字连线、活四、成四、活三等情况,再将反馈值交由一个局面评估函数进行量化处理,即得相应局面某点的评估分数的数值化表示。但进行量化处理的过程中需注意:每种棋形的得分值是唯一的,即程序头所确定的特殊棋形得分与所计算的不同棋形得分间不应存在交集。最后有一个取最优走法函数根据得分最高值取得相应的最佳走法。在算法实现的过程中有一定的近似计算,即只需判断两个方向上的单线棋形即可。这

是科学的,因为多元(受棋子数、端堵情况、空子数三个变量制约)估值函数

接近实际值的必要而不充分条件为(自变量为相应棋形的棋

子数),且由于三线共线棋形成立的条件为单线或双线棋形,其得分上也存在相应的继承性;故其与特殊棋形与计算分值间存在分值的量级差相一致。事实也证明,这样做明显提高了程序的执行效率。

四、程序

首先建立基本界面。分别建立一个窗体和模块,并将窗体调整为合适长宽。VB中提供了强大的面向对象的设计功能,但为了提高程序模块化程度,所有关键变量均使用形参的形式传递。参数为实现画棋盘操作的窗体类。在模块中输入画棋盘函数:

Public Function Drawpad(ByRef FormTar As Form) '用画直线命令画棋盘

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4