1、把B杆上的n-1个盘子借助A杆移到B杆。概要设计:1.课程设计内容:有三个表示塔的对象,分别命名为A、B和C。A塔上有若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A塔上,大盘在下,小盘在上。用户可以用鼠标拖动盘子,把A 塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。用户也可以选择让程序自动演示。选择自动演示后,程序将以动画形式演示把A塔上的盘子全部移到C塔的过程。2.课程设计功能:(1)设计GUI界面的汉诺塔。汉诺塔中有三个座,名字分别是A、B和C。初始状态是A座上有四个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次
2、摆放在A座上。(2)程序要求用户在移动盘子过程中,不允许把大盘子放在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。(3)用户可以通过单击汉诺塔菜单栏的菜单提供的按钮,让程序自动完成把A座上的盘子全部移动到B座或C座上。(4)用户在移动盘子的过程中,可以随时单击汉诺塔菜单栏的菜单提供的按钮,重新开始游戏。3.流程图:程序的调试与分析:1.游戏主界面图 1 主界面 此时游戏的初始盘子为4个,用户直接点击方块进行拖拽移动,移动到所需要的位置。2.移动盘子图 2 拖拽盘子 依次拖拽盘子,直至盘子移动到B塔或者C塔。3.移动成功图 3 移动成功 将所有的盘子移动到B塔或者C塔,就
3、会自动弹出“亲,恭喜你完成游戏!”。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 点击游戏攻略“简单:四层”“难易程度”-“简单:四层”,游戏就会自动演
4、示游戏攻略8.游戏介绍图 8 游戏介绍 点击“确定”按钮或者是点击“关闭”按钮,“游戏介绍”窗口将关闭9.工作人员图 8 工作人员点击“确定”按钮或者是点击“关闭”按钮,“工作人员”窗口将关闭10.课程设计时遇到的困难及解决方法 10.1 课程设计时遇到的困难 10.1.1 课程设计过程中原想盘子通过图片形式显示,但是实现不了 10.1.2 课程设计过程中盘子的位置不好控制 10.1.3 课程设计过程中显示字体用标签形式显示,但是这样有的不太协调 10.1.4 课程设计过程中原本要加入移动盘子的步数和所用时间,但是不太容易解决 10.2 课程设计时遇到困难的解决方法 10.2.1 为了解决盘子
5、的显示,将盘子的显示方式改为二维作图方式 10.2.2 为了解决控制盘子的位置,将盘子放置在一个四边形的容器中,然后通过四边形容器的左上角坐标和四边形容器的宽和高来空值盘子的位置 10.2.3 为了解决显示文字的位置协调问题,将文字通过二维作图方式绘制 10.2.4 由于时间和精力有限,用户移动盘子的步数和所用时间从功能中删除程序清单:源代码:package hannuota;import java.awt.*;import java.awt.event.*;import javax.swing.*;/游戏界面public class Hannuota extends JFrame imple
6、ments ActionListener, Runnable JFrame f; HannoiTower tower=null; char towerName=A,BC; int DiskCount,DiskWidth,DiskHeight; Thread thread; /定义声明菜单栏及菜单栏内的菜单,菜单项 JMenuBar caidanlan=new JMenuBar(); JMenu youxi=new JMenu(游戏); JMenuItem chongxinkaishi=new JMenuItem(重新开始 JMenuItem nanyichengdu=new JMenuItem
7、(难易程度 JMenuItem tuichu=new JMenuItem(退出 JMenu bangzhu=new JMenu(帮助 JMenuItem youxijieshao=new JMenuItem(游戏介绍 JMenuItem gongzuorenyuan=new JMenuItem(工作人员 JMenu youxigonglue=new JMenu(游戏攻略 JMenuItem jiandan=new JMenuItem(简单:四层 JMenuItem zhongdeng=new JMenuItem(中等:五层 JMenuItem kunnan=new JMenuItem(困难:六
8、层 JMenuItem chaonan=new JMenuItem(超难:七层 public Hannuota() thread=new Thread(this); DiskCount=4; DiskWidth=150; DiskHeight=20; tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName); /声明字体设置的初始值 Font font=new Font(宋体,Font.PLAIN,14); Font font1=new Font(,Font.PLAIN,16); /设置布局格式和各个组件的位置 add(to
9、wer,BorderLayout.CENTER); /添加菜单栏中的菜单和菜单项 setJMenuBar(caidanlan); caidanlan.add(youxi); caidanlan.add(bangzhu); youxi.add(chongxinkaishi); youxi.addSeparator(); youxi.add(nanyichengdu); youxi.add(tuichu); bangzhu.add(youxigonglue); bangzhu.addSeparator(); bangzhu.add(youxijieshao); bangzhu.add(gongzu
10、orenyuan); 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.addA
11、ctionListener(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); you
12、xijieshao.setFont(font); gongzuorenyuan.setFont(font); youxigonglue.setFont(font); jiandan.setFont(font); zhongdeng.setFont(font); kunnan.setFont(font); chaonan.setFont(font); public void run() this.remove(tower); tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName); validate(); tower.zid
13、ongyanshi(DiskCount,towerName0 ,towerName1,towerName2); /点击事件响应 public void actionPerformed(ActionEvent e) String cmd=e.getActionCommand(); String title=; String message= int type; /定义弹出对话框的类型对象 if(cmd.equals() int response = JOptionPane.showConfirmDialog(this, 立即开始一个新游戏吗?,重新开始提示消息 JOptionPane.YES_N
14、O_OPTION, JOptionPane.INFORMATION_MESSAGE); if (response = JOptionPane.NO_OPTION) return; else if(!(thread.isAlive() this.remove(tower); tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName); add(tower,BorderLayout.CENTER); validate(); int messageType=JOptionPane.QUESTION_MESSAGE; String r
15、esult= String values=, title= message=请选择游戏的难以级别: result=(String)JOptionPane.showInputDialog(this,message,title,messageType,null,values,values0); if(result=) DiskCount=4; this.remove(tower); tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName); add(tower,BorderLayout.CENTER); validate();
16、DiskCount=5; DiskCount=6; DiskCount=7;您要退出游戏吗?退出提示消息 else System.exit(0); type=JOptionPane.PLAIN_MESSAGE;游戏介绍:汉诺塔又称河内塔,汉诺塔是源于印度一个古老的益智传说:n + 上帝创造世界的时候做了三根金刚石柱,在一根柱子上从下往n + 上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下n 面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小n 圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。n操作说明:直接通过鼠标左击按下鼠标,然后进行拖拽,拖到相应的位置n JOptio
17、nPane.showMessageDialog(this,message,title,type);设计者 组长:李万东n 组员:袁雪娇n张 瑜n if(e.getSource()=jiandan) DiskCount=4; this.remove(tower); tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName); add(tower,BorderLayout.CENTER); validate(); if(! thread=new Thread(this); try thread.start(); catch(Exc
18、eption eee) if(e.getSource()=zhongdeng) DiskCount=5; if(e.getSource()=kunnan) DiskCount=6; if(e.getSource()=chaonan) DiskCount=7; /主方法 public static void main(String args) Hannuota f=new Hannuota(); f.setTitle(汉诺塔游戏 f.setBounds(300, 200, 800, 450); f.setVisible(true); /手动搬运盘子class Disk extends Butto
19、n int number; boolean TopDisk=false; public Disk(int number,HannoiTower con) this.number=number; setBackground(Color.black); addMouseMotionListener(con); addMouseListener(con); public boolean getTopDisk() /getTopDisk:获得上方的盘子 return TopDisk; public void setTopDisk(boolean b) /setTopDisk:放置上方的盘子 TopDisk=b; public int getNumber() /getNumber:获得盘子的数量 return number;class TowerPoint int x,y; boolean HDi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1