三、算法概述
为了实现电脑行棋的人工智能化,需要实现对棋局面分析与估值的人工智能化。即实现对一定棋局的数值化反馈。首先应有一个函数来判断某一条直线上的棋形。根据单线棋形的不同,可将不同的单线棋形分为五字连线、活四、成四、活三等情况,再将反馈值交由一个局面评估函数进行量化处理,即得相应局面某点的评估分数的数值化表示。但进行量化处理的过程中需注意:每种棋形的得分值是唯一的,即程序头所确定的特殊棋形得分与所计算的不同棋形得分间不应存在交集。最后有一个取最优走法函数根据得分最高值取得相应的最佳走法。在算法实现的过程中有一定的近似计算,即只需判断两个方向上的单线棋形即可。这是科学的,因为多元(受棋子数、端堵情况、空子数三个变量制约)估值函数 接近实际值的必要而不充分条件为(自变量 为相应棋形的棋子数),且由于三线共线棋形成立的条件为单线或双线棋形,其得分上也存在相应的继承性;故其与特殊棋形与计算分值间存在分值的量级差相一致。事实也证明,这样做明显提高了程序的执行效率。棋步处理流程如图1所示:
图1 棋步处理流程图
四、程序
首先建立基本界面。分别建立一个窗体和模块,并将窗体调整为合适长宽。VB中提供了强大的面向对象的设计功能,但为了提高程序模块化程度,所有关键变量均使用形参的形式传递。参数为实现画棋盘操作的窗体类。在模块中输入画棋盘函数:
Public Function Drawpad(ByRef FormTar As Form) '用画直线命令画棋盘
Dim i%: FormTar.DrawWidth = 3: FormTar.FillStyle = 1
FormTar.Line (17, 16)-(20 + 30 * 14 + 3, 20 + 30 * 14 + 4), , B: FormTar.DrawWidth = 1: FormTar.FillStyle = 0
For i = 0 To 14
FormTar.Line (20, 30 * i + 20)-(20 + 30 * 14, 30 * i + 20)
FormTar.Line (20 + i * 30, 20)-(20 + 30 * i, 20 + 14 * 30)
Next i
End Function
以下是画棋子函数。首参为欲实现画棋子操作的窗体类,第二个参数为欲画棋子在棋盘上的水平坐标,第三参数为欲画棋子在棋盘上竖直方向的纵坐标,第四参数为代表玩家信息的身份变量。
|