Code:
Private Sub AIsTurn()
Dim Omatrix As Long, Xmatrix As Long, x As Integer, y As Integer
Dim i As Integer, j As Long, index As Integer, tmp As Long
Dim Xs() As Long, Os() As Long, newI As Integer
Const Cx = 0
Const Cy = 1
Const max = 2
Const bits = 3
Const bmask = 4
Const HighBit = 2 ^ 24
ReDim Os(0 To 4, 0 To 0)
ReDim Xs(0 To 4, 0 To 0)
For x = 0 To 14
For y = 0 To 14
'build matrices
Omatrix = 0
Xmatrix = 0
For i = 0 To 4
For j = 0 To 4
index = (y + j) * 19 + (x + i)
Omatrix = Omatrix * 2 + IIf(Label1(index) = "O", 1, 0)
Xmatrix = Xmatrix * 2 + IIf(Label1(index) = "X", 1, 0)
Next
Next
' check for winnable combos
For i = 0 To 11
If (Omatrix And mask(i)) > 0 And (Xmatrix And mask(i)) = 0 Then
newI = UBound(Os, 2) + 1
ReDim Preserve Os(0 To 4, 0 To newI)
Os(Cx, newI) = x: Os(Cy, newI) = y
Os(bits, newI) = Omatrix And mask(i) Xor mask(i)
Os(bmask, newI) = mask(i)
j = Os(bits, newI)
Os(max, newI) = 0
Do While j > 0
Os(max, newI) = Os(max, newI) + (j And 1)
j = Int(j / 2)
Loop
End If
If (Xmatrix And mask(i)) > 0 And (Omatrix And mask(i)) = 0 Then
newI = UBound(Xs, 2) + 1
ReDim Preserve Xs(0 To 4, 0 To newI)
Xs(Cx, newI) = x: Xs(Cy, newI) = y
Xs(bits, newI) = Xmatrix And mask(i) Xor mask(i)
Xs(bmask, newI) = mask(i)
j = Xs(bits, newI)
Xs(max, newI) = 0
Do While j > 0
Xs(max, newI) = Xs(max, newI) + (j And 1)
j = Int(j / 2)
Loop
End If
Next
Next
Next
'sort X's
i = LBound(Xs, 2)
While i < (UBound(Xs, 2) + 1)
If i = LBound(Xs, 2) Then
i = i + 1
ElseIf Xs(max, i - 1) <= Xs(max, i) Then
i = i + 1
Else
tmp = Xs(max, i): Xs(max, i) = Xs(max, i - 1): Xs(max, i - 1) = tmp
tmp = Xs(Cx, i): Xs(Cx, i) = Xs(Cx, i - 1): Xs(Cx, i - 1) = tmp
tmp = Xs(Cy, i): Xs(Cy, i) = Xs(Cy, i - 1): Xs(Cy, i - 1) = tmp
tmp = Xs(bits, i): Xs(bits, i) = Xs(bits, i - 1): Xs(bits, i - 1) = tmp
tmp = Xs(bmask, i): Xs(bmask, i) = Xs(bmask, i - 1): Xs(bmask, i - 1) = tmp
i = i - 1
End If
Wend
'sort Os
i = LBound(Os, 2)
While i < (UBound(Os, 2) + 1)
If i = LBound(Os, 2) Then
i = i + 1
ElseIf Os(max, i - 1) <= Os(max, i) Then
i = i + 1
Else
tmp = Os(max, i): Os(max, i) = Os(max, i - 1): Os(max, i - 1) = tmp
tmp = Os(Cx, i): Os(Cx, i) = Os(Cx, i - 1): Os(Cx, i - 1) = tmp
tmp = Os(Cy, i): Os(Cy, i) = Os(Cy, i - 1): Os(Cy, i - 1) = tmp
tmp = Os(bits, i): Os(bits, i) = Os(bits, i - 1): Os(bits, i - 1) = tmp
tmp = Os(bmask, i): Os(bmask, i) = Os(bmask, i - 1): Os(bmask, i - 1) = tmp
i = i - 1
End If
Wend
'set O Defensive
Dim bitGroup(0 To 4) As Long
i = 0
x = 0
tmp = HighBit
'construct bit image
Do While tmp
If (Xs(bmask, 1) And tmp) > 0 Then
If (Xs(bits, 1) And tmp) > 0 Then
bitGroup(i) = x + 1 '
i = i + 1
Else
bitGroup(i) = -(x + 1)
i = i + 1
End If
End If
x = x + 1
tmp = Int(tmp / 2)
Loop
'check for adjacency
For i = 0 To 3
If (Sgn(bitGroup(i)) <> Sgn(bitGroup(i + 1))) Then
If bitGroup(i) > 0 Then
x = bitGroup(i) - 1
Else
x = bitGroup(i + 1) - 1
End If
End If
Next
y = (Xs(Cy, 1) + (x Mod 5)) * 19 + (Xs(Cx, 1) + Int(x / 5))
Label1_Click y
End Sub