汉诺塔课程设计报告.docx
- 文档编号:4073542
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:35
- 大小:352.01KB
汉诺塔课程设计报告.docx
《汉诺塔课程设计报告.docx》由会员分享,可在线阅读,更多相关《汉诺塔课程设计报告.docx(35页珍藏版)》请在冰豆网上搜索。
汉诺塔课程设计报告
汉诺塔游戏
学院:
理学院
班级:
信科102班
组长:
李万东
组员1:
袁雪娇
组员2:
张瑜
设计期限2012年3月1开始
至2012年6月20结束
课程设计题目:
汉诺塔游戏
课程设计目的:
《JAVA程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
随着社会的进步,我们用来娱乐的游戏世界也越来越丰富,越来越复杂。
本程序的汉诺塔游戏不但包括了游戏最基本的功能,而且还能培养用户的逻辑思维能力,同时也给玩家提供了一定的娱乐空间。
本游戏还包括一个自动演示搬移汉诺塔的功能,此功能能够帮助初次接触此游戏的用户了解此游戏的玩法。
课程设计理论:
本程序要求实现用图形界面,画出3个杆和若干个大小不一的矩形盘子,形成3个塔,分别为A塔,B塔,C塔,同时盘子数目可以人工设定。
用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。
用户在移动盘子的过程中,可以随时单击汉诺塔菜单栏的菜单中提供的按钮,重新开始游戏,并且可以通过单击汉诺塔菜单栏的菜单提供的按钮,让程序自动完成把A塔上的盘子全部移动到C塔上,实现自动演示。
汉诺塔算法属于递归算法,该算法过程为:
假定要把n个盘子按题目规定由A杆借助B杆移动到C杆。
第一步:
先把上面的n-1个盘子借助C杆放到B杆。
第二步:
把第n个盘子从A杆直接移到C杆。
第三步:
把B杆上的n-1个盘子借助A杆移到B杆。
概要设计:
1.课程设计内容:
有三个表示塔的对象,分别命名为A、B和C。
A塔上有若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A塔上,大盘在下,小盘在上。
用户可以用鼠标拖动盘子,把A塔上的盘子全部移动到另外两个塔中的任何一个塔上。
要求每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。
用户也可以选择让程序自动演示。
选择自动演示后,程序将以动画形式演示把A塔上的盘子全部移到C塔的过程。
2.课程设计功能:
(1)设计GUI界面的汉诺塔。
汉诺塔中有三个座,名字分别是A、B和C。
初始状态是A座上有四个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。
用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。
(2)程序要求用户在移动盘子过程中,不允许把大盘子放在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。
(3)用户可以通过单击汉诺塔菜单栏的菜单提供的按钮,让程序自动完成把A座上的盘子全部移动到B座或C座上。
(4)用户在移动盘子的过程中,可以随时单击汉诺塔菜单栏的菜单提供的按钮,重新开始游戏。
3.流程图:
程序的调试与分析:
1.游戏主界面
图1主界面
此时游戏的初始盘子为4个,用户直接点击方块进行拖拽移动,移动到所需要的位置。
2.移动盘子
图2拖拽盘子
依次拖拽盘子,直至盘子移动到B塔或者C塔。
3.移动成功
图3移动成功
将所有的盘子移动到B塔或者C塔,就会自动弹出“亲,恭喜你完成游戏!
!
!
”。
4.重新开始
图4-1点击“重新开始”
点击“游戏”->“重新开始”,就会弹出窗口,如图4-2
图4-2重新开始
点击“是”,会重新绘制盘子,回复的初始位置;点击“否”,游戏将继续
5.难易程度
图5-1点击“难易程度”
点击“游戏”->“难易程度”就会弹出窗口5-2
图5-2选择难以级别
在“难易程度”窗口中点击下拉按钮就会出现图5-3
图5-3难以程度
6.四种级别比较
图6-1简单:
四层图6-2中等:
五层
图6-3困难:
五层图6-4中等:
超难
7.游戏攻略
图7-1点击游戏攻略“简单:
四层”
点击“游戏”->“难易程度”->“简单:
四层”,游戏就会自动演示游戏攻略
8.游戏介绍
图8游戏介绍
点击“确定”按钮或者是点击“关闭”按钮,“游戏介绍”窗口将关闭
9.工作人员
图8工作人员
点击“确定”按钮或者是点击“关闭”按钮,“工作人员”窗口将关闭
10.课程设计时遇到的困难及解决方法
10.1课程设计时遇到的困难
10.1.1课程设计过程中原想盘子通过图片形式显示,但是实现不了
10.1.2课程设计过程中盘子的位置不好控制
10.1.3课程设计过程中显示字体用标签形式显示,但是这样有的不太协调
10.1.4课程设计过程中原本要加入移动盘子的步数和所用时间,但是不太容易解决
10.2课程设计时遇到困难的解决方法
10.2.1为了解决盘子的显示,将盘子的显示方式改为二维作图方式
10.2.2为了解决控制盘子的位置,将盘子放置在一个四边形的容器中,然后通过四边形容器的左上角坐标和四边形容器的宽和高来空值盘子的位置
10.2.3为了解决显示文字的位置协调问题,将文字通过二维作图方式绘制
10.2.4由于时间和精力有限,用户移动盘子的步数和所用时间从功能中删除
程序清单:
源代码:
packagehannuota;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
//游戏界面
publicclassHannuotaextendsJFrameimplementsActionListener,Runnable
{
JFramef;
HannoiTowertower=null;
chartowerName[]={'A','B','C'};
intDiskCount,DiskWidth,DiskHeight;
Threadthread;
//定义声明菜单栏及菜单栏内的菜单,菜单项
JMenuBarcaidanlan=newJMenuBar();
JMenuyouxi=newJMenu("游戏");
JMenuItemchongxinkaishi=newJMenuItem("重新开始");
JMenuItemnanyichengdu=newJMenuItem("难易程度");
JMenuItemtuichu=newJMenuItem("退出");
JMenubangzhu=newJMenu("帮助");
JMenuItemyouxijieshao=newJMenuItem("游戏介绍");
JMenuItemgongzuorenyuan=newJMenuItem("工作人员");
JMenuyouxigonglue=newJMenu("游戏攻略");
JMenuItemjiandan=newJMenuItem("简单:
四层");
JMenuItemzhongdeng=newJMenuItem("中等:
五层");
JMenuItemkunnan=newJMenuItem("困难:
六层");
JMenuItemchaonan=newJMenuItem("超难:
七层");
publicHannuota()
{
thread=newThread(this);
DiskCount=4;
DiskWidth=150;
DiskHeight=20;
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
//声明字体设置的初始值
Fontfont=newFont("宋体",Font.PLAIN,14);
Fontfont1=newFont("宋体",Font.PLAIN,16);
//设置布局格式和各个组件的位置
add(tower,BorderLayout.CENTER);
//添加菜单栏中的菜单和菜单项
setJMenuBar(caidanlan);
caidanlan.add(youxi);
caidanlan.add(bangzhu);
youxi.add(chongxinkaishi);
youxi.addSeparator();
youxi.add(nanyichengdu);
youxi.addSeparator();
youxi.add(tuichu);
bangzhu.add(youxigonglue);
bangzhu.addSeparator();
bangzhu.add(youxijieshao);
bangzhu.add(gongzuorenyuan);
youxigonglue.add(jiandan);
youxigonglue.add(zhongdeng);
youxigonglue.add(kunnan);
youxigonglue.add(chaonan);
//给菜单项注册事件监听者
chongxinkaishi.addActionListener(this);
nanyichengdu.addActionListener(this);
tuichu.addActionListener(this);
youxijieshao.addActionListener(this);
gongzuorenyuan.addActionListener(this);
jiandan.addActionListener(this);
zhongdeng.addActionListener(this);
kunnan.addActionListener(this);
chaonan.addActionListener(this);
//设置菜单及菜单项的字体、字形、字号
youxi.setFont(font);
bangzhu.setFont(font);
chongxinkaishi.setFont(font);
nanyichengdu.setFont(font);
tuichu.setFont(font);
youxijieshao.setFont(font);
gongzuorenyuan.setFont(font);
youxigonglue.setFont(font);
jiandan.setFont(font);
zhongdeng.setFont(font);
kunnan.setFont(font);
chaonan.setFont(font);
}
publicvoidrun()
{
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
tower.zidongyanshi(DiskCount,towerName[0],towerName[1],towerName[2]);
}
//点击事件响应
publicvoidactionPerformed(ActionEvente)
{
Stringcmd=e.getActionCommand();
Stringtitle="";
Stringmessage="";
inttype;//定义弹出对话框的类型对象
if(cmd.equals("重新开始"))
{
intresponse=JOptionPane.showConfirmDialog(this,
"立即开始一个新游戏吗?
",
"重新开始提示消息",
JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE);
if(response==JOptionPane.NO_OPTION)
return;
else
{
if(!
(thread.isAlive()))
{
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
}
}
}
if(cmd.equals("难易程度"))
{
intmessageType=JOptionPane.QUESTION_MESSAGE;
Stringresult="";
String[]values={"简单:
四层","中等:
五层","困难:
六层","超难:
七层"};
title="难易程度";
message="请选择游戏的难以级别:
";
result=(String)JOptionPane.showInputDialog(this,message,title,messageType,null,values,values[0]);
if(result=="简单:
四层")
{
DiskCount=4;
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
}
if(result=="中等:
五层")
{
DiskCount=5;
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
}
if(result=="困难:
六层")
{
DiskCount=6;
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
}
if(result=="超难:
七层")
{
DiskCount=7;
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
}
}
if(cmd.equals("退出"))
{
intresponse=JOptionPane.showConfirmDialog(this,
"您要退出游戏吗?
",
"退出提示消息",
JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE);
if(response==JOptionPane.NO_OPTION)
return;
else
System.exit(0);
}
if(cmd.equals("游戏介绍"))
{
type=JOptionPane.PLAIN_MESSAGE;
title="游戏介绍";
message="游戏介绍:
汉诺塔又称河内塔,汉诺塔是源于印度一个古老的益智传说:
\n"+
"上帝创造世界的时候做了三根金刚石柱,在一根柱子上从下往\n"+
"上按大小顺序摞着64片黄金圆盘。
上帝命令婆罗门把圆盘从下\n"+
"面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小\n"+
"圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
\n"+
"\n操作说明:
直接通过鼠标左击按下鼠标,然后进行拖拽,拖到相应的位置\n";
JOptionPane.showMessageDialog(this,message,title,type);
}
if(cmd.equals("工作人员"))
{
type=JOptionPane.PLAIN_MESSAGE;
title="工作人员";
message="设计者组长:
李万东\n"+
"组员:
袁雪娇\n"+
"组员:
张瑜\n";
JOptionPane.showMessageDialog(this,message,title,type);
}
if(e.getSource()==jiandan)
{
DiskCount=4;
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
if(!
(thread.isAlive()))
{
thread=newThread(this);
}
try
{
thread.start();
}
catch(Exceptioneee)
{
}
}
if(e.getSource()==zhongdeng)
{
DiskCount=5;
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
if(!
(thread.isAlive()))
{
thread=newThread(this);
}
try
{
thread.start();
}
catch(Exceptioneee)
{
}
}
if(e.getSource()==kunnan)
{
DiskCount=6;
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
if(!
(thread.isAlive()))
{
thread=newThread(this);
}
try
{
thread.start();
}
catch(Exceptioneee)
{
}
}
if(e.getSource()==chaonan)
{
DiskCount=7;
this.remove(tower);
tower=newHannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);
add(tower,BorderLayout.CENTER);
validate();
if(!
(thread.isAlive()))
{
thread=newThread(this);
}
try
{
thread.start();
}
catch(Exceptioneee)
{
}
}
}
//主方法
publicstaticvoidmain(String[]args)
{
Hannuotaf=newHannuota();
f.setTitle("汉诺塔游戏");
f.setBounds(300,200,800,450);
f.setVisible(true);
}
}
//手动搬运盘子
classDiskextendsButton
{
intnumber;
booleanTopDisk=false;
publicDisk(intnumber,HannoiTowercon)
{
this.number=number;
setBackground(Color.black);
addMouseMotionListener(con);
addMouseListener(con);
}
publicbooleangetTopDisk()//getTopDisk:
获得上方的盘子
{
returnTopDisk;
}
publicvoidsetTopDisk(booleanb)//setTopDisk:
放置上方的盘子
{
TopDisk=b;
}
publicintgetNumber()//getNumber:
获得盘子的数量
{
returnnumber;
}
}
classTowerPoint
{
intx,y;
booleanHDi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汉诺塔 课程设计 报告