巧算24点 的游戏内容如下:一副牌中抽去大小王剩下52张,(如果初练也可只用1~10这40张牌)任意抽取4张牌(称牌组),用加、减、乘、除(可加括号)把牌面上的数算成24.每张牌必须用一次且只能用一次,如抽出的牌是3、8、8、9,那么算式为(9—8)×8×3或3×8+(9—8)或(9—8÷8)×3等. “算24点”作为一种扑克牌智力游戏,还应注意计算中的技巧问题.计算时,我们不可能把牌面上的4个数的不同组合形式——去试,更不能瞎碰乱凑.
Private Sub Command1_Click()
If TxtNum1.Text = "" Then MsgBox "请输入数字!", vbExclamation + vbOKOnly Else If (Val(TxtNum1.Text) < 1) Or (Val(TxtNum1.Text) >= 10) Then MsgBox "请输入一个1-10的数!", vbExclamation + vbOKOnly Else Num(1) = Val(TxtNum1.Text) End If End If If TxtNum2.Text = "" Then MsgBox "请输入数字!", vbExclamation + vbOKOnly Else If (Val(TxtNum2.Text) < 1) Or (Val(TxtNum2.Text) >= 10) Then MsgBox "请输入一个1-10的数!", vbExclamation + vbOKOnly Else Num(2) = Val(TxtNum2.Text) End If End If If TxtNum3.Text = "" Then MsgBox "请输入数字!", vbExclamation + vbOKOnly Else If (Val(TxtNum3.Text) < 1) Or (Val(TxtNum3.Text) >= 10) Then MsgBox "请输入一个1-10的数!", vbExclamation + vbOKOnly Else Num(3) = Val(TxtNum3.Text) End If End If If TxtNum4.Text = "" Then MsgBox "请输入数字!", vbExclamation + vbOKOnly Else If (Val(TxtNum4.Text) < 1) Or (Val(TxtNum4.Text) >= 10) Then MsgBox "请输入一个1-10的数!", vbExclamation + vbOKOnly Else Num(4) = Val(TxtNum4.Text) End If End If a = OperatorModule.Operator() If Not (OperateorString1 = "") Then Print OperateorString1 End If If Not (OperateorString2 = "") Then Print OperateorString2 End If If Not (OperateorString3 = "") Then Print OperateorString3 End If If Not (OperateorString4 = "") Then Print OperateorString4 End If If Not (OperateorString5 = "") Then Print OperateorString5 End If End Sub
------------------------------------------- '模块OperatorModule
Public Num(4) As Single '定义数组,存储输入的数字
Public OperateorString1 As String '运算表达式 Public OperateorString2 As String Public OperateorString3 As String Public OperateorString4 As String Public OperateorString5 As String
Function Operator() As Integer
Dim a As Integer '定义数字数组下彪,用来产生数字组合 Dim b As Integer Dim c As Integer Dim d As Integer Dim op1 As Integer '定义运算付数组下标,用来产生运算符组合 Dim op2 As Integer Dim op3 As Integer
Dim answer1 As Single '存储运算结果 Dim answer2 As Single Dim answer3 As Single
Dim BracketLeft1 As String, BracketRight1 As String, BracketLeft2 As String, BracketRight2 As String '括号,分别表示为:第一个左括号,第一个右括号,第二个左括号,第二个右括号
For a = 1 To 4 '产生4个数字的组合,一共有4!=24种组合 For b = 1 To 4 If b <> a Then For c = 1 To 4 If (c <> a) And (c <> b) Then For d = 1 To 4 If (d <> a) And (d <> b) And (d <> c) Then For op1 = 1 To 4 '运算符排序 共有4*4*4=64种 For op2 = 1 To 4 For op3 = 1 To 4
If caculate(Num(a), Num(b), op1, answer1) And caculate(answer1, Num(c), op2, answer2) And caculate(answer2, Num(d), op3, answer3) Then If answer3 = 24 Then '如果结果为24,则产生运算表达式 '先将四个括号都清空 BracketLeft1 = "" BracketRight1 = "" BracketLeft2 = "" BracketRight2 = "" '如果第一个运算符为+或- 且第二个运算为 *或/ 那么第二个括号不能少 If (operate(op1) = "+" Or operate(op1) = "-") And (operate(op2) = "*" Or operate(op2) = "/") Then BracketLeft2 = "(" BracketRight2 = ")" End If '如果第二个运算符为+或- 且第三个运算为 *或/ 那么第一个括号不能少 If (operate(op2) = "+" Or operate(op2) = "-") And (operate(op3) = "*" Or operate(op3) = "/") Then BracketLeft1 = "(" BracketRight1 = ")" End If
OperateorString1 = BracketLeft1 + BracketLeft2 + Trim(Str$(Num(a))) + Trim(operate(op1)) + Trim(Str$(Num(b))) + BracketRight2 + Trim(operate(op2)) + Trim(Str$(Num(c))) + BracketRight1 + Trim(operate(op3)) + Trim(Str$(Num(d))) '返回((x@y)@z)@w 格式的表达式,但此时这两个括号未必都还在 Operator = answer3 End If End If
If caculate(Num(a), Num(b), op1, answer1) And caculate(Num(c), Num(d), op3, answer2) And caculate(answer1, answer2, op2, answer3) Then If answer3 = 24 Then BracketLeft1 = "" BracketRight1 = "" BracketLeft2 = "" BracketRight2 = "" If (operate(op1) = "+" Or operate(op1) = "-") And (operate(op2) = "*" Or operate(op2) = "/") Then BracketLeft1 = "(" BracketRight1 = ")" End If If (operate(op3) = "+" Or operate(op3) = "-") And (operate(op2) = "*" Or operate(op2) = "/") Then BracketLeft2 = "(" BracketRight2 = ")" End If If (operate(op2) = "-") And (operate(op3) = "+" Or operate(op3) = "-") Then BracketLeft2 = "(" BracketRight2 = ")" End If
OperateorString2 = BracketLeft1 + Trim(Str$(Num(a))) + Trim(operate(op1)) + Trim(Str$(Num(b))) + BracketRight1 + Trim(operate(op2)) + BracketLeft2 + Trim(Str$(Num(c))) + Trim(operate(op3)) + Trim(Str$(Num(d))) + BracketRight2 '返回表达式 Operator = answer3 End If End If
If caculate(Num(b), Num(c), op2, answer1) And caculate(Num(a), answer1, op1, answer2) And caculate(answer2, Num(d), op3, answer3) Then If answer3 = 24 Then BracketLeft1 = "" BracketRight1 = "" BracketLeft2 = "" BracketRight2 = "" If (operate(op1) = "/") Or (operate(op1) = "*" And (operate(op2) = "+" Or operate(op2) = "-")) Then BracketLeft2 = "(" BracketRight2 = ")" End If
If (operate(op1) = "-") And (operate(op2) = "+" Or operate(op2) = "-") Then BracketLeft2 = "(" BracketRight2 = ")" End If
If (operate(op1) = "+" Or operate(op1) = "-") And (operate(op3) = "*" Or operate(op3) = "/") Then BracketLeft1 = "(" BracketRight1 = ")" End If
OperateorString5 = BracketLeft1 + Trim(Str$(Num(a))) + Trim(operate(op1)) + BracketLeft2 + Trim(Str$(Num(b))) + Trim(operate(op2)) + Trim(Str$(Num(c))) + BracketRight2 + BracketRight1 + Trim(operate(op3)) + Trim(Str$(Num(d))) Operator = answer3 End If End If
If caculate(Num(b), Num(c), op2, answer1) And caculate(answer1, Num(d), op3, answer2) And caculate(Num(a), answer2, op1, answer3) Then If answer3 = 24 Then BracketLeft1 = "" BracketRight1 = "" BracketLeft2 = "" BracketRight2 = "" If (operate(op2) = "+" Or operate(op2) = "-") And (operate(op3) = "*" Or operate(op3) = "/") Then BracketLeft2 = "(" BracketRight2 = ")" End If If (operate(op1) = "/") Or (operate(op1) = "*" And (operate(op3) = "+" Or operate(op3) = "-")) Then BracketLeft1 = "(" BracketRight1 = ")" End If If (operate(op1) = "-") And (operate(op3) = "+" Or operate(op3) = "-") Then BracketLeft2 = "(" BracketRight2 = ")" End If
OperateorString3 = Trim(Str$(Num(a))) + Trim(operate(op1)) + BracketLeft1 + BracketLeft2 + Trim(Str$(Num(b))) + Trim(operate(op2)) + Trim(Str$(Num(c))) + BracketRight2 + Trim(operate(op3)) + Trim(Str$(Num(d))) + BracketRight1 Operator = answer3 End If End If
If caculate(Num(c), Num(d), op3, answer1) And caculate(Num(b), answer1, op2, answer2) And caculate(Num(a), answer2, op1, answer3) Then If answer3 = 24 Then BracketLeft1 = "" BracketRight1 = "" BracketLeft2 = "" BracketRight2 = "" If (operate(op1) = "/") Or (operate(op1) = "*" And (operate(op2) = "+" Or operate(op2) = "-")) Then BracketLeft1 = "(" BracketRight1 = ")" End If
If (operate(op1) = "-") And (operate(op2) <> "*" Or operate(op2) <> "/") Then BracketLeft1 = "(" BracketRight1 = ")" End If &nbs, p; If (operate(op2) = "/") Or (operate(op2) = "*" And (operate(op3) = "+" Or operate(op3) = "-")) Then BracketLeft2 = "(" BracketRight2 = ")" End If
If (operate(op2) = "-") And (operate(op3) = "+" Or operate(op3) = "-") Then BracketLeft2 = "(" BracketRight2 = ")" End If OperateorString4 = Trim(Str$(Num(a))) + Trim(operate(op1)) + BracketLeft1 + Trim(Str$(Num(b))) + Trim(operate(op2)) + BracketLeft2 + Trim(Str$(Num(c))) + Trim(operate(op3)) + Trim(Str$(Num(d))) + BracketRight2 + BracketRight1 Operator = answer3 End If End If
Next op3 Next op2 Next op1 End If Next d End If Next c End If Next b Next a Operator = answer3 End Function '计算结果 Function caculate(X As Single, Y As Single, Operator As Integer, answer As Single) As Boolean Select Case Operator Case 1 On Error GoTo ErrDoing answer = X + Y Case 2 On Error GoTo ErrDoing answer = X - Y Case 3 On Error GoTo ErrDoing answer = X * Y Case 4 On Error GoTo ErrDoing If Y = 0 Then '被除数不能为0 caculate = False Exit Function Else answer = X / Y End If End Select ErrDoing: If Err.Number = 6 Then caculate = False End If caculate = True End Function '返回运算符 Function operate(op As Integer) As String Select Case op Case 1 operate = "+" Case 2 operate = "-" Case 3 operate = "*" Case 4 operate = "/" End Select End Function
至少要成为本站的注册会员才能下载! 注册点我!
|