摘要:
本课程设计的主要内容是Hanoi 塔游戏的移动步骤。程序的主要功能就是在有三个塔座的情况下,用户输入要移动的圆盘数后,计算机计算出所用步骤,并把一步的移动分别输出。而且能够显示总共需要移动的的次数。Hanoi塔的移动规则是:
每次只能移动一个圆盘;
圆盘可以插在A,BC中任意塔上;
任何时刻都不能将个较大的圆盘压在较小的圆盘之上。
Hanoi塔的游戏大家都玩过。在圆盘数很小时很容易实现,但是当圆盘数不断增加时,移动起来也不再容易。所以,用计算机来计算当圆盘数变大时的移动次数显得简单而明了。
关键字:
Hanoi     塔座        圆盘   


一、设计目的
1.1    Hanoi 塔 传说
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1n=64时,
  f(64)= 2^64-1=18446744073709551615
  假如每秒钟一次,共需多长时间呢?一个平年365天有 31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下,
18446744073709551615/31556952=584554049253.855
这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
1.2Hanoi 塔 的问题描述
假设有三个分别命名为A,B和C的塔座,在塔座上A上游直径大小各不相同、从小到大编号为1,2,...,n的圆盘。项要求将塔座A上的n个圆盘移至塔座C上并仍按同样的顺序叠排,圆盘移动时必须遵守以下规则:
每次只能移动一个圆盘;
圆盘可以插在A,B和C中任意塔上;
任何时刻都不能将个较大的圆盘压在较小的圆盘之上。
1.3要求
用pc汇编语言实现移动方法并在屏幕上显示出来
二、正文
2.1功能设计模块图
2.2算法设计
子程序Asctobin函数:
12();13();out1();
(用循环与分支等)
Hanoi函数:
Equal();loopnum0();unequal();
Loopnum1();exit();
2.2.1算法的思想描述
汉诺塔问题
这个问题在盘子比较多的情况下,很难直接写出移动步骤。我们可以先分析盘子比较少的情况。假定盘子从大向小依次为:盘子1,盘子2...,盘子64
如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C
如果有2个盘子,可以先将盘子1上的盘子2移动到B;将盘子1移动到c;将盘子2移动到c。这说明了:可以借助B2个盘子从A移动到C,当然,也可以借助C2个盘子从A移动到B
如果有3个盘子,那么根据2个盘子的结论,可以借助c将盘子1上的两个盘子从A移动到B;将盘子1A移动到CA变成空座;借助A座,将B上的两个盘子移动到C。这说明:可以借助一个空座,将3个盘子从一个座移动到另一个。
如果有4个盘子,那么首先借助空座C,将盘子1上的三个盘子从A移动到B;将盘子1移动到CA变成空座;借助空座A,将B座上的三个盘子移动到C
上述的思路可以一直扩展到64个盘子的情况:可以借助空座C将盘子1上的63个盘子从A移动到B;将盘子1移动到CA变成空座;借助空座A,将B座上的63个盘子移动到C
2.2.2算法的流程图
   
                          Call 
                                                N
                                    Y
                                                        N
                                    Y
                                                        Call

    Y
                Y
                                              N
N
                                                                            Y
N
                                                                    Y
              Y                                        N
                                                     
                Y
汇编语言清华大学出版社
                              N
2.3编译截图
2.4连接截图
2.5运行结果截图
2.6相关界面的截图
、课程设计体会
自我评价(问题、解决方案)
学习汇编刚开始,感觉就一个字——难,再到后来开始学伪代码、子程序更是觉得一头雾
水。但是有一次在师大网上看到第三届国际设计大赛的获奖作品时我震惊了,原来汇编语言也可以这么神奇。大师级的作品我们也只能看到展现的成果,相信那神奇的视觉效果背后的源代码一定很长很深奥吧!在钦佩之余,我想什么时候我也可以作出一部优秀的作品。
对于老师布置的这次大作业,我在做之前雄心勃勃,斗志昂扬。用一周的时间把课本上老师讲的内容看了一遍,泡了三天图书馆,希望可以明白怎么去编程。在66号确定我要完成各种数制之间的转换问题,但是画了一下午一晚上的时间一事无成。晚上睡下,心里很不是滋味。第二天,我从之前学习的c语言和c++得倒灵感,决定做Hanoi 塔的汇编语言实现。
cc++中的Hanoi塔问题我们很熟悉了。递归和非递归的算法我们都自己实现过。这样只要将cc++语言翻译成汇编语言就可以了
于是我利用周末很长的一大段时间来完成这次的大作业。虽然有些投机的意思,但是还是话费了很长的时间。不断的出现问题,一遍一遍的改正,一遍一遍的编译、连接,显示结果依旧不能按我想的方式输出。在算不出来时真的很苦恼。翻书,上网查,与同学讨论,
经过坚持,我最终完成了这次的汇编设计作业,虽然它还是很粗糙,但是完成后的喜悦是无以言表的。
生活的任何一种经历都会让我们得到成长,无论过程多么艰难,但是我们年轻,我们就该让自己体味这种得来不易的感觉!
、参考文献
C语言程序设计 第二版第2版谭浩强 清华大学出版社
C++语言程序设计教程 杨进才 沈显君 刘蓉编著 清华大学出版社
IBM-PC汇编语言程序设计 (第2版) 作者: 沈美明 / 温冬婵 编著出版社:
百度文库wenku.baidu/view/fb287346b307e87101f69608.html
百度百科baike.baidu/view/191666.htm
、附录(源程序及其注释)
;
数据段的定义
;--------------------------------------------------
datarea  segment
;主页菜单显示
mess db '    **************************************************************************',0ah,0dh
    db '    *          welcome you!                                                  *',0ah,0dh
    db '    *          this is hanoi game                                            *',0ah,0dh
    db '    *          you can know how many times when you play this game            *',0ah,0dh
    db '    *          the case by HE RUIRUI                                        *',0ah,0dh
    db '    *          XueHao is 41012186                                            *',0ah,0dh
    db '    **************************************************************************','$';
bin  dw 0    ;将bin初始化为0
chnum db 10 dup('0'),'$';给chnum分配存储空间
one  dw 'A'    ;三个塔座
two  dw 'B'
three dw 'C'
strshow  db '-->$'  ;连接符号
chline    db 0dh,0ah,'$'
prompt    db 'Please input the plate number(1-99):$';提示语句
chtimes1 db 0dh,0ah,'You have moved $';提示语句
chtimes2 db 'times',0dh,0ah,'$'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。