c# 实现汉诺塔游戏

2022-07-27,

汉诺游戏一旦掌握了规律,其实是有点单调和无聊的,不过却是学习递归的一个绝佳例子,想当初学习老谭c的时候,就卡在这儿好长时间。

对初学编程的人来说,递归本身就不易理解,如果使用c语言没有好的调试环境就更难去理解了。在这方面,vs调试输出是真方便,一目了然。

但要想理解递归求解汉诺塔,还是得先玩一玩游戏本身,有点感受。另外,设计一下这个游戏也可以加深对它的理解,同时还可以对数据结构中的栈有一个简单的认识。

因为汉诺塔的游戏规则本身就是一个栈,只能从平台最上面取走碟子,然后放在另一个平台最上面,这明显是个栈。下面是我设计的游戏界面:

游戏的玩法关键:奇数个盘子,第一个先移到c上;偶数个盘子,第一个先移到b上

平台和背景容器是事先画好的,碟子是动态生成的,使用了容器控件panel的拖动事件来实现拖动碟子(就是个label控件而已)的功能。

主要代码:

用c#写的代码感觉都不用怎么解释,大概思路一说,关键的地方注释一下,一看就明白了。

然后说到解法,其实就是使用老谭c的代码,不过标注了有用的调试输出信息,如下:

理解1:移动n个盘子的步数是移动n-1个盘子的步数的2倍再加1,即:a[n] = 2a[n-1]+1,可推出:a[n]=2^n-1
理解2:n个盘子分配给n个人的话,第1人(总工)只需走1步,第2人(分包)走2步,第3人(分包)走4步...第n人(工人)走2^(n-1)步
理解3:从最上层开始层层分解任务,下面的所有层次干完后他再干然后下层继续补完,每个人都干活了,只有最底层的人接到任务不做分解直接开干
查看调试输出可以很容易的理解整个调用过程,有碟子数量和双箭头的为目标任务,有碟子数量和单箭头的为实际任务,只有单箭头的为实际执行步骤

将n个盘从a座借助b座移到c座,将上面的数据代入就可以很容易的理解了。下载地址

以上就是c# 实现汉诺塔游戏的详细内容,更多关于c# 汉诺塔游戏的资料请关注其它相关文章!

《c# 实现汉诺塔游戏.doc》

下载本文的Word格式文档,以方便收藏与打印。