VBA永远的神 无所不能VBA能干什么? 其实除了枯燥的Excel数据处理,VBA还能写几个小游戏玩玩,比如我就用纯粹的Excel VBA写了这个汉诺塔游戏,顺便复习了一下递归算法,游戏支持按键选择和移动方块,也给一直无法解答的同学准备了最完整的全自动动画解答,超过6层以后还是有一些难度的,可以自己练好了教孩子,本文会简单讲解游戏的开发过程,有兴趣用VBA完成的同学可以参考,案例文件可到文章末尾获取。 汉诺塔游戏简介 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 下面就来讲解Excel版汉诺塔游戏的开发过程 汉诺塔游戏规则设计作为一个游戏,首先要确定游戏元素和制定游戏规则,一切都要围绕这个规则进行 游戏元素 1) 3根石柱,这里我称之为3个塔座,分别在Excel里用3个区域画出来,中间和底部单元格设为蓝黑色背景,作为石柱,他们是固定元素,不需要参与到代码中 游戏规则1) 游戏胜利目标为左侧圆盘全部移动到最右侧圆盘 Excel VBA代码实现汉诺塔 游戏初始化要在最左侧生成N个圆盘,我这里采取的是先预设一个矩形放在右边空白区,代码复制这个形状,根据要生成的个数,计算每层的高度和位置,这就是循环基本功了,代码如下,具体执行的时候链接到重置按钮 用户切换选择按钮 既然是游戏就要有交互,需要提供给用户选择方块,有同学肯定说直接用鼠标点选,是可以,但是这里有个问题,因为鼠标点的话,那所有盘子都能点,不是顶部的也能点到,逻辑上就不太合理,所以这里采取切换选择按钮,在3个盘子的顶部来回切换选择,这里的算法稍微复杂,因为在游戏过程中,每个柱子区域顶部是哪个盘子是不确定的,所以要先计算顶部的盘子,这里写了个遍历形状的子函数来处理,然后切换的时候就是通过塔座的序号加减实现 圆盘移动按钮 选择了目标以后 就是移动,移动这里给了2个按钮,左移和右移,移动的时候主要是计算下一个塔座的编号,那么就是首先要根据当前选择的盘子先计算当前塔座编号,左移就是编号-1,右移就是+1,注意1号左移要变为3,3号右移要变为1,游戏中要处理很多这种边界情况 移动动画的实现 上面一步实际在最开始做的时候,是没有动画,只会看到圆盘咻的一下就到新位置了,作为演示移动过程,这个不太直观,所以中间我加入了一个动画处理,所谓动画也没那么神奇,动画就是计算出圆盘也就是方块的移动路径,给一个循环,按一定的步长,逐步移动到新位置,这个过程连续起来,人眼看起来就成了一个移动的动画效果,实现代码如下 游戏按键指定 一般来说,游戏都要支持纯键盘操作,上面的按钮操作,都可以指定到按键,这里使用Application.OnKey来指定按键,只是要记得在close事件里要取消指定按键,否则打开别的Excel文件这些按键会无法正常使用了 实现VBA汉诺塔自动解题 前面做的都是游戏本身的交互,那现在开始做比较难的步骤,就是游戏求解,其实做这个游戏的初衷,就是为了讲解递归算法,而汉诺塔就是一个经典的编程算法题,我还记得在大学的c语言习题里就有这个案例,这里解题的重点在于要理解递归的构造,本题的重点在于抽象出完成目标的步骤 首先把目标分解为移动最下面的第N个盘子上面N-1个盘子 1) 首先要移动塔座1的N-1个到塔座2上,他们需要借助塔座3完成 |
|
来自: 昵称72339616 > 《待分类》