汉诺塔小游戏文档格式.docx
《汉诺塔小游戏文档格式.docx》由会员分享,可在线阅读,更多相关《汉诺塔小游戏文档格式.docx(41页珍藏版)》请在冰豆网上搜索。
![汉诺塔小游戏文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/17/f3ef1463-94f2-44df-850d-ff2bd391c3d6/f3ef1463-94f2-44df-850d-ff2bd391c3d61.gif)
2.耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
四、要求的设计(调查/论文)成果
1.课程设计报告
2.课程设计软件
五、进程安排
布置任务,查找资料、需求分析1天
总体设计1天
详细设计1.5天
编制源程序实现3.5天
测试与修改1天
撰写课设报告2天
六、主要参考资料
[1]张广彬.Java课程设计案例精编(第二版).北京:
清华大学出版社,2011.
[2]耿祥义.Java课程设计(第二版).北京:
清华大学出版社,2008.
[3]耿祥义.JAVA大学实用教程.北京:
[4]邹林达.陈国君Java2程序设计基础.北京:
清华大学出版社,2010.
[5]邹林达.Java2程序设计基础实验指导.北京:
清华大学,2010.
指导教师(签名):
20年月日
目录
1需求与总体设计……………………………………………………………………………1
1.1软件需求………………………………………………………………………1
1.2功能说明………………………………………………………………………1
1.3界面功能图………………………………………………………………………………1
1.4主界面布局图……………………………………………………………………………2
1.5功能和类………………………………………………………………………………3
2详细设计…………………………………………………………………………………4
2.1主界面布局实现………………………………………………………………4
2.2游戏设置界面………………………………………………………………………4
2.3三座基塔的实现………………………………………………………………………4
2.3.1成员变量………………………………………………………………………5
2.3.2成员方法………………………………………………………………………6
3编码实现…………………………………………………………………………………7
3.1MainWindow类………………………………………………………………………7
3.2GamesetDialog类……………………………………………………………………13
3.3HandleMouse类………………………………………………………………………16
3.4AutoMoveDisc类…………………………………………………………………………19
3.5Tower类………………………………………………………………………25
3.6Disc类………………………………………………………………………………29
3.7TowerPoint类…………………………………………………………………………30
4系统测试…………………………………………………………………………………32
4.1初始化界面………………………………………………………………………………32
4.2改变颜色………………………………………………………………………………32
4.3电脑演示………………………………………………………………………………33
4.4游戏设置界面………………………………………………………………………34
总结…………………………………………………………………………………35
1需求与总体设计
1.1软件说明
设计GUI界面的Hannoi塔。
1.2功能要求
(1)程序要求用户在移动盘子的过程中,不允许吧大盘子放置在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。
(2)用户既可以通过Hannoi塔界面的提供的改变盘子数目功能来改变盘子的数目,同时改变盘子的大小以及改变盘子和界面的背景颜色,也可以通过游戏设置按钮来设置相关参数。
(3)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。
(4)用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始。
1.3界面功能图
图1-1界面功能图
1.4主界面布局图
图1-2主界面布局图
1.5类和功能
表1-1类和功能
类
功能说明
MainWindow.java
设置主界面的布局、相关按钮和监听事件
Disc.java
JButton的子类,负责实现Hannoi中的“盘子“视图
AutoMoveDisc.java
利用递归算法来实现电脑自动移动盘子到达目标状态
HandleMoveDisc.java
手工操作移动盘子,监视tower容器中Disc盘子对象上的鼠标事件。
(当用户用鼠标单击tower中的盘子disc,并拖动鼠标时,handleMouse对象负责给出移动盘子的有关算法)
Tower.java
塔的设置以及三座塔基座的布局显示整个框架的中心
GamesetDialog.java
游戏设置对话框,用来设置游戏的相关参数
TowerPoint.Java
用来表明塔点的位置坐标,位置通过tower容器的pointComponent(Graphicsg)方法绘制。
绘制形状为一个个小圆点
2详细设计
2.1主界面布局实现
采用BorderLayout布局方式,使用south,east,center三个区域。
在east区域中添加east容器,并在east容器中添加JLabelscriptionJButtonautomove,restart,setJTextFieldrequiredtime;
五个控件;
在center区域添加center容器并添加初始化状态中的Tower;
在south区域添加south容器并放置由JRadioButton组成的ButtonGroup。
让界面不能随意改变大小:
setResizable(false)。
2.2游戏设置界面实现
通过点击游戏设置按钮调用GamesetDialog.java类来创建窗口。
在GamesetDialog.java类里面创建JDialog作为游戏设置窗口,并设置其属性为模态,这样可以使得子窗口没有关闭的情况下不能对父窗口执行操作。
布局方式为setLayout(null),然后对每个控件进行绝对定位。
2.3三座基塔的实现
Tower类是javax.swing包中JPanel容器的一个子类,创建的对象tower是HannoiWindow窗口的成员之一,被添加到MainWindow窗口的中心位置。
Tower通过
paintComponent(Graphicsg)来绘制
2.3.1成员变量
(1)amountOfDisc是int型数据。
amountOfDisc值用来确定tower对象中盘子的数目,tower对象中Disc类型数组disc的长度。
(2)disc是Disc型数组,该数组的长度由amountOfDisc值来确定。
Disc数组的每个单元中存放一个Disc对象,依次表明tower对象中有怎样多的盘子。
(3)towerName是char型数组,长度为3,其三个单元的默认取值依次是A、B和C。
towerName是数组的单元的值用来确定tower中三个座的名字。
(4)maxDiscWidth和minDiscWidth的值分别用来确定最大盘子的宽度和最小盘子的宽度,discHeight的值确定每个盘子的高度。
(5)pointA、pointB和pointC都是TowerPoint型数组,三个数组的长度与盘子数目相同,即都是amountOfDisc。
pointA、pointB和pointC单元都是TowerPoint创建对象,分别用来表示Hannoi塔中三个座上的塔点。
A座、B座和C座上的三个塔点分别由pointA、pointB和pointC中的单元来确定。
每个座上的三个塔点都是从座顶依次对应数组的相应单元中的TowerPoint对象。
(6)handleMouse是HandleMouse类创建的鼠标事件监视器,用来监视disc数组的Disc对象上触发的鼠标事件。
(7)autoMoveDisc是AutoMoveDisc创建的对话框。
通过该对话框可以实现程序自动移动盘子。
2.3.2方法
(1)Tower(char[])是构造方法,负责完成tower容器的初始化。
(2)tower容器调用setAmountOfDisc(int)方法可以设置amountOfDisc的值。
(3)tower容器调用setMaxDiscWidth(int)方法可以设置最大的盘子的大小。
(4)tower容器调用setMinDiscWidth(int)方法可以设置最小的盘子的大小。
(5)tower容器调用setDiscHeight(int)方法可以设置盘子的高度。
(6)tower容器调用putDiscOnTower()方法可以将盘子放置在Hannoi塔的A座上,即在pointA指定的塔点上放置disc数组的成员。
(7)tower容器调用getAutoMoveDisc()方法返回其中的AutoMoveDisc对象:
autoMoveDisc。
tower是HannoiWindow窗口中的成员,当用户单击HannoiWindow窗口中的autoButton按钮时,窗口中的actionPerformed(ActionEvent)方法将被执行,该方法所进行的操作是让tower对象返回其中的AutoMoveDisc对象,该对象是一个对话框,用户可以通过该对话框让程序自动地移动盘子。
(8)tower容器调用removeDisk()方法可以移调tower容器中的盘子。
(9)tower容器调用paintComponent(Graphics)方法绘制出塔点的位置和必要的视图。
3编码实现
3.1MainWindow.java
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassMainWindowextendsJFrameimplementsActionListener{//游戏主界面的显示以及控件的布局
JLabelscription;
JButtonautomove,restart,gameset;
publicstaticJTextFieldrequiredtime;
publicJRadioButtoncyan,red,green,blue,yellow;
publicButtonGroupbuttonGroup;
GamesetDialoggamesetdialog;
HandleMousehandleMouseTime;
Towertower;
ColordiscColor;
Timertime=newTimer(1000,this);
char[]towerName={'
A'
'
B'
C'
};
//容器tower中三个座的名字
intamountOfDisc=3,number=0;
GridLayoutgrid=newGridLayout(8,1,120,20);
//设置网格式布局,4行一列//水平间距120,垂直间距40
JPanelcenter=newJPanel();
JPanelsouth=newJPanel();
JPaneleast=newJPanel(grid);
publicMainWindow(){
super("
梵塔"
);
scription=newJLabel("
游戏说明"
scription.setToolTipText("
把A座上的盘子全部移动到B座或C座上"
scription.setForeground(Color.red);
automove=newJButton("
电脑演示"
automove.addActionListener(this);
restart=newJButton("
重新开始"
restart.addActionListener(this);
requiredtime=newJTextField("
您的游戏时间:
0秒"
10);
gameset=newJButton("
游戏设置"
gameset.addActionListener(this);
east.add(scription);
east.add(automove);
east.add(restart);
east.add(gameset);
east.add(requiredtime);
east.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
//设置east面板中控件与面板边缘的间隙
add(east,BorderLayout.EAST);
tower=newTower(towerName);
tower.setAmountOfDisc(amountOfDisc);
tower.setMaxDiscWidth(120);
tower.setMinDiscWidth(50);
tower.setDiscHeight(16);
tower.putDiscOnTower();
add(tower,BorderLayout.CENTER);
buttonGroup=newButtonGroup();
cyan=newJRadioButton("
原色"
red=newJRadioButton("
红色"
green=newJRadioButton("
绿色"
blue=newJRadioButton("
蓝色"
yellow=newJRadioButton("
黄色"
cyan.setFont(newFont("
楷体"
Font.BOLD,14));
red.setFont(newFont("
green.setFont(newFont("
blue.setFont(newFont("
yellow.setFont(newFont("
buttonGroup.add(cyan);
buttonGroup.add(red);
buttonGroup.add(green);
buttonGroup.add(blue);
buttonGroup.add(yellow);
rHandlerh=newrHandler();
//创建监听器
cyan.addItemListener(h);
red.addItemListener(h);
green.addItemListener(h);
blue.addItemListener(h);
yellow.addItemListener(h);
JPanelsouthColor=newJPanel();
south.add(cyan);
south.add(red);
south.add(green);
south.add(blue);
south.add(yellow);
add(south,BorderLayout.SOUTH);
setResizable(false);
//设置窗口大小固定
setVisible(true);
setBounds(300,150,680,480);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
time.start();
}
publicclassrHandlerimplementsItemListener{
publicvoiditemStateChanged(ItemEventevent){
if(cyan.isSelected())
tower.setBackground(newColor(200,236,236));
elseif(red.isSelected())
tower.setBackground(Color.red);
elseif(green.isSelected())
tower.setBackground(Color.green);
elseif(blue.isSelected())
tower.setBackground(Color.blue);
elseif(yellow.isSelected())
tower.setBackground(Color.yellow);
}
publicvoidsetAmountOfDisc(intnumber,intmax,intmin,Colordisccolor){//设置一个改变游戏参数的方法
if(number<
=1)
amountOfDisc=1;
//如果参数number小于等于1,盘指数设为1;
else
amountOfDisc=number;
if(time.isRunning()==false){time.restart();
handleMouseTime.ALL=0;
}
number=0;
requiredtime.setText("
"
+number+"
秒"
tower.setMaxDiscWidth(max);
tower.setMinDiscWidth(min);
tower.disccolor(disccolor);
tower.putDiscOnTower();
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==automove){
tower.setAmountOfDisc(amountOfDisc);
intx=this.getBounds().x+this.getBounds().width;
inty=this.getBounds().y;
tower.getAutoMoveDisc().setLocation(x,y);
tower.getAutoMoveDisc().setSize(380,this.getBounds().height);
tower.getAutoMoveDisc().setVisible(true);
}elseif(e.getSource()==restart){//"
重新开始”按钮动作监听处理方法
if(time.isRunning()==false){
time.restart();
handleMouseTime.ALL=0;
}
number=0;
+number+"
tower.putDiscOnTower();
}elseif(e.getSource()==gameset){
newGamesetDialog(this);
if(e.getSource()==time){
if(handleMouseTime.Start==1){
requiredtime.setText("
number++;
if(handleMouseTime.ALL==1){
time.stop();
handleMouseTime.Start=0;
JOptionPane.showMessageDialog(null,"
祝贺您,成功完成了!
"
消息框"
JOptionPane.PLAIN_MESSAGE);
publicstaticvoidmain(String[]args){
finalMainWindowss=newMainWindow();
3.2GamesetDialog.java
importjava.awt.BorderLayout;
importja