




免费预览已结束,剩余34页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HUBEI NORMAL UNIVERSITYJava程序设计 Hannoi塔游戏论文题目Hannoi塔游戏学 生 指导教师 所在院系 专业名称 完成时间摘 要JAVA语言实用教程是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完JAVA语言实用教程课程后,进行的一次全面的综合训练,JAVA语言实用教程的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。目录一、课程设计任务及要求41、课程设计任务42、设计要求4二、需求分析51、系统需求分析52、系统概述53、系统运行环境6三、设计思路6概要设计7四、详细设计7package Hannoi;7HannoiWindow类7AutoMoveDisc类15Disc类21HandleMouse类22Tower类27TowerPoint 类31五、运行调试与分析讨论33六、设计体会与小结361.设计体会362.小结36参考文献37致谢37一、课程设计任务及要求1、课程设计任务设计GUI界面的Hannoi塔游戏,用户可以通过拖动鼠标移动各个塔上的盘子,程序也可以自动演示盘子的移动过程。2、设计要求(1)有三个表示塔的对象,分别命名为A、B和C。A塔上有若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A塔上,大盘在下,小盘在上。用户可以用鼠标拖动盘子,把A 塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。(2)用户也可以选择让程序自动演示。选择自动演示后,程序将以动画形式演示把A塔上的盘子全部移到C塔的过程,并将移动过程以文本形式显示在一个文本区中。(3)可以由用户自己设置盘子数量和盘子大小。(4)可以改变盘子的颜色、背景颜色以及背景音乐。(5)游戏分为初、中、高三个等级。(6)可以记录游戏时间并且设有从新开始按钮。二、需求分析1、系统需求分析使用java面向对象语言设计汉诺塔游戏,此游戏要求:1)界面要求:(1)尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。(2)如果无法实现图形界面,则在命令行方式下也需要提供菜单,方便用户操作(盘子可以自己规定)。 2)其他要求:可以保存自己的自动演示记录3)每次移动一个盘子,小的只能叠在大的上面。4)把所有碟子从A塔柱全部移到C塔柱上如果A盘上的盘子全都移动到了C塔柱上,则游戏成功;否则失败。(1)标识符命名遵循Windows命名规范。(2)能够注意各种异常处理,注重提高程序运行效率。2、系统概述 “汉诺塔”游戏是利用面向对象语言java写的一个简单的游戏,它的目标是把最左边塔柱上的盘子按一定的规则移动到最右过的塔柱上去,规则如下:(1)有三根塔柱A,B,C。A杆上有若干盘子(由小到大排列)(2)需要把A上的盘子搬到C上面去(由小到大排列)(3)每次只能移动一个盘子且大的盘子不能叠加到小的盘子上面3、系统运行环境 任何具有jre运行环境的计算机,可在netbeans和eclipse中运行。三、设计思路我设计的Hannoi塔,除了要编写的6个java文件(HannoiWindow、AutoMoveDisc、Disc、HandleMouse、Tower、TowerPoint)所给出的类外,还需要java系统提供的一些重要的类,如JButton,JCheckBox等。汉诺塔中有三个座,名字分别为A,B,C。刚开始的时候A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。释放鼠标来放置该盘子。程序要求用户在移动盘子的过程中,不允许把大盘子放置在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。用户可以通过Hannoi塔界面提供的改变盘子数目功能来改变盘子的数目,同时可以改变盘子的大小以及改变盘子和界面的背景颜色,而且还可以选择控制背景音乐的播放。用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始。概要设计主要要实现的功能有: 完成汉诺塔的“手工移动演示”;完成汉诺塔的“自动移动演示”;增加计时功能,即显示用户完成移动盘子所花费的时间;用户可以设置最大和最小盘子的大小;用户可以设置盘子的数目;用户可以设置盘子的颜色、背景颜色以及背景音乐;用户可以将自动移动盘子的文本信息保存到文件中。四、详细设计package Hannoi;HannoiWindow类/* HannoiWindow类 * 该类主要功能是设置主界面的布局、相关按钮和监听事件 * */import java.applet.Applet;import java.applet.AudioClip;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.File;import .MalformedURLException;import .URL;import javax.swing.JOptionPane;public class HannoiWindow extends JFrame implements ActionListener Tower tower=null; /Tower创建的tower容器,刻画了汉诺塔的结构,放置在主界面的中心 int amountOfDisc=3; /确定tower对象中“盘子”数目(默认为3个) int number=0; Color discColor; HandleMouse handleMouseTime; Timer time=new Timer(1000,this); char towerName=A,B,C; /容器tower中三个座的名字 JMenuBar bar; /菜单棒 JMenu menuGrade,menuDiscNum,menuMM,menuColor; / boolean tag = true; File musicfile=new File(七里香.mid); URL url; AudioClip clip; JMenu menumusic; / JMenuItem oneGradeItem,twoGradeItem,threeGradeItem,discColorItem,backColorItem,maxDiscWidth,minDiscWidth,DiscNum,musicstart,musicstop; JButton renew=null; JButton autoButton=null; JPanel center=new JPanel(); JTextField text; /- public JRadioButton cyan,red,green,blue,yellow; public ButtonGroup buttonGroup; /- HannoiWindow() /构造函数,设置主界面布局 super(汉诺塔小游戏 (Hannoi Game); tower=new Tower(towerName); tower.setAmountOfDisc(amountOfDisc);/设置盘子的数量 tower.setMaxDiscWidth(120);/设置最大盘子的宽度 tower.setMinDiscWidth(50);/设置最小盘子的宽度 tower.setDiscHeight(16);/设置盘子的高度 tower.putDiscOnTower();/放置盘子到塔上 add(tower,BorderLayout.CENTER);/增添菜单选项 bar=new JMenuBar(); menuGrade=new JMenu(选择关卡); menuColor=new JMenu(变换颜色); menuDiscNum=new JMenu(盘子数量); menuMM=new JMenu(盘子大小); oneGradeItem=new JMenuItem(第一关_初级); twoGradeItem=new JMenuItem(第二关_中级); threeGradeItem=new JMenuItem(第三关_高级); discColorItem=new JMenuItem(盘子颜色); backColorItem=new JMenuItem(背景颜色); maxDiscWidth=new JMenuItem(最大盘子宽度); minDiscWidth=new JMenuItem(最小盘子宽度); DiscNum=new JMenuItem(设置盘子数量); menuGrade.add(oneGradeItem);/将用户的操作设置返回给相应的变量 menuGrade.addSeparator(); menuGrade.add(twoGradeItem); menuGrade.addSeparator(); menuGrade.add(threeGradeItem); menuColor.add(discColorItem); menuColor.add(backColorItem); menuMM.add(maxDiscWidth); menuMM.add(minDiscWidth); menuDiscNum.add(DiscNum); bar.add(menuGrade); bar.add(menuDiscNum); bar.add(menuMM); bar.add(menuColor); setJMenuBar(bar); /加入代码 menumusic=new JMenu(设置背景音乐); musicstart=new JMenuItem(背景音乐开启); musicstop=new JMenuItem(背景音乐关闭); menumusic.add(musicstart); menumusic.add(musicstop); bar.add(menumusic);try url=musicfile.toURL(); catch (MalformedURLException e) / TODO Auto-generated catch blocke.printStackTrace(); clip=Applet.newAudioClip(url); clip.play(); / setJMenuBar(bar); /加入下2行代码 musicstart.addActionListener(this); musicstop.addActionListener(this); / oneGradeItem.addActionListener(this); twoGradeItem.addActionListener(this); threeGradeItem.addActionListener(this); DiscNum.addActionListener(this); maxDiscWidth.addActionListener(this); minDiscWidth.addActionListener(this); discColorItem.addActionListener(this); backColorItem.addActionListener(this); renew=new JButton(重新开始); renew.addActionListener(this); autoButton=new JButton(自动演示); text=new JTextField(您的游戏时间:0秒,10); autoButton.addActionListener(this); JPanel north=new JPanel(); String mess=将全部盘子从 +towerName0+ 座搬运到 +towerName1+ 座或 +towerName2+ 座; JLabel hintMess=new JLabel(mess,JLabel.CENTER); north.add(renew); north.add(autoButton); north.add(hintMess); north.add(text); add(north,BorderLayout.NORTH); /- buttonGroup=new ButtonGroup(); cyan = new JRadioButton(原色); red = new JRadioButton(红色); green = new JRadioButton(绿色); blue = new JRadioButton(蓝色); yellow =new JRadioButton(黄色); cyan.setFont(new Font(楷体_GB2312,Font.BOLD,14); red.setFont(new Font(楷体_GB2312,Font.BOLD,14); green.setFont(new Font(楷体_GB2312,Font.BOLD,14); blue.setFont(new Font(楷体_GB2312,Font.BOLD,14); yellow.setFont(new Font(楷体_GB2312,Font.BOLD,14); buttonGroup.add(cyan); buttonGroup.add(red); buttonGroup.add(green); buttonGroup.add(blue); buttonGroup.add(yellow); rHandler h=new rHandler(); /创建监听器 cyan.addItemListener(h); red.addItemListener(h); green.addItemListener(h); blue.addItemListener(h); yellow.addItemListener(h); JPanel southColor=new JPanel(); southColor.add(cyan); southColor.add(red); southColor.add(green); southColor.add(blue); southColor.add(yellow); add(southColor,BorderLayout.SOUTH); setResizable(false); /- setResizable(false); setVisible(true); setBounds(300,150,680,480); validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); time.start(); public void actionPerformed(ActionEvent e) /各种动作事件的监听处理 if(e.getSource()=oneGradeItem|e.getSource()=twoGradeItem|e.getSource()=threeGradeItem) if(e.getSource()=oneGradeItem) amountOfDisc=3;/设置初级盘子为3个 if(e.getSource()=twoGradeItem) amountOfDisc=4;/设置中级盘子为4个 if(e.getSource()=threeGradeItem) amountOfDisc=5; /设置高级盘子为5个 if(time.isRunning()=false) time.restart();handleMouseTime.ALL=0; number=0; text.setText(您的游戏时间:+number+秒); tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); else if(e.getSource()=renew) /重新开始按钮动作监听处理方法 if(time.isRunning()=false) time.restart();handleMouseTime.ALL=0; number=0;/初始化计时器为0 text.setText(您的游戏时间:+number+秒);/读计数器时间 tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); else if(e.getSource()=autoButton) /自动演示按钮动作监听处理方法 tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); int x=this.getBounds().x+this.getBounds().width; int y=this.getBounds().y; tower.getAutoMoveDisc().setLocation(x,y); tower.getAutoMoveDisc().setSize(380,this.getBounds().height); tower.getAutoMoveDisc().setVisible(true); else if(e.getSource()=discColorItem|e.getSource()=backColorItem) Color Col=getBackground(); Col=JColorChooser.showDialog(this, 颜色变换调色板, Col); discColor=Col; if(e.getSource()=discColorItem) if(time.isRunning()=false) time.restart();handleMouseTime.ALL=0; number=0; text.setText(您的游戏时间:+number+秒); tower.disccolor(discColor); tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); else if(e.getSource()=backColorItem) tower.setBackground(Col); JOptionPane.showMessageDialog(null, 背景颜色也可以用窗口5个单选按钮变换!, 消息提示框, JOptionPane.PLAIN_MESSAGE); else if(e.getSource()=DiscNum) int n; String strNum=JOptionPane.showInputDialog(请输入您要的盘子数量(有效长度110)); n=Integer.parseInt(strNum); if(n=1) if(time.isRunning()=false) time.restart();handleMouseTime.ALL=0; number=0; text.setText(您的游戏时间:+number+秒); amountOfDisc=n; tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); else if(e.getSource()=maxDiscWidth) int width; String str=JOptionPane.showInputDialog(请输入最大盘子的长度(有效长度100180)); width=Integer.parseInt(str); if(width=100) if(time.isRunning()=false) time.restart();handleMouseTime.ALL=0; number=0; text.setText(您的游戏时间:+number+秒); tower.setMaxDiscWidth(width); tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); else if(e.getSource()=minDiscWidth) int width; String str=JOptionPane.showInputDialog(请输入最小盘子的长度(有效长度1080)); width=Integer.parseInt(str); if(width=10) if(time.isRunning()=false) time.restart();handleMouseTime.ALL=0; number=0; text.setText(您的游戏时间:+number+秒); tower.setMinDiscWidth(width); tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); if(e.getSource()=time) if(handleMouseTime.Start=1)text.setText(您的游戏时间:+number+秒);number+; if(handleMouseTime.ALL=1) time.stop(); handleMouseTime.Start=0; JOptionPane.showMessageDialog(null, 祝贺您,闯关成功!, 消息框, JOptionPane.PLAIN_MESSAGE); / else if(e.getSource()=musicstart) if(tag = false) try url=musicfile.toURL(); catch (MalformedURLException e1) / TODO Auto-generated catch blocke1.printStackTrace(); clip=Applet.newAudioClip(url); clip.play(); tag = true; else if(e.getSource()=musicstop) if(tag = true) clip.stop(); tag = false; / validate(); public class rHandler implements ItemListener public void itemStateChanged(ItemEvent event) if(cyan.isSelected() tower.setBackground(new Color(200,236,236); else if(red.isSelected() tower.setBackground(Color.red); else if(green.isSelected() tower.setBackground(Color.green); else if(blue.isSelected() tower.setBackground(Color.blue); else if(yellow.isSelected() tower.setBackground(Color.yellow); public static void main(String args) new HannoiWindow(); AutoMoveDisc类/* AutoMoveDisc类 * 该类实现了ActionListener接口,创建对象 autoMoveDisc 是Tower的成员之一 * */import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.filechooser.*;import javax.swing.text.BadLocationException;public class AutoMoveDisc extends JDialog implements ActionListener int amountOfDisc=3; /盘子的数量 TowerPoint pointA,pointB,pointC; /存放Tower容器中的塔点对象的引用; char towerName; /存放Tower容器中的towername的引用 Container con; /Container容器对象,用来存放tower对象引用 StringBuffer moveStep; /存放移动盘子的步骤,用连续两个字符表示 JTextArea showStep; /显示盘子移动步骤的文本区 JButton bStart,bStop,bContinue,bClose,bSave; /相关按钮 Timer time; /时间计时器 int i=0,number=0; AutoMoveDisc(Container con) /构造函数,完成界面布局 setModal(true); setTitle(自动演示搬盘子过程:); this.con=con; moveStep=new StringBuffer(); time=new Timer(1000,this); time.setInitialDelay(10); showStep=new JTextArea(15,20); bStart=new JButton(演示); bStop=new JButton(暂停); bContinue=new JButton(继续); bSave=new JButton(保存); bClose=new JButton(关闭); bStart.addActionListener(this); bStop.addActionListener(this); bContinue.addActionListener(this); bSave.addActionListener(this); bClose.addActionListener(this); JPanel south=new JPanel(); south.setLayout(new FlowLayout(); south.add(bStart); south.add(bStop); south.add(bContinue); south.add(bSave); south.add(bClose); add(new JScrollPane(showStep),BorderLayout.CENTER); add(south,BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); towerName=new char3; addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) time.stop(); setVisible(false); ; public void setPointA(TowerPoint pointA) /将tower容器中的pointA对象的引用传递给该对象的pointA,以便autoMoveDisc对象自动移动踏上的盘子disc this.pointA=pointA; public void setPointB(TowerPoint pointB) this.pointB=pointB; public void setPointC(TowerPoint pointC) this.pointC=pointC; public void setTowerName(char name)/给每一个座tower命名 if(name0=name1|name0=name2|name1=name2) towerName0=A; towerName1=B; towerName2=C; else towerName=name; public void setAmountOfDisc(int n) /设置盘子数目变量 amountOfDisc的值 amountOfDisc=n; public void actionPerformed(ActionEvent e) /实现文本显示盘子移动步骤事件 if(e.getSource()=time) number+; char cStart,cEnd; if(i=moveStep.length()-1) time.stop(); else if(e.getSource()=bStart) if(moveStep.length()=0) if(time.isRunning()=false) i=0; moveStep=new StringBuffer(); setMoveStep(amountOfDisc,towerName0,towerName1,towerName2); number=0; time.start(); else if(e.getSource()=bStop) if(time.isRunning()=true) time.stop(); else if(e.getSource()=bContinue) if(time.isRunning()=false) time.restart(); else if(e.getSource()=bSave) JFileChooser save=new JFileChooser(); int SV=save.showSaveDialog(null); if(SV=JFileChooser.APPROVE_OPTION) File file=save.getSelectedFile(); try BufferedWriter writer=new BufferedWriter(new FileWriter(file.g
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025家庭绿化养护承包合同
- 2025茶叶特许加盟合同书
- 2025智能照明系统能源服务管理合同
- 2025年度分店(分公司)经营承包合同
- 2024年新疆事业单位联考笔试真题
- 塑料厂考勤管理规范制度
- 2025【合同范本】版合作经营协议书
- 2025【合同范本】苏州市上岗劳务合同
- 活动一 民族服装大展示说课稿-2025-2026学年小学综合实践活动蒙沪版四年级上册-蒙沪版
- 3.2细胞器之间的分工合作教学设计教学反思-2023-2024学年高一上学期生物人教版(2019)必修1
- 2025至2030中国氧化铈纳米颗粒行业项目调研及市场前景预测评估报告
- 混凝土相关知识培训课件
- 烙画装饰图案技艺国家建设中国烙画艺术传承与创新67课件
- 创伤骨科出科试题和答案
- 元器件采购基本知识培训课件
- 物业管理员职业技能大赛线上试题及答案
- 2025年江苏省泰州市保安员理论考试题库及答案
- 2025托幼机构卫生保健人员考试题库(附答案)
- 申请增列护理学硕士专业学位授权点的必要性与可行性论证报告
- 文化遗产数字化保护与文化遗产数字化保护的公众认知与接受度研究报告001
- 2024广西公需课高质量共建“一带一路”谱写人类命运共同体新篇章答案
评论
0/150
提交评论