题目一 汉诺塔

余年寄山水
537次浏览
2021年02月06日 22:05
最佳经验
本文由作者推荐

奴隶英雄-

2021年2月6日发(作者:林白过程)


题目一



汉诺塔



1


.设计内容及要求



1.1


汉诺塔算法的基本要求




1




设计


GUI


界面的


Hannoi


塔。


Hannoi


塔中有 三个座,名字分别是


A



B

< p>


C


。初始状态是


A


座上有


3


个大小不等的盘子,这些盘子从座 底到座顶按着大


小顺序依次摆放在


A


座 上。


用户可以用鼠标选中盘子,


然后通过拖动鼠标来移动


该盘子、释放鼠标来放置该盘子;




2


)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面 ,


用户最终要完成的是把


A


座上的全部 盘子移动到


B


座或


C

< br>座上;




3

< br>)用户可以通过


Hannoi


塔界面提供的菜单来选择初 级、中级、高级和自


定义四个级别。


初级级别

< br>A


座上有


3


个大小不等盘子、< /p>


中级级别


A


座上有


4


个大


小不等盘子、


高级级别


A


座上有


5


个大小不 等盘子、


自定义级别


A


座用户可以任< /p>


意输入盘子数目;



< br>4


)用户可以通过单击


Hannoi

塔界面上提供的按钮,让程序自动完成把


A


座上的盘子全部 移动到


C


座上;



5



用户在移动盘子的过程中,


可以随时单击


Hannoi


塔界面上提 供的按钮,


重新开始当前的级别;




6


)有计时功能,即显示用户完成移动盘子所花费的时间;




7


)用户可以 设置最大和最小盘子的大小;




8< /p>


)用户可以选择播放和暂停背景音乐;




9


)用户可以设置盘子的颜色以及背景的颜色;




10


)用户可以将自动 移动盘子的文本信息保存到文件。



1.2


需实现的主要功能




1


)完成汉诺塔的“手工移动演示”





2


)完成汉诺塔的“自 动移动演示”




< br>3


)具有计时功能,即显示用户完成移动盘子所花费的时间;



4


)用户可以设置最大和最小 盘子的大小;




5

< br>)用户可以选择播放和暂停背景音乐;




6


)用户可以设置盘子的数目;


< br>(


7


)用户可以设置盘子的颜色以及背景的颜色;




8


)用户可以将 自动移动盘子的文本信息保存到文件。



2


.需求分析



2.1


界面及布局设计


< p>
系统的整体布局为:


BorderLayout


布 局


,


采用了菜单、按钮、面板



等组件,


菜单主要包括选择级别


,


盘子个数


,


选择颜色


,


设置大小,按钮的功能包括重新开


始,自动演示,播放,循环, 停止,保存,演示,暂停,继续,关闭。



2.2 A



B



C


座的实现方法



Tower

< p>
类是



包中


JPanel< /p>


容器的一个子类,创建的对象


tower



HannoiWindow


窗口的成员之一,被添加到


HannoiWindow


窗口的中心位置。标



Tower


类的主要成员变量和方法以及和


HannoiWindow


类之间组合关系的


UML< /p>


图如图


1-1


所示。


JPanel


Tower


amo untOfDisc: int


disc: Disc[]


pointA,pointB,pointC: TowerPoint[]


towerName: char[]


handleMouse: HandleMouse


m axDiscWidth,minDiscWidth


autoMoveDisc: AutoMoveDisc


discHeight: int


Tower(char[]):


无类型


setAmountOfDisc(int): voi d


setMaxDiscWidth(int):void


se tMinDiscWidth(int): void


setDiscHeight(int): void


getAutoMoveDisc(): AutoMoveDisc


putDiscOnTower(): void


removeDisk(): void


paintComponent(Graphics): void


HannoiWindow


tower: Tower


-------------------





1-1 Tower


类的


UML



< p>
以下是


UML


图中有关数据和方法的详细说明。< /p>



1


、成员变量



(1)amountOfDisc



i nt


型数据。


amountOfDisc


值用来确定


tower


对象中盘子


的 数目,即确定


tower


对象中


Dis c


类型数组


disc


的长度。



(2)disc



D isc


型数组,该数组的长度由


amountOfDisc


值来确定。


Disc


数组

< br>的每个单元中存放一个


Disc


对象,依次表明


tower


对象中有怎样多的盘子。



(3)towerName



char


型数组,长度为


3


,其三个单元的默认取值依次 是


A



B


和< /p>


C



towerName


是数组的单元的值用来确定


tower


中三个座的名字 。



(4)maxDiscWidth



minDiscWidth


的值分别用来确定最大盘子的宽度 和最小


盘子的宽度,


discHeight

的值确定每个盘子的高度。



(5)pointA



pointB



po intC


都是


TowerPoint


