|

作品名称:移动方块的游戏程序 开发团队:曹志军、张广 作品说明:
这是一个用鼠标点击移动方块的游戏程序,如下图
从组合框中选择一个3~10的数字,单击“开始”按钮,将出现一些数字按钮,例如选择5,则会出现图1中24个数字按钮,并留出一个空格的位置,单击任意一个按钮,如果该按钮位于空格的上边、下边、左边或右边,则被单击的按钮将会移至空格的位置。以此方式来移动按钮,直至所有按钮以数字顺序按行排列,游戏结束。如图2:
每次单击“开始”,各按钮上的数字排列都是不同的,随机的,其算法如下:
1、代码中有三个全局变量:
Choose:用来保存从组合框中选择的数字
Random:程序中有一个时间控件 Timer2,设置为每1毫秒触发一次,Random就增加,即Random用来保存时间的毫秒数,用Random和 (Choose*2-1)作模运算,其结果可看作是一个在1~(Choose*2-1)之间的随机数
Reference:用来保存空格的索引值
2、随机数的产生:
以图1为例,组合框选择的数字是5,应该出现5*5-1=24个按钮(实际是25个按钮,其中一个被隐藏了,以形成1个空格的视觉效果)。首先用Rand( )函数产生110个随机数(之所以要生成110个随机数,是因为组合框中最大可选择10,将会出现10*10-1=99个按钮(100个按钮中被隐藏一个),这99个按钮上的数字将从这110个随机数中抽取),通过模(5*5-1)运算,使这110个数都在0~24之间,将这110个随机数保存在一个数组中。
用 Random 和 Choose 作模运算,其结果用来确定从数组中第几个元素开始取值。假设结果为3,如下表,则从索引值为3的数组元素开始取值
根据表1中数组元素的值依次找到具有相应索引值的按钮,将按钮从0~25赋值,当某按钮上已有值时(例如表1中数组元素9和0),则从索引为0的按钮开始向后找到一个空按钮,并赋值。将所有按钮赋值后,将数字为0的按钮隐藏,即可得到图1的效果。
3、按钮移动
Reference变量用来保存空格的索引值,设被单击的按钮的索引值由变量 index保存:
当index = reference - choose 时,代表空格上面的按钮被单击了;
当index = reference + choose 时,代表空格上面的按钮被单击了;
当index = reference - 1 And Int(index / choose) = Int(reference / choose) 时,代表空格左边的按钮被单击了,
Int(index / choose) = Int(reference / choose)
此段代码用来判断index 和 reference 是否在同一行,下面的右边按钮被单击也有类似代码
当index = reference + 1 And Int(index / choose) = Int(reference / choose) 时,代表空格右边的按钮被单击了。
以自定义过程 swap( index ),将索引值为index 和 reference的按钮上的数字进行交换,并隐藏数字为0的按钮,以实现按钮移动的效果。
张军的随机数生成算法如下:
源代码:
Dim intMax As Integer, intRnd As Integer
intMax = choose ^ 2
ReDim tmpVal(intMax) As Integer
For i = 0 To intMax - 1
tmpVal(i) = i
Next i
Randomize
For i = intMax - 1 To 0 Step -1
intRnd = Int(i * Rnd())
Command1(i).Caption = tmpVal(intRnd)
tmpVal(intRnd) = tmpVal(i)
Next
代码解释:
先用 Int(i * Rnd()) 产生一个随机数,以此随机数为索引,从tmpVal()数组中抽取一个数字,将此数字赋给 Command(i),随后以 tmpVal() 数组中索引值为 i 的数字替换被抽取的数字。每循环一次后,已抽取的数将被替换,i 值减 1,可选择的数字范围将缩小,可保证所有数字不会重复。下面以图示说明:
假设要生成9个0~8之间的不重复的随机数
先生成一顺序数组,如表3:
循环变量i 从8~0依次递减
第一次循环:
用intRnd = Int(i * Rnd( )) 生成一个0~8的随机数,假设是3,则将索引为3的数组元素放入按钮索引为 i(此时为8) 的按钮中,并将索引值为 i 数组元素放入索引为 intRnd(此处为3) 的数组元素中,将原数字覆盖,如表4、表5
第二次循环:
由于在上次循环中 i 值减1,所以再次使用 intRnd = Int(i * Rnd( )) 会生成一个0~7的随数,假设是5,重复以上步骤如表7、表8所示
本次循环后数组元素将成为表9所示:
按以上方法,循环结束后,9个按钮数组元素上将出现数字0~8,且随机排列。
|