ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 自制的24点游戏

自制的24点游戏

作者:绿色风 分类: 时间:2022-08-18 浏览:96
楼主
amulee
去年写的一个游戏。这个游戏花了很大力气,功能也比较全面。学习这个游戏的代码,你可以学到:
1、自定义窗体右键菜单;
2、SQL查询;
3、类模块;
4、数组;
5、添加动态控件;



可以说是一个教材吧(这也是我的初衷)

这个游戏中最核心的就是24点算法,网上都可以搜到很多。我这个带了注释,帮助理解吧。
  1. Const PRECISION = 0.000001  '精度
  2. Public COUNT_OF_NUMBER As Integer   '参与运算的数字个数
  3. Public NUMBER_TO_BE_CAL             '运算目标值
  4. Public MyAnswer As String           '参考计算式
  5. Public Number_Scale As Integer      '运算数字的范围
  6. Public Number() As Double           '运算数字数组
  7. Public Expression() As String       '运算表达式
  8. '24点递归算法。
  9. '思路如下:
  10. '采用遍历的方式,先从数组的N个元素中取出两个数,分别进行四则运算,其结果保存在数组中。该数组变换为N-1个元素
  11. '再以新数组(N-1)个元素重复上述步骤的将上述两数运算结果与剩余数字组成的数组进行上述运算
  12. '直至所有数组元素参与计算,即到最后仅剩2个元素时判断是否有计算结果
  13. 'Expression(i)中存放运算表达式,由于最终要计算到2个元素,所以最终表达式总是存放在Expression(0)中
  14. 'Number(i)中存放两辆运算后的结果,由于最终要计算到2个元素,所以最终结果总是存放在Number(0)中
  15. Function Search(n As Integer) As Boolean
  16.     Dim a As Double, b As Double
  17.     Dim Expa As String, Expb As String
  18.     If n = 1 Then
  19.         If Abs(Number(0) - NUMBER_TO_BE_CAL) < PRECISION Then   '当数字个数仅剩2个时,判断运算是否完成
  20.             Search = True
  21.         Else
  22.             Search = False
  23.         End If
  24.         Exit Function
  25.     End If
  26.     For i = 0 To n - 1
  27.         For j = i + 1 To n - 1
  28.             '存放参与计算的两个数至临时变量
  29.             a = Number(i)
  30.             b = Number(j)
  31.             Expa = Expression(i)
  32.             Expb = Expression(j)
  33.             '由于每次进行更深入递归都不再生成新数组,而是以数组N-1个元素进行运算,故将最后一个元素放到j位置
  34.             'i位置存放i和j位置的两个数的运算结果
  35.             Number(j) = Number(n - 1)
  36.             Expression(j) = Expression(n - 1)
  37.             '表达式赋值,运算结果赋值,进行递归运算
  38.             Expression(i) = "(" & Expa & "+" & Expb & ")"
  39.             Number(i) = a + b
  40.             '若有运算结果则结束程序
  41.             If Search(n - 1) Then   '递归在这里
  42.                 Search = True
  43.                 Exit Function
  44.             End If
  45.             '以下请参考上面
  46.             Expression(i) = "(" & Expa & "-" & Expb & ")"
  47.             Number(i) = a - b
  48.             If Search(n - 1) Then
  49.                 Search = True
  50.                 Exit Function
  51.             End If
  52.             Expression(i) = "(" & Expb & "-" & Expa & ")"
  53.             Number(i) = b - a
  54.             If Search(n - 1) Then
  55.                 Search = True
  56.                 Exit Function
  57.             End If
  58.             Expression(i) = "(" & Expa & "*" & Expb & ")"
  59.             Number(i) = a * b
  60.             If Search(n - 1) Then
  61.                 Search = True
  62.                 Exit Function
  63.             End If
  64.             If b <> 0 Then
  65.                 Expression(i) = "(" & Expa & "/" & Expb & ")"
  66.                 Number(i) = a / b
  67.                 If Search(n - 1) Then
  68.                     Search = True
  69.                     Exit Function
  70.                 End If
  71.             End If
  72.             If a <> 0 Then
  73.                 Expression(i) = "(" & Expb & "/" & Expa & ")"
  74.                 Number(i) = b / a
  75.                 If Search(n - 1) Then
  76.                     Search = True
  77.                     Exit Function
  78.                 End If
  79.             End If
  80.             '若没有运算结果,则将数组复原,继续进行循环遍历
  81.             Number(i) = a
  82.             Number(j) = b
  83.             Expression(i) = Expa
  84.             Expression(j) = Expb
  85.         Next j
  86.     Next i
  87.     Search = False  '若上述运算都没有结果,则该数组无法满足运算要求
  88. End Function
  89. Sub MakeNumbers(Optional ByVal XX As Integer)
  90.     Dim i&
  91.     ReDim Number(0 To COUNT_OF_NUMBER - 1)  '定义数字数组
  92.     ReDim Expression(0 To COUNT_OF_NUMBER - 1)  '定义表达式数组
  93.     Do
  94.         For i = 0 To COUNT_OF_NUMBER - 1
  95.             Randomize
  96.             Number(i) = Int(Rnd * Number_Scale + 1) '数字数组随即生成
  97.             Expression(i) = CStr(Number(i))         '表达式数组赋值
  98.             UserForm1.Controls("MyLabel" & i).Caption = Number(i)   '标签赋值
  99.         Next i
  100.     Loop Until Search(COUNT_OF_NUMBER)  '直到有计算结果才停止
  101.     UserForm1.TextBox1 = ""
  102.     UserForm1.TextBox1.SetFocus
  103.     iDTS = iDTS + 1
  104.     MyAnswer = Expression(0)    '将运算表达式存放在MyAnswer中
  105. End Sub


24点游戏.rar
2楼
LOGO
我是V白,向前辈学习!
3楼
xyh9999
留个脚印
4楼
wqfzqgk
以前电脑报上有这个,呵呵
5楼
liuguansky
很强大。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap