题目一 汉诺塔
奴隶英雄-
题目一
汉诺塔
1
.设计内容及要求
1.1
汉诺塔算法的基本要求
(
1
)
p>
设计
GUI
界面的
Hannoi
塔。
Hannoi
塔中有
三个座,名字分别是
A
、
B
和
C
。初始状态是
A
p>
座上有
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
)有计时功能,即显示用户完成移动盘子所花费的时间;
p>
(
7
)用户可以
设置最大和最小盘子的大小;
(
8<
/p>
)用户可以选择播放和暂停背景音乐;
(
9
)用户可以设置盘子的颜色以及背景的颜色;
(
10
)用户可以将自动
移动盘子的文本信息保存到文件。
1.2
需实现的主要功能
(
1
)完成汉诺塔的“手工移动演示”
;
(
2
)完成汉诺塔的“自
动移动演示”
;
(
< br>3
)具有计时功能,即显示用户完成移动盘子所花费的时间;
(
4
)用户可以设置最大和最小
盘子的大小;
(
5
< br>)用户可以选择播放和暂停背景音乐;
(
6
)用户可以设置盘子的数目;
< br>(
7
)用户可以设置盘子的颜色以及背景的颜色;
(
8
)用户可以将
自动移动盘子的文本信息保存到文件。
2
.需求分析
2.1
界面及布局设计
系统的整体布局为:
BorderLayout
布
局
,
采用了菜单、按钮、面板
…
p>
等组件,
菜单主要包括选择级别
,
盘子个数
,
选择颜色
,
设置大小,按钮的功能包括重新开
始,自动演示,播放,循环,
停止,保存,演示,暂停,继续,关闭。
2.2
A
、
B
、
C
座的实现方法
Tower
类是
包中
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
图
以下是
UML
图中有关数据和方法的详细说明。<
/p>
1
、成员变量
(1)amountOfDisc
是
i
nt
型数据。
amountOfDisc
值用来确定
tower
对象中盘子
的
数目,即确定
tower
对象中
Dis
c
类型数组
disc
的长度。
(2)disc
是
D
isc
型数组,该数组的长度由
amountOfDisc
p>
值来确定。
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
容器调用
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
容器中的盘子。
(9)
tower
容
器调用
paintComponent
(Graphics)
方法绘制出塔点的位置和必要
的视图。
综上所述,
Tower
创建的容器效果
如图
1-2
所示。
图
1-2
Tower
创建的容器
2.3
圆盘的实现方法
Disc
类是
包中
Jbutton
类的子类,所创建的对象称作
Hannoi
塔
中的
“盘子”
。
Tower
类有
Disc
类型
的数组
disc
。
Disc
数组的单元是用
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
所创建的“盘子”的一个重要成员。
“盘子”
被放置在
tower
容器的塔点上
(TowerPoint
对象称作塔点
)
,
“盘子”
通过使用
poi
nt
对象表明自己所在的塔点。
2
、方法
(
1)Disc()
构造方法。创建盘子对象时需要使用该构造方法。
(2)setNumber(int)
。盘子调用该方法
设置其上的数字号码。
(3)getNumber()
方法。盘子调用该方法返回其上的数字号码。
(4)setPoint(TowerPoint)
方法。盘子调用该方法设置其所在
的塔点。
(5)getPoint()
方法。盘子调用该方法返回其所在的塔点。
因此
Disc
创建的按钮的效果如图
1-4
所示。
图
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
p>
类的静态方法:
Public
static
Color
showDialog(Component
component,
String
title,Color
initialColor)
创建一个颜色对话框,其中参数
component
< br>指定对话框所依赖的组
件;
title
< br>指定对话框的标题;
initialColor
指定对话
框返回的初始颜色,即对话框
消失后,
返回的默认值。
颜色对话框可根据用户在颜色对话框中选择的颜色返回
一个颜色对象。<
/p>
本程序代码中,当用户单击选择颜
色菜单的下拉菜单项盘子颜色或背景颜
色,
都将弹出相应的颜色
对话框,
然后根据用户选择的颜色来改变盘子或背景的
颜色。<
/p>
2.6
记录时间方法
Java
的
1.2
版本后提供了一个很方便的
Timer
类,该类在
包中。
当某些操作需要周期性地执行,
就可以使用计时器。
可以使用
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)
p>
设置首次震铃的
延时,如果没有使用该方法进行设置,首次震铃的延
时为
a
。
计
时器创建后,使用
Timer
类的方法
start()
启动计时器,即启动线程。使用
Timer
p>
类的方法
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()
返回当前文件对话框中显示的文件
p>
的所属目录。
(3)public
String getFile()
返回当前文件对话框中显示的文件的字符
串表示,如果不存在就返回
null
。
当文件对话框处于激活状态时,在“文件名”输入栏中输入文件名之后
,
无论单击对话框中的“打开”按钮或“取消”按钮,对话框都自动消失,不能
实现对文件的打开或保存操作,因为文件对话框仅仅提供了一个操作的界面,
要真正实现对文件的操作,应学习文件的输入输出流。需要注意的是,只有单
击了文
件对话框上的批准按钮
(
“打开”、
“
保存”
)
后,
getFile()
p>
才能返回非
空的字符串对象。
本程序中,单击“保存”按钮时,将出现“保存文件对话框”
。
3
.总体设计
3.1
总体功能图
扫雷游戏主界面
选
择
级
别
初
中
高
自
级
级
级
定
义
设置
音乐
盘
子
颜
播
循
停
大
色
放
环
止
小
盘<
/p>
背
子
景
颜
颜
色
色
图
1-6
总体功能图
3.2
总体流程图
开始
处理菜单和按
钮等事件
选
择菜单
默认
选择按钮
级
别
选
择
设
置
盘
子
大
小
设
置
颜
色<
/p>
重
新
开
始
自
动
演
示
音
乐
控
制
N
是否成功
盘
子
颜
色
背
景
< br>颜
色
N
是否成功
播
放
循
环
停
止
Y
N
是否成功
Y
Y
N
是否成功
Y
显示对应的操作
结束
p>
图
1-7
总体流程图