为了在窗体棋盘上某一点恰当地估值,需要分析在该点处的落子前后棋形之差异。而棋形判断函数又分为单线和多线两类,多线以单线为基础,再利用数组排序选出最高的两值作为多线棋形判断依据。单线棋形制约因素主要有三个:棋子数、端堵情况和空子数。实现的核心代码如下:
Public Function JudgeLineNum(ByRef PieceTar() As Integer, ByVal Xt%, ByVal Yt%, ByVal XInt%, ByVal YInt%, ByVal ArrNum As Byte, ByVal Flag As Byte) As Byte
'单线棋形判断函数,用来判断棋形并计算相应分值;参数ArrNum代表的是储存方向情况与得分情况的数组成员序号,定义为1为(1,0),2为(1,1),3为(0,1),4为(-1,1);实现算法的关键是基础的单线棋形的判断与反馈
Dim ExitFor As Boolean, LB As Boolean, RB As Boolean, PieceNum%, EmptyNum%, i%, Xtmp%, Ytmp%, Count%, Score%, Value%
Xtmp = Xt: Ytmp = Yt: PieceNum = 1: EmptyNum = 0: Count = 0 '初始时棋子个数为1
For i = 1 To 4 '计算第一个方向
ExitFor = True '循环开始处初始化跳出记录变量为真
Count = Count + 1
Xt = Xtmp - i * XInt: Yt = Ytmp - i * YInt
If Xt < 1 Or Xt > 15 Or Yt < 1 Or Yt > 15 Then LB = True: Exit For
'如果减去递增变量后坐标出界,则左堵为真
If PieceTar(Xt, Yt) = Flag Then PieceNum = PieceNum + 1
'若下一位置处棋子类型相同,则将相同棋子记录变量加1
If PieceTar(Xt, Yt) = IIf(Flag = 1, 2, 1) Then LB = True: Exit For
'该位置处棋子类型相反,则左堵为真
If PieceTar(Xt, Yt) = 0 Then
Xt = Xt - XInt: Yt = Yt - YInt '若该位置处为空格,则进一步判断下一个位置
If Xt < 1 Or Xt > 15 Or Yt < 1 Or Yt > 15 Then LB = False: Exit For
'若下一个位置出界,则左堵为假
If PieceTar(Xt, Yt) = 0 Then LB = False: Exit For
'若下一个位置仍为空格,则左堵为假
If PieceTar(Xt, Yt) = Flag Then EmptyNum = EmptyNum + 1
'若空后位置处与目标棋子类型相同,则将空格数加1
If PieceTar(Xt, Yt) = IIf(Flag = 1, 2, 1) Then LB = False: Exit For
'若空位置后为相反棋子类型则左堵亦为假
End If
ExitFor = False
Next i
If ExitFor = False Then
Xt = Xt - XInt: Yt = Yt - YInt
If Xt < 1 Or Xt > 15 Or Yt < 1 Or Yt > 15 Then
LB = True '若最后一子后一位置出界,则左堵为真
ElseIf PieceTar(Xt, Yt) = 0 Then LB = False
ElseIf PieceTar(Xt, Yt) = IIf(Flag = 1, 2, 1) Then LB = True
End If
Else: Count = Count - 1 '提前跳出循环的情况下,在(XInt,YInt)方向上最多只能有(Count-1)个子
End If
|