好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

14页
  • 卖家[上传人]:壹****1
  • 文档编号:473665225
  • 上传时间:2023-12-29
  • 文档格式:DOC
  • 文档大小:252KB
  • / 14 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 5.2 五子棋人工智能权重估值算法一、五子棋介绍五子棋是中国古代的传统黑白棋种之一现代五子棋日文称之为“連珠”, 英译为“ 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 为玩家 2Public Piecet() As Integer ' 用于估值函数使用的临时数组Public GameOrNot As Boolean ' 是否游戏中Public Flag As Byte ' 行棋变量,表示该谁下棋,数值与棋子变量相同Public PieceRec() As Integer ' 定义棋步记录变量以记录所走棋步Public AIOrNot As Boolean ' 是否人机对战模式,人机对战则为 TruePublic 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 '' 定义空个数记录变量数组 定义棋子个数记录数组 定义得分数组 定义得分记录空间变量 是否玩家先行注:以上声明均在模块中进行。

      三、算法概述为了实现电脑行棋的人工智能化,需要实现对棋局面分析与估值的人工智能 化即实现对一定棋局的数值化反馈首先应有一个函数来判断某一条直线上的 棋形根据单线棋形的不同,可将不同的单线棋形分为五字连线、活四、成四、 活三等情况,再将反馈值交由一个局面评估函数进行量化处理, 即得相应局面某点的评估分数的数值化表示但进行量化处理的过程中需注意:每种棋形的得分 值是唯一的,即程序头所确定的特殊棋形得分与所计算的不同棋形得分间不应存 在交集最后有一个取最优走法函数根据得分最高值取得相应的最佳走法 在算法实现的过程中有一定的近似计算,即只需判断两个方向上的单线棋形即可 这 是科学的,因为多元(受棋子数、端堵情况、空子数三个变量制约)估值函数接近实际值的必要而不充分条件为(自变量 为相应棋形的棋子数),且由于三线共线棋形成立的条件为单线或双线棋形,其得分上也存在相 应的继承性;故其与特殊棋形与计算分值间存在分值的量级差相一致事实也证 明,这样做明显提高了程序的执行效率棋步处理流程如图1所示:图1 棋步处理流程图四、程序首先建立基本界面分别建立一个窗体和模块,并将窗体调整为合适长宽VB中提供了强大的面向对象的设计功能,但为了提高程序模块化程度,所有关 键变量均使用形参的形式传递。

      参数为实现画棋盘操作的窗体类 在模块中输入 画棋盘函数:Public Function Drawpad(ByRef FormTar As Form) ' 用画直线命令画棋盘 Dim i%: FormTar.DrawWidth = 3: FormTar.FillStyle = 1FormTar.Line (17, 16)-(20 + 30 * 14 + 3, 20 + 30 * 14 + 4), , B:FormTar.DrawWidth = 1: FormTar.FillStyle = 0For i = 0 To 14FormTar.Line (20, 30 * i + 20)-(20 + 30 * 14, 30 * i + 20)FormTar.Line (20 + i * 30, 20)-(20 + 30 * i, 20 + 14 * 30) Next iEnd Function 以下是画棋子函数首参为欲实现画棋子操作的窗体类,第二个参数为欲画 棋子在棋盘上的水平坐标, 第三参数为欲画棋子在棋盘上竖直方向的纵坐标, 第 四参数为代表玩家信息的身份变量Public Function DrawPiece(ByRef FormTar As Form, ByVal XHorizontal%,ByVal YVertical%, ByVal Flag As Byte)' 在画好棋盘的窗体上画棋子, 参数 Flag 表示玩家的情况, 数值与棋子的表示相 同If Flag = 1 ThenFormTar.FillColor = RGB(0, 0, 0) FormTar.Circle (20 + (XHorizontal - 1) * 30, 20 + (YVertical -1) * 30), 13, RGB(255, 255, 255)ElseIf Flag = 2 ThenFormTar.FillColor = RGB(255, 255, 255)FormTar.Circle (20 + (XHorizontal - 1) * 30, 20 + (YVertical -1) * 30), 13, RGB(0, 0, 0)End IfEnd Function 除了棋盘界面的画棋子函数,需要实现棋局数组在棋盘上的动态显示;可利 用两个函数访问保存棋局信息的数组, 并调用画棋盘与画棋子函数来动态更新棋 盘之显示。

      以下即为实现动态变更棋子数组的落子函数:Public Function LayPiece(ByRef Piece() As Integer, ByVal XInt%, ByValYInt%, ByVal Flag As Byte) ' 落子Piece(XInt, YInt) = Flag: X = XInt: Y = YInt: CountNum = CountNum +1 PieceRec(SearchNode(PieceRec) + 1) = (YInt - 1) * 15 + XInt ' 扩大记步数组变量范围以保存本步If JudgeWinner(Piece, XInt, YInt, Flag) = True Then MsgBox IIf(Flag= 1, " 黑棋 ", " 白棋 ") & " 获胜! ", vbExclamation + vbOKOnly: GameOrNot = False ' 调用判断赢家函数判断胜负If CountNum = 220 Then MsgBox " 和棋 ", vbOKOnly + vbExclamation End Function数据能够实时更新后,又有了画棋子与画棋盘函数的支持;以下即为在前面 几个函数基础之上的棋盘数据实时更新函数:Public Function PadRefresh(ByRef FormTar As Form, ByRef Piece() AsInteger) ' 棋盘恢复函数FormTar.ClsDrawpad FormTarDim i%, j%For i = 1 To 15For j = 1 To 15If Piece(i, j) <> 0 Then DrawPiece FormTar, i, j, Piece(i,j)' 如果该位置非空子,则画棋子Next jNext iEnd Function 在单线棋形判断函数基础之上的玩家胜负判断函数:Public Function JudgeWinner(ByRef Piece() As Integer, ByVal XInt%, ByValYInt%, ByVal Flag As Byte) As Boolean ' 棋局胜负判断函数X = XInt: Y = YIntIf JudgeNum(Piece, 1, 0, Flag) >= 5 Or JudgeNum(Piece, 1, 1, Flag) >=5 Or JudgeNum(Piece, 0, 1, Flag) >= 5 Or JudgeNum(Piece, -1, 1, Flag) >=5 Then _JudgeWinner = True: Exit Function ' 判断标记为 Flag 的玩家是否已胜利JudgeWinner = FalseEnd Function 本程序为了实现动态判断是否有棋可悔,悔棋存储数组逻辑实质为堆栈结构;VB中未提供现成的Stack类,需要以下函数来完成对数组栈顶的搜索工作。

      Public Function SearchNode(ByRef PieceRec() As Integer) As Integer' 寻找棋步记录数组中的最大定义值Dim i%For i = 225 To 1 Step -1If PieceRec(i) <> 0 Then Exit ForNext iSearchNode = iEnd FunctionPublic Function GetNode(ByRef PieceTar() As Integer, ByRef XTar%, ByRefYTar%, ByVal Xt%, ByVal Yt%, ByVal XInt%, ByVal YInt%, ByVal Flag As Byte) ' 本函数用来返回一条直线上的结点,承载变量为 XTar, YTar; XInt 和 YInt 为 方向判断变量;注:本函数的待测坐标若为非空值则返回待测点坐标Dim i%, j%i = Xt: j = YtDoi = i + XInt: j = j + YIntIf PieceTar(i , j) <> Fla。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.