型 数组,


三个数组的长度与盘子


数目相同,


即都是


amountOfDisc



pointA



pointB



pointC


单元都是


TowerPoint


创建对象,分别用来表示


Hannoi


塔中三个座上的塔点。


A


座、


B


座和


C


座上的


三个塔 点分别由


pointA



pointB



pointC


中的单元来确定。每个 座上的三个塔


点都是从座顶依次对应数组的相应单元中的


Tow erPoint


对象。例如,


A


座最上


面的塔点是


pointA[0]


,中间 的塔点是


pointA[1]


,最下面的塔点是


pointA[2]




(6 )handleMouse



HandleMouse


类创建的鼠标事件监视器,


用来监视


disc< /p>



组的


Disc


对象上触发的鼠标事件。



(7)autoMoveDisc< /p>



AutoMoveDisc


创建的对话 框。


通过该对话框可以实现程


序自动移动盘子。



2


、方法



(1)Tower(char[])


是构造方法,负责完成

tower


容器的初始化。



(2 )tower


容器调用


setAmountOfDisc(in t)


方法可以设置


amountOfDisc

< br>的值。



(3)tower


容器 调用


setMaxDiscWidth(int)


方法可以设置 最大的盘子的大小。



(4) tower

容器调用


setMinDiscWidth(int)


方法 可以设置最小的盘子的大小。



(5) tower

< p>
容器调用


setDiscHeight(int)


方法可以设置盘子的高度。



(6)


tower


容器调用


putDiscOnTower


()


方法可以将盘子放置在


Hannoi


塔的


A


座上,即在


p ointA


指定的塔点上放置


disc


数组的成员。



(7) tower


容器调用


getAutoMoveDisc ()< /p>


方法返回其中的


AutoMoveDisc


对象:


autoMoveDisc



tower



HannoiWindow


窗口中的成员,


当用户单击


HannoiWindow


窗口中的


autoButton


按钮时,窗口 中的


actionPerformed(ActionEvent)

方法将被执


行,该方法所进行的操作是让


tower


对象返回其中的


AutoMoveDisc


对 象,该对


象是一个对话框,用户可以通过该对话框让程序自动地移动盘子。



(8) tower


容器调用


removeDisk ()


方法可以移调


tower


容器中的盘子。

< p>


(9)


tower


容 器调用


paintComponent


(Graphics)


方法绘制出塔点的位置和必要


的视图。



综上所述,


Tower


创建的容器效果 如图


1-2


所示。





1-2 Tower


创建的容器



2.3


圆盘的实现方法



Disc

< p>
类是



包中


Jbutton


类的子类,所创建的对象称作


Hannoi


中的


“盘子”



Tower


类有


Disc


类型 的数组


disc



Disc

< p>
数组的单元是用


Disc


创建

的对象,被放置在


Tower


所创建的容器


tower


中,用来表示


tower

< br>中的“盘子”



标明


Disc< /p>


类的主要成员变量、方法以及和


Tower


类之间组合关系的


UML


如图


1-3


所示。



JButton


Disc


nunber: int


point: T owerPoint


----------------------

< br>Disc():


无类型


setNumber(int n): void


getNunber(): int


setPoint(TowerPoint):


void












getPoint(): TowerPoint


Tower


disc: Disc[]


-------------------




























1-3



Disc


类的


UML




以下是


UML


图中有关数据和方法的详 细说明。



1


、成员变量



(1) number


的值确定所创建的“盘子”上的数字号码 ,通过该号码的大小来确定


盘子的大小关系,即号码大的盘子大于号码小的盘子。



(2)point



TowerPoint


对象,是


Disc

所创建的“盘子”的一个重要成员。


“盘子”


< p>
被放置在


tower


容器的塔点上


(TowerPoint


对象称作塔点


)



“盘子”


通过使用


poi nt


对象表明自己所在的塔点。



2


、方法



( 1)Disc()


构造方法。创建盘子对象时需要使用该构造方法。


(2)setNumber(int)


。盘子调用该方法 设置其上的数字号码。



(3)getNumber()


方法。盘子调用该方法返回其上的数字号码。



(4)setPoint(TowerPoint)


方法。盘子调用该方法设置其所在 的塔点。



(5)getPoint()


方法。盘子调用该方法返回其所在的塔点。



因此

< p>
Disc


创建的按钮的效果如图


1-4

< p>
所示。





1-4 Disc


创建的三个按钮



2.4


添加背景音乐的方法







为了在 应用程序中播放音乐,首先根据相应的音频文件创建一个


File


对象,


例如:









File file=new File(

< br>“


十年


.Wav



);


然后,


file


对象 调用


toURL()


方法返回一个


UR L


对象,例如:









URL url=();


最后,使 用


Applet


类的静态方法返回一个音频对象,例如:









