汉诺塔课程设计报告.doc_第1页
汉诺塔课程设计报告.doc_第2页
汉诺塔课程设计报告.doc_第3页
汉诺塔课程设计报告.doc_第4页
汉诺塔课程设计报告.doc_第5页
免费预览已结束,剩余27页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java课程设计汉诺塔游戏学院: 理学院 班级: 信科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)用户在移动盘子的过程中,可以随时单击汉诺塔菜单栏的菜单提供的按钮,重新开始游戏。GetDisk()TowerPointIfHdisk()TowerPoint()getY()setHDisk()PushDisk()getX()run()Hannuota()HannuotaactionPerformed()Main()HannoiTowerHannoiTower()paintComponent()mousePressed()mouseClicked()mouseMoved()mouseEntered()人mouseReleased()mouseDragged()mouseExited()DiskgetTopDisk()setTopDisk()Disk()getNumber()汉诺塔游戏3.流程图:zidongyanshi()TopDisk()TopEnd()TopStart()程序的调试与分析: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 由于时间和精力有限,用户移动盘子的步数和所用时间从功能中删除程序清单:源代码:package hannuota;import java.awt.*;import java.awt.event.*;import javax.swing.*;/游戏界面public class Hannuota extends JFrame implements ActionListener, RunnableJFrame 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,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_NO_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(); if(cmd.equals(难易程度) int messageType=JOptionPane.QUESTION_MESSAGE; String result=; 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();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,JOptionPane.INFORMATION_MESSAGE); if (response = JOptionPane.NO_OPTION) return; elseSystem.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=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName); add(tower,BorderLayout.CENTER); validate(); if(!(thread.isAlive() thread=new Thread(this); try thread.start(); catch(Exception eee) if(e.getSource()=zhongdeng) DiskCount=5; this.remove(tower); tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);add(tower,BorderLayout.CENTER); validate();if(!(thread.isAlive() thread=new Thread(this); try thread.start(); catch(Exception eee) if(e.getSource()=kunnan) DiskCount=6; this.remove(tower); tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);add(tower,BorderLayout.CENTER); validate();if(!(thread.isAlive() thread=new Thread(this); try thread.start(); catch(Exception eee) if(e.getSource()=chaonan) DiskCount=7; this.remove(tower); tower=new HannoiTower(DiskCount,DiskWidth,DiskHeight,towerName);add(tower,BorderLayout.CENTER); validate(); if(!(thread.isAlive() thread=new Thread(this); try thread.start(); catch(Exception eee) /主方法public static void main(String args) Hannuota f=new Hannuota(); f.setTitle(汉诺塔游戏); f.setBounds(300, 200, 800, 450); f.setVisible(true); /手动搬运盘子class Disk extends Buttonint 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 HDisk; /HDisk:有盘子 Disk disk=null; HannoiTower con=null; public TowerPoint(int x,int y,boolean boo) this.x=x; this.y=y; HDisk=boo; public boolean IfHdisk() /IfHdisk:如果有盘子 return HDisk; public void setHDisk(boolean boo) /setHDisk:设置有盘子 HDisk=boo; public int getX() /getX:得到横坐标X return x; public int getY() /getY:得到纵坐标Y return y; public void PushDisk(Disk disk,HannoiTower con) /PushDisk:按下盘子按钮 this.con=con; con.setLayout(null); this.disk=disk; con.add(disk); int w=disk.getBounds().width; int h=disk.getBounds().height; disk.setBounds(x-w/2,y-h/2,w,h); HDisk=true; con.validate(); public Disk GetDisk() /GetDisk:获得盘子 return disk; class HannoiTower extends JPanel implements MouseListener,MouseMotionListenerTowerPoint point; int x,y; boolean move=false; Disk disk; int startX,startY; int startI ; int DiskCount=0; int width,height; char towerName=A,B,C; public HannoiTower(int number,int w,int h,char name)towerName=name; DiskCount=number; width=w; height=h; setLayout(null); addMouseListener(this); addMouseMotionListener(this); disk= new DiskDiskCount; point=new TowerPoint3*DiskCount; /画出塔中的点 int space=0; for(int i=0;iDiskCount;i+) pointi=new TowerPoint(40+width,100+space,false); space=space+height; space=0; for(int i=DiskCount;i2*DiskCount;i+) pointi=new TowerPoint(240+width,100+space,false); space=space+height; space=0; for(int i=2*DiskCount;i3*DiskCount;i+) pointi=new TowerPoint(440+width,100+space,false); space=space+height; /画出盘子 int tempWidth=width-120; int sub=(int)tempWidth; for(int i=0;i=DiskCount-1;i+) diski=new Disk(i,this); diski.setSize(tempWidth,height); tempWidth=tempWidth+sub; for(int i=0;i=1) diski.setTopDisk(true); /画出盘子中所需要的几条直线和所需要的文字public void paintComponent(Graphics g) Font font2=new Font(宋体,Font.BOLD+Font.PLAIN,22); supe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论