提供VB 破解 “猜数字游戏”的原程序算法, 请进!
Option Explicit
Const Arrmax = 5039
Private gArr() As Long
Private currArr_Len As Long '当前的数组长度
Private Sub Form_Load()
Dim i As Long
For i = 0 To 3
cboA.AddItem i
cboB.AddItem i
Next
Me.Show
Call Arr_inti
End Sub
Private Sub Arr_inti() '获得5040个可能结果
Dim i, Counter As Long
ReDim gArr(0)
ReDim gArr(Arrmax)
Counter = 0
currArr_Len = Arrmax
For i = 0 To 9999
If Avild(i) Then
gArr(i - Counter) = i
Else
Counter = Counter + 1
End If
Next
lstHistory.Clear
cboLast.Clear
txtInput.Text = ""
End Sub
Private Sub cmdAnswer_Click() '计算 剩余多少个可能的结果
Dim i, j As Long
Dim Counter As Long '统计不符合的数
If Avild2() = False Then Exit Sub
Counter = 0
'计算
For i = 0 To currArr_Len
If bComp(gArr(i), Val(txtInput.Text), Val(cboA.Text), Val(cboB.Text)) Then
gArr(i - Counter) = gArr(i) '移动数组
Else
Counter = Counter + 1
End If
Next
'预览结果
currArr_Len = currArr_Len - Counter
lstHistory.AddItem " " & txtInput & " " & cboA & "A " & cboB & "B " & currArr_Len + 1
cboLast.Clear
For i = 0 To currArr_Len
If gArr(i) < 1000 Then
cboLast.AddItem "0" & Trim(Str(gArr(i)))
Else
cboLast.AddItem Trim(Str(gArr(i)))
End If
Next
End Sub
'比较两个数是否符合 m_A , m_B ;符合 TRUE
Private Function bComp(num1 As Long, num2 As Long, m_A As Long, m_B As Long) As Boolean
Dim Lab1(3), Lab2(3) As Long '输入数组再比较
Dim counterA, counterB As Long
Dim i, j, t As Long
counterA = 0
counterB = 0
bComp = False
Lab1(3) = (num1 + 10000) Mod 10
Lab1(2) = (num1 + 10000) \ 10 Mod 10
Lab1(1) = (num1 + 10000) \ 100 Mod 10
Lab1(0) = (num1 + 10000) \ 1000 Mod 10
Lab2(3) = (num2 + 10000) Mod 10
Lab2(2) = (num2 + 10000) \ 10 Mod 10
Lab2(1) = (num2 + 10000) \ 100 Mod 10
Lab2(0) = (num2 + 10000) \ 1000 Mod 10
'以下两个for 本来可以放在一起的 为了优化分开来做,并加入了 退出判断
For i = 0 To 3
If Lab1(i) = Lab2(i) Then counterA = counterA + 1
For j = 0 To 3
If i <> j And Lab1(i) = Lab2(j) Then counterB = counterB + 1
Next
Next
If counterA = m_A And counterB = m_B Then bComp = True
End Function
Private Function Avild(ByVal Num As Long) As Boolean '没有重复数 True .否则 False 例:Avild(1223) = false
Dim i, j As Long
Dim Lab(3) As Long
Avild = True
Lab(3) = (Num + 10000) Mod 10
Lab(2) = (Num + 10000) \ 10 Mod 10
Lab(1) = (Num + 10000) \ 100 Mod 10
Lab(0) = (Num + 10000) \ 1000 Mod 10
For i = 0 To 3
For j = i + 1 To 3
If Lab(i) = Lab(j) Then
Avild = False
Exit For
End If
Next
Next
End Function
Private Function Avild2() As Boolean '判断数字的输入
End Function