clip=ioClip(url);


2.5


改变背景和盘子颜色的方法



可以用< /p>



包中的


JcolorChooser


类的静态方法:



Public


static


Color


showDialog(Component


component,


String


title,Color


initialColor)


创建一个颜色对话框,其中参数


component

< br>指定对话框所依赖的组


件;


title

< br>指定对话框的标题;


initialColor


指定对话 框返回的初始颜色,即对话框


消失后,


返回的默认值。


颜色对话框可根据用户在颜色对话框中选择的颜色返回


一个颜色对象。< /p>








本程序代码中,当用户单击选择颜 色菜单的下拉菜单项盘子颜色或背景颜


色,


都将弹出相应的颜色 对话框,


然后根据用户选择的颜色来改变盘子或背景的


颜色。< /p>



2.6


记录时间方法



Java



1.2


版本后提供了一个很方便的


Timer


类,该类在



包中。


当某些操作需要周期性地执行,


就可以使用计时器。

< p>
可以使用


Timer


类的构造方

< br>法:


Timer(int a,Object b)


创建 一个计时器,其中的参数


a


的单位是毫秒,确定计


时器每隔


a


毫秒“震铃”一次,参数


b


是计时器的监视器。计时器发生的震铃事


件是


ActionEvent


类型事件。当震铃事件发生时,监视器就会监 视到这个事件,


就会执行接口


ActionListener< /p>


中的方法


actionPerformed


就被执行一次。当想让计


时器只震铃一次时,可以让计时器调用


setReapeats(boolean b)


方法,参数


b


的值



false

< br>即可。当使用


Timer(int


a,Object


b)


创建计时器,对象


b


就自动地成了计


时器的监视器,不必像其他组件


(< /p>


比如按钮


)


那样,使用特定的方法获得监 视器,


但负责创建监视器的类必须实现接口


Actionlis tener.


如果使用


Timer(int

< br>a)


创建计


时器,计时器必须再明显地调用


addActionListener(ActionListener


l istener)


方法获


得监视器。另外,计时器也还可以调用


setInitialDelay(int


depay)


设置首次震铃的


延时,如果没有使用该方法进行设置,首次震铃的延 时为


a




计 时器创建后,使用


Timer


类的方法


start()


启动计时器,即启动线程。使用


Timer


类的方法


stop()


停止计时器,即挂起 线程。使用


restart()


重新启动计时器,


即恢复线程。



本程序中,


单击


“显示当前时间”


按钮启动计时器,


并将时间显示在文本框


中;


单击


“暂 停当前时间”


按钮计时器暂时停止计时;


单击

< br>“重新显示当前时间”



按钮重新启动计时器。



2.7


文件保存方法



我们可以使用文件对话 框方便地打开和保存文件,


因为文件对话框可以使


用户很方便地 选择文件所在的目录以及文件的名字。


FileDialog



Dialog



的子类,它创建的对象 称为文件对话框。文件对话框是一个打开文件和保存文


件的有模式对话框。文件对话框必 须依赖一个


Frame


对象。



FileDialog


类有下列主要方法:



(1)FileDialog(Frame


f,String


s,int


mode)


构造方法



参数


f


是所创建的对话


框所 依赖的窗口对象,


s


是对话框的名字,


mode


的取值为



< br>,


决定对话是打开文件模型或保存文件模型,如图


1-5


所示。






1-5


文件对话框



(2)public String getDirectory()


返回当前文件对话框中显示的文件


的所属目录。



(3)public String getFile()


返回当前文件对话框中显示的文件的字符


串表示,如果不存在就返回


null




当文件对话框处于激活状态时,在“文件名”输入栏中输入文件名之后 ,


无论单击对话框中的“打开”按钮或“取消”按钮,对话框都自动消失,不能


实现对文件的打开或保存操作,因为文件对话框仅仅提供了一个操作的界面,

要真正实现对文件的操作,应学习文件的输入输出流。需要注意的是,只有单


击了文 件对话框上的批准按钮


(


“打开”、


“ 保存”


)


后,


getFile()


才能返回非


空的字符串对象。


< p>
本程序中,单击“保存”按钮时,将出现“保存文件对话框”


< p>



3


.总体设计



3.1


总体功能图



扫雷游戏主界面








< p>







设置


音乐













盘< /p>









< p>
1-6


总体功能图




3.2


总体流程图



开始


处理菜单和按


钮等事件


选 择菜单


默认


选择按钮














色< /p>









< p>





N


是否成功







< br>颜



N


是否成功







Y


N


是否成功


Y


Y


N


是否成功


Y


显示对应的操作


结束




1-7


总体流程图


奴隶英雄-


奴隶英雄-


奴隶英雄-


奴隶英雄-


奴隶英雄-


奴隶英雄-


奴隶英雄-


奴隶英雄-