Excel VBA玩游戏学编程之汉诺塔 动画与递归 以及用户交互设计 郑广学汉诺塔

742 次浏览

file

VBA永远的神 无所不能

VBA能干什么? 其实除了枯燥的Excel数据处理,VBA还能写几个小游戏玩玩,比如我就用纯粹的Excel VBA写了这个汉诺塔游戏,顺便复习了一下递归算法,游戏支持按键选择和移动方块,也给一直无法解答的同学准备了最完整的全自动动画解答,超过6层以后还是有一些难度的,可以自己练好了教孩子,本文会简单讲解游戏的开发过程,有兴趣用VBA完成的同学可以参考,案例文件可到文章末尾获取。
Excel VBA玩游戏学编程之汉诺塔 动画与递归 以及用户交互设计 郑广学汉诺塔插图1

汉诺塔游戏简介

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
file


下面就来讲解Excel版汉诺塔游戏的开发过程

汉诺塔游戏规则设计

作为一个游戏,首先要确定游戏元素和制定游戏规则,一切都要围绕这个规则进行

游戏元素

1) 3根石柱,这里我称之为3个塔座,分别在Excel里用3个区域画出来,中间和底部单元格设为蓝黑色背景,作为石柱,他们是固定元素,不需要参与到代码中
2) N个圆盘,原则上支持无限多圆盘,不过在游戏开发初期,先设为3个固定圆盘,方便快速测试代码,等完成代码后再进行参数化扩展支持无限圆盘

游戏规则

1) 游戏胜利目标为左侧圆盘全部移动到最右侧圆盘
2) 在三根柱子之间一次只能移动一个圆盘,也就是只能移动一个顶部的圆盘,且只能移动到一个比它大的圆盘之上,游戏逻辑里要进行条件判断,不能随意移动

Excel VBA代码实现汉诺塔

游戏初始化

要在最左侧生成N个圆盘,我这里采取的是先预设一个矩形放在右边空白区,代码复制这个形状,根据要生成的个数,计算每层的高度和位置,这就是循环基本功了,代码如下,具体执行的时候链接到重置按钮
file
这里有一个细节处理,就是在8层以下的时候 我们并不是按总高度平均分配盘子高度,而是按每层固定的高度生成,这主要是为了美观,因为如果只有3层也按整体高度计算平均高度,实在是不太好看,会生成左边的胖子,修正后就是右侧形式
file

用户切换选择按钮

既然是游戏就要有交互,需要提供给用户选择方块,有同学肯定说直接用鼠标点选,是可以,但是这里有个问题,因为鼠标点的话,那所有盘子都能点,不是顶部的也能点到,逻辑上就不太合理,所以这里采取切换选择按钮,在3个盘子的顶部来回切换选择,这里的算法稍微复杂,因为在游戏过程中,每个柱子区域顶部是哪个盘子是不确定的,所以要先计算顶部的盘子,这里写了个遍历形状的子函数来处理,然后切换的时候就是通过塔座的序号加减实现Excel VBA玩游戏学编程之汉诺塔 动画与递归 以及用户交互设计 郑广学汉诺塔插图5
file

圆盘移动按钮

选择了目标以后 就是移动,移动这里给了2个按钮,左移和右移,移动的时候主要是计算下一个塔座的编号,那么就是首先要根据当前选择的盘子先计算当前塔座编号,左移就是编号-1,右移就是+1,注意1号左移要变为3,3号右移要变为1,游戏中要处理很多这种边界情况
这里的移动逻辑实现,主要是计算下一个目标柱子的顶端位置,然后重置选择的圆盘top和left到指定位置,这个计算就是简单的数学问题不再赘述,具体细节自己调试一下,还是有许多麻烦要处理的

file
file

移动动画的实现

上面一步实际在最开始做的时候,是没有动画,只会看到圆盘咻的一下就到新位置了,作为演示移动过程,这个不太直观,所以中间我加入了一个动画处理,所谓动画也没那么神奇,动画就是计算出圆盘也就是方块的移动路径,给一个循环,按一定的步长,逐步移动到新位置,这个过程连续起来,人眼看起来就成了一个移动的动画效果,实现代码如下
file

游戏按键指定

一般来说,游戏都要支持纯键盘操作,上面的按钮操作,都可以指定到按键,这里使用Application.OnKey来指定按键,只是要记得在close事件里要取消指定按键,否则打开别的Excel文件这些按键会无法正常使用了
file

实现VBA汉诺塔自动解题

前面做的都是游戏本身的交互,那现在开始做比较难的步骤,就是游戏求解,其实做这个游戏的初衷,就是为了讲解递归算法,而汉诺塔就是一个经典的编程算法题,我还记得在大学的c语言习题里就有这个案例,这里解题的重点在于要理解递归的构造,本题的重点在于抽象出完成目标的步骤 首先把目标分解为移动最下面的第N个盘子上面N-1个盘子
1) 首先要移动塔座1的N-1个到塔座2上,他们需要借助塔座3完成
2) 再移动塔座1的第N个到塔座3上 这里就只需要一步了
3) 最后移动塔座2上N-1个盘子到塔座3上,这里需要借助塔座1
4) 在移动N-1个盘子的过程中,如果当前需要移动的盘子只有一个,那就直接从塔座移动到塔座3
这个过程有点烧脑,可以多百度看看其他人的解释,然后结合我的游戏,用3层 4层简单模拟一下手工完成,或者观看动画,相信总会理解的,这个过程我用中文变量写代码,非常一目了然,希望可以帮助大家理解
file
这里最后完成的效果就是前面的动画解题效果了
Excel VBA玩游戏学编程之汉诺塔 动画与递归 以及用户交互设计 郑广学汉诺塔插图1

VBA汉诺塔下载地址

请关注微信公众号EXCEL880 私信回复 72981
file