面向对象程序设计JAVA课程设计.docx
- 文档编号:16119170
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:30
- 大小:323.20KB
面向对象程序设计JAVA课程设计.docx
《面向对象程序设计JAVA课程设计.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计JAVA课程设计.docx(30页珍藏版)》请在冰点文库上搜索。
面向对象程序设计JAVA课程设计
面向对象课程设计
题目汉诺塔游戏程序功能实现
学院鸟学院
专业计算机科学与技术
班级计算机00
学号1234567890--
学生姓名李永刚
指导教师李永刚
编写日期2011年7月7日
目录
一、需求分析3
1.1界面及布局设计3
1.2A、B、C座的实现方法3
1.3圆盘的实现方法4
1.4记录时间方法4
二、系统运行环境5
三、功能需求描述5
四、总体设计6
4.1总体功能图6
4.2总体流程图7
五、主要功能设计流程8
5.1A、B、C座实现流程图8
5.2圆盘画法流程图9
5.3保存流程图9
5.4时间流程图10
六、程序模块设计11
6.1运行效果图11
6.2程序代码设计12
七、总结12
一、
需求分析
1.1界面及布局设计
系统的整体布局为:
BorderLayout布局,采用了菜单、按钮、面板…等组件,菜单主要包括选择级别,盘子个数,选择颜色,设置大小,按钮的功能包括重新开始,自动演示,播放,循环,停止,保存,演示,暂停,继续,关闭。
1.2A、B、C座的实现方法
Tower类是javax.swing包中JPanel容器的一个子类,创建的对象tower是HannoiWindow窗口的成员之一,被添加到HannoiWindow窗口的中心位置。
标明Tower类的主要成员变量和方法以及和HannoiWindow类之间组合关系的UML图如图1-1所示。
图1-1Tower类的UML图
成员变量
(1)amountOfDisc是int型数据。
用来确定tower对象中盘子的数目。
(2)disc是Disc型数组,Disc数组的每个单元中存放一个Disc对象,依次表明tower对象中有怎样多的盘子。
(3)towerName是char型数组,长度为3,即A、B、C。
(4)maxDiscWidth和minDiscWidth的值分别用来确定最大盘子的宽度和最小盘子的宽度,discHeight的值确定每个盘子的高度。
(5)pointA、pointB和pointC都是TowerPoint型数组,三个数组的长度与盘子数目相同,分别用来表示Hannoi塔中三个座上的塔点。
A座、B座和C座上的三个塔点分别由pointA、pointB和pointC中的单元来确定。
每个座上的三个塔点都是从座顶依次对应数组的相应单元中的TowerPoint对象。
(6)handleMouse是HandleMouse类创建的鼠标事件监视器,用来监视disc数组的Disc对象上触发的鼠标事件。
(7)autoMoveDisc是AutoMoveDisc创建的对话框。
通过该对话框可以实现程序自动移动盘子。
1.3圆盘的实现方法
Disc类是javax.swing包中Jbutton类的子类,所创建的对象称作Hannoi塔中的“盘子”。
标明Disc类的主要成员变量、方法以及和Tower类之间组合关系的UML如图1-3所示。
图1-2Disc类的UML图
1、成员变量
(1)number的值确定所创建的“盘子”上的数字号码。
(2)point是TowerPoint对象,表明自己所在的塔点。
1.4记录时间方法
Timer类,该类在javax.swing包中。
当某些操作需要周期性地执行,就可以使用计时器。
可以使用Timer类的构造方法:
Timer(inta,Objectb)创建一个计时器,其中的参数a的单位是毫秒,确定计时器每隔a毫秒“震铃”一次,参数b是计时器的监视器。
计时器发生的震铃事件是ActionEvent类型事件。
计时器创建后,使用Timer类的方法start()启动计时器,即启动线程。
使用Timer类的方法stop()停止计时器,即挂起线程。
使用restart()重新启动计时器,即恢复线程。
本程序中,单击“显示当前时间”按钮启动计时器,并将时间显示在文本框中;单击“暂停当前时间”按钮计时器暂时停止计时;单击“重新显示当前时间”
按钮重新启动计时器。
二、系统运行环境
硬件要求能运行Windows9.X操作系统的微机系统。
JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。
三、功能需求描述
(1)设计Hannoi塔中有三个座,名字分别是A、B和C。
初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。
用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;
(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上;
(3)用户可以通过Hannoi塔界面提供的菜单来选择初级、中级、高级和自定义四个级别。
初级级别A座上有3个大小不等盘子、中级级别A座上有4个大小不等盘子、高级级别A座上有5个大小不等盘子、自定义级别A座用户可以任意输入盘子数目;
(4)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上;
(5)用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始当前的级别;
(6)有计时功能,即显示用户完成移动盘子所花费的时间;
(7)用户可以设置最大和最小盘子的大小;
(8)用户可以选择播放和暂停背景音乐;
(9)用户可以设置盘子的颜色以及背景的颜色;
(10)用户可以将自动移动盘子的文本信息保存到文件。
四、总体设计
1总体功能图
图1-3总体功能图
2总体流程图
图1-4总体流程图
五、主要功能设计流程
1A、B、C座实现流程图
图1-5A、B、C座实现流程图
2圆盘画法流程图
图1-6圆盘画法流程图
3保存流程图
图1-7文件保存流程图
4时间流程图
图1-8记录时间流程图
六、程序模块设计
6间接关系图
图1-9类之间的组合关系图
7运行效果图
图1-10运行主界面效果图
图1-11自动演示效果图
图1-12设置盘子颜色效果图
图1-13设置盘子大小效果图
8程序代码设计
HannoiWindow实现
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
importjava.util.*;
importjava.io.*;
import.*;
importjava.applet.*;
publicclassHannoiWindowextendsJFrameimplementsActionListener{
Towertower=null;
intamountOfDisc=3;
char[]towerName={'A','B','C'};
JMenuBarbar;
JMenumenuGrade;
booleantag=true;
intt=0;//用在计时中的变量
javax.swing.TimersecondTime;
Filefile=newFile("91.mid");
URLurl;
AudioClipclip;
JMenumenusetDisc;//加入代码
JMenuItemsetDiscAcount,setDiscWidth,setDiscColor;
JMenumenumusic;
JLabeltimetext;
JMenuItemoneGradeItem,twoGradeItem,threeGradeItem,musicstart,musicstop;
JButtonrenew=null;
JButtonautoButton=null;
JPanelcenter=newJPanel();
HannoiWindow(){
t=0;//用在计时中
tower=newTower(towerName);
tower.setAmountOfDisc(amountOfDisc);
tower.setMaxDiscWidth(120);
tower.setMinDiscWidth(50);
tower.setDiscHeight(16);
tower.putDiscOnTower();
add(tower,BorderLayout.CENTER);
bar=newJMenuBar();
menuGrade=newJMenu("选择级别");
oneGradeItem=newJMenuItem("初级");
twoGradeItem=newJMenuItem("中级");
threeGradeItem=newJMenuItem("高级");
menuGrade.add(oneGradeItem);
menuGrade.add(twoGradeItem);
menuGrade.add(threeGradeItem);
bar.add(menuGrade);
menusetDisc=newJMenu("设置盘子");//加入代码
menumusic=newJMenu("设置背景音乐");
setDiscColor=newJMenuItem("设置盘子颜色");
setDiscWidth=newJMenuItem("设置盘子大小");
setDiscAcount=newJMenuItem("设置盘子数目");
musicstart=newJMenuItem("背景音乐开启");
musicstop=newJMenuItem("背景音乐关闭");
menusetDisc.add(setDiscColor);
menusetDisc.add(setDiscAcount);
menusetDisc.add(setDiscWidth);
menumusic.add(musicstart);
menumusic.add(musicstop);
bar.add(menusetDisc);
bar.add(menumusic);
secondTime=newjavax.swing.Timer(1000,this);
secondTime.start();
timetext=newJLabel();
try{
url=file.toURL();
clip=Applet.newAudioClip(url);
}catch(Exceptionex){
}
clip.play();
tag=true;
setJMenuBar(bar);
setDiscColor.addActionListener(this);//加入下3行代码
setDiscWidth.addActionListener(this);
setDiscAcount.addActionListener(this);
musicstart.addActionListener(this);
musicstop.addActionListener(this);
oneGradeItem.addActionListener(this);
twoGradeItem.addActionListener(this);
threeGradeItem.addActionListener(this);
renew=newJButton("重新开始");
renew.addActionListener(this);
autoButton=newJButton("自动演示");
autoButton.addActionListener(this);
JPanelnorth=newJPanel();
JPanelsouth=newJPanel();/////////////////////////
south.add(timetext);
north.add(renew);
north.add(autoButton);
Stringmess="将全部盘子从"+towerName[0]+"座搬运到"+towerName[1]+"座或"+towerName[2]+"座";
JLabelhintMess=newJLabel(mess,JLabel.CENTER);
north.add(hintMess);
add(north,BorderLayout.NORTH);
add(south,BorderLayout.SOUTH);
setResizable(false);
setVisible(true);
setBounds(60,60,460,410);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==oneGradeItem){
amountOfDisc=3;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
t=0;
}elseif(e.getSource()==twoGradeItem){
amountOfDisc=4;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
t=0;
}elseif(e.getSource()==threeGradeItem){
amountOfDisc=5;
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
t=0;
}elseif(e.getSource()==renew){
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
t=0;
}elseif(e.getSource()==autoButton){
tower.setAmountOfDisc(amountOfDisc);
tower.putDiscOnTower();
intx=this.getBounds().x+this.getBounds().width;
inty=this.getBounds().y;
tower.getAutoMoveDisc().setLocation(x,y);
tower.getAutoMoveDisc().setSize(280,this.getBounds().height);
tower.getAutoMoveDisc().setVisible(true);
}elseif(e.getSource()==setDiscColor)//添加以下代码
{
SetDiscColorDlgcolorDlg=newSetDiscColorDlg(this,tower);
}elseif(e.getSource()==setDiscWidth){
SetDiscWidthDlgwidthDlg=newSetDiscWidthDlg(this,tower);
t=0;
}elseif(e.getSource()==setDiscAcount){
SetDiscAcountDlgacountDlg=newSetDiscAcountDlg(this,tower);
amountOfDisc=tower.amountOfDisc;
t=0;
}elseif(e.getSource()==secondTime)//计时处理
{
inthour,minute,second,a;
Stringmytimer,strsec,strmin,strhour;
t=t%(60*60*24);
second=t%60;
a=t/60;
minute=a%60;
hour=a/60;
if(second<=9){
strsec="0"+String.valueOf(second);
}else{
strsec=String.valueOf(second);
}
if(minute<=9){
strmin="0"+String.valueOf(minute);
}else{
strmin=String.valueOf(minute);
}
if(hour<=9){
strhour="0"+String.valueOf(hour);
}else{
strhour=String.valueOf(hour);
}
mytimer=strhour+":
"+strmin+":
"+strsec;
timetext.setText("计时:
"+mytimer);
t=t+1;
}
elseif(e.getSource()==musicstart){
if(tag==false){
try{
url=file.toURL();
clip=Applet.newAudioClip(url);
}catch(Exceptionex){
}
clip.play();
tag=true;
}
}
elseif(e.getSource()==musicstop){
if(tag==true){
clip.stop();
tag=false;
}
}
validate();
}
publicstaticvoidmain(Stringargs[]){
newHannoiWindow();
}
}
AutoMoveDisc类实现
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.io.*;
publicclassAutoMoveDiscextendsJDialogimplementsActionListener{
intamountOfDisc=3;
TowerPoint[]pointA,pointB,pointC;
char[]towerName;
Containercon;
StringBuffermoveStep;
JTextAreashowStep;
JButtonbStart,bStop,bContinue,bClose,bSave;
Timertime;
FileDialogsaveDlg;
inti=0,number=0;
AutoMoveDisc(Containercon){
setModal(true);
setTitle("自动演示搬盘子过程");
this.con=con;
moveStep=newStringBuffer();
time=newTimer(1000,this);
time.setInitialDelay(10);
showStep=newJTextArea(10,12);
bStart=newJButton("演示");
bStop=newJButton("暂停");
bContinue=newJButton("继续");
bClose=newJButton("关闭");
bSave=newJButton("保存");
bStart.addActionListener(this);
bStop.addActionListener(this);
bContinue.addActionListener(this);
bClose.addActionListener(this);
bSave.addActionListener(this);
JPanelsouth=newJPanel();
south.setLayout(newFlowLayout());
south.add(bStart);
south.add(bStop);
south.add(bContinue);
south.add(bSave);
south.add(bClose);
saveDlg=newFileDialog(this,"保存到文件",FileDialog.SAVE);
saveDlg.setVisible(false);
saveDlg.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
saveDlg.setVisible(false);
}
});
add(newJScrollPane(showStep),BorderLayout.CENTER);
add(south,BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
towerName=newchar[3];
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 JAVA 课程设计