汉诺塔小游戏.docx

上传人:b****6 文档编号:12147965 上传时间:2023-06-04 格式:DOCX 页数:50 大小:155.75KB
下载 相关 举报
汉诺塔小游戏.docx_第1页
第1页 / 共50页
汉诺塔小游戏.docx_第2页
第2页 / 共50页
汉诺塔小游戏.docx_第3页
第3页 / 共50页
汉诺塔小游戏.docx_第4页
第4页 / 共50页
汉诺塔小游戏.docx_第5页
第5页 / 共50页
汉诺塔小游戏.docx_第6页
第6页 / 共50页
汉诺塔小游戏.docx_第7页
第7页 / 共50页
汉诺塔小游戏.docx_第8页
第8页 / 共50页
汉诺塔小游戏.docx_第9页
第9页 / 共50页
汉诺塔小游戏.docx_第10页
第10页 / 共50页
汉诺塔小游戏.docx_第11页
第11页 / 共50页
汉诺塔小游戏.docx_第12页
第12页 / 共50页
汉诺塔小游戏.docx_第13页
第13页 / 共50页
汉诺塔小游戏.docx_第14页
第14页 / 共50页
汉诺塔小游戏.docx_第15页
第15页 / 共50页
汉诺塔小游戏.docx_第16页
第16页 / 共50页
汉诺塔小游戏.docx_第17页
第17页 / 共50页
汉诺塔小游戏.docx_第18页
第18页 / 共50页
汉诺塔小游戏.docx_第19页
第19页 / 共50页
汉诺塔小游戏.docx_第20页
第20页 / 共50页
亲,该文档总共50页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汉诺塔小游戏.docx

《汉诺塔小游戏.docx》由会员分享,可在线阅读,更多相关《汉诺塔小游戏.docx(50页珍藏版)》请在冰点文库上搜索。

汉诺塔小游戏.docx

汉诺塔小游戏

《面向对象程序设计》

课程设计报告

 

题目:

Hanonoi塔游戏___

院(系):

专业班级:

学生姓名:

_

学号:

指导教师:

 

2013年6月8日至2013年6月21日

华中科技大学武昌分校制

面向对象程序设计课程设计任务书

一、设计(调查报告/论文)题目

Hannoi塔游戏

二、设计(调查报告/论文)主要内容

内容:

设计GUI界面的Hannoi塔。

汉诺塔中有三个座,名字分别为A,B,C。

初始状态时A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。

用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。

释放鼠标来放置该盘子

基本功能与要求:

1程序要求用户在移动盘子的过程中,不允许吧大盘子放置在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。

2用户可以通过Hannoi塔界面的提供的改变盘子数目功能来改变盘子的数目,同时可以改变盘子的大小以及改变盘子和界面的背景颜色,而且还可以选择控制背景音乐的播放。

3用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。

4用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始。

 

三、原始资料

1.《面向对象程序设计课程设计》指导书

2.耿祥义.JAVA大学实用教程.北京:

清华大学出版社,2009.

四、要求的设计(调查/论文)成果

1.课程设计报告

2.课程设计软件

五、进程安排

布置任务,查找资料、需求分析1天

总体设计1天

详细设计1.5天

编制源程序实现3.5天

测试与修改1天

撰写课设报告2天

六、主要参考资料

[1]张广彬.Java课程设计案例精编(第二版).北京:

清华大学出版社,2011.

[2]耿祥义.Java课程设计(第二版).北京:

清华大学出版社,2008.

[3]耿祥义.JAVA大学实用教程.北京:

清华大学出版社,2009.

[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塔。

汉诺塔中有三个座,名字分别为A,B,C。

初始状态时A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。

用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。

释放鼠标来放置该盘子

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("楷体",Font.BOLD,14));

green.setFont(newFont("楷体",Font.BOLD,14));

blue.setFont(newFont("楷体",Font.BOLD,14));

yellow.setFont(newFont("楷体",Font.BOLD,14));

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.setAmountOfDisc(amountOfDisc);

tower.setMaxDiscWidth(max);

tower.setMinDiscWidth(min);

tower.disccolor(disccolor);

tower.putDiscOnTower();

}

publicvoidactionPerformed(ActionEvente){

if(e.getSource()==automove){

tower.setAmountOfDisc(amountOfDisc);

tower.putDiscOnTower();

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;

requiredtime.setText("您的游戏时间:

"+number+"秒");

tower.setAmountOfDisc(amountOfDisc);

tower.putDiscOnTower();

}elseif(e.getSource()==gameset){

newGamesetDialog(this);

}

if(e.getSource()==time){

if(handleMouseTime.Start==1){

requiredtime.setText("您的游戏时间:

"+number+"秒");

number++;

}

if(handleMouseTime.ALL==1){

time.stop();

handleMouseTime.Start=0;

JOptionPane.showMessageDialog(null,"祝贺您,成功完成了!

","消息框",

JOptionPane.PLAIN_MESSAGE);

}

}

validate();

}

publicstaticvoidmain(String[]args){

finalMainWindowss=newMainWindow();

}

}

3.2GamesetDialog.java

importjava.awt.BorderLayout;

import

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2