汉诺塔游戏学院:理学院班级:信科102班组长:李万东组员1:袁雪娇组员2:张瑜设计期限2012 年3月1开始至2012年6月20 结束课程设计题目:汉诺塔游戏课程设计目的:《JA V A程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JA V A程序设计》课程后,进行的一次全面的综合训练,JA V A程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
随着社会的进步,我们用来娱乐的游戏世界也越来越丰富,越来越复杂。
本程序的汉诺塔游戏不但包括了游戏最基本的功能,而且还能培养用户的逻辑思维能力,同时也给玩家提供了一定的娱乐空间。
本游戏还包括一个自动演示搬移汉诺塔的功能,此功能能够帮助初次接触此游戏的用户了解此游戏的玩法。
课程设计理论:本程序要求实现用图形界面,画出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.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 由于时间和精力有限,用户移动盘子的步数和所用时间从功能中删除程序清单:源代码:package hannuota;import java.awt.*;import ;import javax.swing.*;//游戏界面public class Hannuota extends JFrame implements ActionListener, Runnable{JFrame f;HannoiTower tower=null;char towerName[]={'A','B','C'};int DiskCount,DiskWidth,DiskHeight;Thread thread;//定义声明菜单栏及菜单栏内的菜单,菜单项JMenuBar caidanlan=new JMenuBar();JMenu youxi=new JMenu("游戏");JMenuItem chongxinkaishi=new JMenuItem("重新开始");JMenuItem nanyichengdu=new JMenuItem("难易程度");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("困难:六层");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(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);}public void run(){this.remove(tower);tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);add(tower,BorderLayout.CENTER);validate();tower.zidongyanshi(DiskCount,towerName[0] ,towerName[1],towerName[2]); }//点击事件响应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_NO_OPTION,RMA TION_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("难易程度")){int messageType=JOptionPane.QUESTION_MESSAGE;String result="";String[] values={"简单:四层","中等:五层","困难:六层","超难:七层"};title="难易程度";message="请选择游戏的难以级别:";result=(String)JOptionPane.showInputDialog(this,message,title,messageType,null,values,val ues[0]);if(result=="简单:四层"){DiskCount=4;this.remove(tower);tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);add(tower,BorderLayout.CENTER);validate();}if(result=="中等:五层"){DiskCount=5;this.remove(tower);tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);add(tower,BorderLayout.CENTER);}if(result=="困难:六层"){DiskCount=6;this.remove(tower);tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);add(tower,BorderLayout.CENTER);validate();}if(result=="超难:七层"){DiskCount=7;this.remove(tower);tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);add(tower,BorderLayout.CENTER);validate();}}if(cmd.equals("退出")){int response = JOptionPane.showConfirmDialog(this,"您要退出游戏吗?","退出提示消息",JOptionPane.YES_NO_OPTION,RMA TION_MESSAGE);if (response == JOptionPane.NO_OPTION)return;elseSystem.exit(0);}if(cmd.equals("游戏介绍")){type=JOptionPane.PLAIN_MESSAGE;title="游戏介绍";message="游戏介绍:汉诺塔又称河内塔,汉诺塔是源于印度一个古老的益智传说:\n" +" 上帝创造世界的时候做了三根金刚石柱,在一根柱子上从下往\n" +" 上按大小顺序摞着64片黄金圆盘。