1. 河内(河内)塔——1883
河内塔游戏是最美观的游戏之一,由法国数学家爱德华·卢卡斯于1883 年发明。
这个游戏起源于一个传说:本纳尔斯有一座雄伟的宫殿。宫殿内有一块黄铜板,上面插着三根大针。一开始,64个黄铜圆盘按从大到小的顺序放在一根大针上,最大的圆盘在底部。无论白天还是晚上,牧师都会以相同的速度将圆盘从一根大针转移到另一根大针上,并且不允许在比它小的圆盘之间放置任何圆盘。优越的。当圆盘塔在另外两根针中的一根上重建时,宇宙就会终结。
即使这个传说是真的,也没有理由担心。即使每秒移动一个圆盘,也需要6000亿年才能完成这项工作,大约是太阳寿命的60多倍。在较少数量的圆盘上完成汉诺塔所需的必要步骤是2n-1。因此,两个圆盘需要三个步骤,三个圆盘需要七个步骤,依此类推。
河内塔
2. 算法分析
卢卡斯著名的拼图,源自河内塔游戏,后来被制成儿童玩具。这是一个非常巧妙的玩具模型,充分利用了几何指数级数的概念。即使在今天,这个拼图的许多版本仍然可以在世界各地的玩具店找到。
转移三个硬币或圆盘需要7 个步骤。要转移四个,需要15 个步骤。要转移5 个,需要31 个步骤。要转移6 个,需要63 个步骤。要转移n,需要2n-1步。卢卡斯难题的解决方案似乎很难找到,因为某些步骤很容易出错。
我们可以得到有关这些解决方案的一些可能的提示:
1. 将最小的棋子从现有的卡槽移至隔壁的一列,使其始终处于相同的循环顺序。
2. 之后,移动除最小磁盘之外的其他磁盘。这个规则可能看起来很武断,但你会发现你总是可以采取合理的步骤,直到谜题突然以神奇的方式解决(不一定是最少的步骤)。
解决这个难题是递归算法的一个经典例子。
以4盘为例,见下图。我们先把中间一列的4-1=3个圆盘移到左边的转移列上,需要23-1=7步,然后移动最下面的一个大圆盘放在右边的目标列上,然后移动将传输柱上的4-1 圆盘转移到目标柱上。将圆盘放在中心的方式有7种,总共7+1+7=15种方式。当放置3个磁盘时,您可以在传输中递归地先放置3-1.
3. 使用Scratch编程实现Ivan Moskovich书中给出的汉诺塔谜题的三种解决方案。
【解决方案1——列表方法】
如果不考虑将运动过程实时显示在屏幕上,那就很简单了。只需创建一个列表“步骤列表”并将每个运动过程的符号放入列表中即可。
构建递归子程序,首先以转移列C为目标列,转移n-1个磁盘;其次,将A列中的圆盘放入B列中,并将移动轨迹符号添加到列表中;然后以C柱为源柱,B柱为目标,C柱上的n-1个盘被转移。
列出方法过程和结果
【2——动画显示列表确定位置方法解决】
此方法的难点在于为舞台上每个圆盘的运动制作动画。这里有一个问题。如果n个磁盘数量很大,是否需要创建n个磁盘字符?在这种情况下,程序会更加复杂。很自然地,我就想到了使用克隆功能。但如何让每个分身按照要求行动呢?需要确定哪个克隆应该移动以及移动到该列上的哪个位置?
与方案一的脚本相比,将原始角色存储到列表中的动作改为移动盘子的过程,在舞台上动态显示。
为此,我们需要创建一个额外的板块角色。根据盘子的数量,我们可以像孙悟空一样,制作N个盘子的克隆体(克隆)来充当那些盘子。每个克隆都有一个身份标记,它是私有变量“磁盘名称(私有更改)”的值,即字符“磁盘x”,其中x是序列号。
让主控程序利用递归来决定将哪一列的盘子移动到另一列。
那么圆盘应该移到起始柱上的什么位置呢?目的地支柱的哪个位置是接收位置?这需要做一些必要的计算。为此,我们需要创建三个列表:支柱1、支柱2 和支柱3。在第一个列表(支柱1)中,板的序列号从上到下放置。接下来的两个列表中,首先放置了N个零,表示为空。当需要在里面某个位置放一块盘的时候,把这个位置的内容替换成该盘的编号,这就是“盘名(私改)”。以下是“Plate”角色初始设置的脚本:
初始化程序
以下是“大师”角色的递归算法程序。与方案一的区别在于: 1、将列码A、B、C替换为1、2、3,以方便后续程序的编写。
汉诺塔递归算法子构建块
2.关键模块“盘子从起始列移动到目标列”的内容比解决方案1复杂得多。因为这不仅仅是标记一个字符的问题。有6种情况需要区分。
实现从起始栏到目标栏的盘子的脚本
将小节1 移动到小节2 的脚本
如何计算算法“12”?
在起始栏对应的列表中,从上到下第一个不为0的位置的车牌应该被移动,并将这个非0值(车牌号)放入“移动车牌号”中(这是一个克隆(plate)是是否移动的关键信号),移动后,应立即将这个非零值改为0,使其成为可接收的位置。
在对应的目标柱列表中,从下到上第一个k为0的位置为接收位置。由于有车牌过来,所以这里的列表内容要从0改为即将到来的车牌号。
我们以“12”为例。其他五个原则都是一样的,只是轮换一下而已。
有兴趣的读者可以尝试编写其他五个子模块。
做好这些准备工作后,就可以在舞台上布置柱子和盘子了。
绘制下图作为舞台背景。三个柱子的下坐标分别为(-160,-150)、(0,-150)和(160,-150)。角色“盘子”的形状是椭圆形。
图6-17 背景与车牌人物造型
“盘子”角色分别收到相关消息后的动作脚本
移动动作分为三步:1.在起始列上移动到该列的顶部,2.平移到目标列的顶部,3.向下移动到目标位置:
克隆板动作
单击绿旗,输入板数并按Enter。盘子堆放在左列上。再次按空格键,盘子就会以正确的方式移动!不过如果盘子数量较多的话,时间就更长了!当然,如果你把速度设置得更快的话,你肯定会比加速模式下的那些牧师快很多!
移动进程片段
【3——动画显示解决方案:触摸颜色确定位置】
可见,方法2的确定位置的算法相对复杂。有没有更简单的方法?
我们可以充分利用Scratch的检测功能,用两种颜色来区分板材字符的表面和边缘。每次放置一个盘子时,它会从上到下移动,直到碰到盘子的颜色或到达底部位置(使用角色的y坐标这个私有变量值判断)才会停止,并进一步向下移动一点,确保下板(如果有)接触到自己的边缘颜色就可以了。这消除了计算的需要,并让检测自动完成。
板材堆垛子程序
那么每个克隆如何知道它是否应该移动以及以什么方式移动呢?这里可以使用另一个私有变量“action”来区分,这样克隆就可以确定当前的路以及它的位置,包括它在哪一列以及是否是最上面的一列。这取决于克隆是否接触板。从边缘颜色来看,因为触摸它就意味着上面有一个盘子。
根据模式私有变量“action”的值生成实际操作的程序
确定移动方式的流程与方案2大致相同
模式选择主控子块
根据选择确定私有变量的“操作值”的程序
主程序和递归子程序
动画剪辑
4. 资料片:巴比伦游戏
该游戏是经典河内塔游戏的衍生游戏。您可以选择不同的难度级别,下面给出了一些示例。
如图所示,左边的卡槽里堆放着一些光盘。每个游戏的目标是以相同的顺序将这些棋子转移到右侧。编号最大的圆盘应放置在卡槽的底部。
这四个游戏的目标是将3、4、5、6张磁盘按照相同的顺序转移到右侧的卡槽中。数字最大的圆盘放在底部。离顶部越远,圆盘的数量越小。请记住遵守以下规则:
1. 一次只能移动一张光盘。
2. 不要将任何磁盘放置在编号小于其编号的磁盘之上。
3、可以使用中间的卡槽,但需要遵守第1条和第2条的规定。
您需要采取多少步骤才能完成此类转移?您可以尝试完成第一个游戏,然后继续进行更困难的游戏。
标签:
用户评论
这个《迷人的数学》刮刮模拟游戏真的太有趣了,每次都能让我学到新知识,还能锻炼大脑,推荐给朋友们一起玩。
有16位网友表示赞同!
河内塔游戏难度适中,益智189的游戏设置挺不错的,就是刮刮卡有点小贵。
有20位网友表示赞同!
刚刚入手《迷人的数学》,感觉游戏设计得挺用心,就是汉诺塔的玩法有点复杂,还在慢慢摸索。
有12位网友表示赞同!
益智游戏我推荐这个《迷人的数学》,特别是刮刮卡,每次都能带来惊喜。
有19位网友表示赞同!
河内塔游戏已经玩了好几轮了,感觉这个《益智189》系列的游戏做得挺有深度。
有15位网友表示赞同!
《迷人的数学》这个游戏太适合家长和孩子一起玩了,寓教于乐,刮刮卡的设计挺吸引人的。
有20位网友表示赞同!
第一次玩汉诺塔游戏,感觉这个《刮刮模拟》挺有意思的,益智又娱乐。
有17位网友表示赞同!
《迷人的数学》的河内塔游戏太好玩了,但是有时候刮刮卡里的答案太难了,有点沮丧。
有17位网友表示赞同!
这个刮刮模拟游戏真的太神奇了,每次都能让我对数学产生新的认识,强烈推荐。
有14位网友表示赞同!
河内塔游戏虽然有点难度,但是玩起来很过瘾,益智189的游戏设计得很好。
有18位网友表示赞同!
买了这个《益智189》的刮刮模拟游戏,发现里面的数学题目很有趣,但是汉诺塔的玩法还需要多练习。
有14位网友表示赞同!
这个游戏真的让我对数学有了新的认识,刮刮卡的设计很巧妙,河内塔游戏玩起来很考验耐心。
有20位网友表示赞同!
《迷人的数学》游戏中的汉诺塔游戏特别吸引人,每次都能让我沉浸在解题的乐趣中。
有12位网友表示赞同!
刮刮模拟的《迷人的数学》游戏,让我在玩的过程中不知不觉学到了很多数学知识,太棒了。
有13位网友表示赞同!
河内塔游戏虽然简单,但是玩起来很有挑战性,这个《益智189》游戏值得一试。
有15位网友表示赞同!
这个《迷人的数学》游戏太吸引人了,每次都能让我在游戏中找到乐趣,还提高了数学能力。
有8位网友表示赞同!
刮刮模拟的河内塔游戏,让我在休闲的同时,也能锻炼大脑,非常推荐。
有7位网友表示赞同!
第一次玩这种结合了数学和游戏的刮刮卡,感觉《益智189》的游戏设计很有创意。
有6位网友表示赞同!
这个《迷人的数学》游戏真的让我爱不释手,刮刮卡的设计太吸引人了,河内塔游戏也很有挑战性。
有5位网友表示赞同!