




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象课程设计题 目 汉诺塔游戏程序功能实现 学 院 商学院 专 业 信息管理与信息系统 班 级 学 号 学生姓名 洪婷 指导教师 李永刚 编写日期 2011年12月8日 目 录一、 需求分析31.1 界面及布局设计31.2 A、B、C 座的实现方法31.3 圆盘的实现方法41.4 记录时间方法4二、 系统运行环境5三、 功能需求描述5四、 总体设计64.1 总体功能图64.2 总体流程图7五、 主要功能设计流程85.1 A、B、C 座实现流程图85.2 圆盘画法流程图95.3 保存流程图95.4 时间流程图10六、 程序模块设计106.1 间接关系图106.2 运行效果图116.3 程序代码设计13七、 总结36一、 需求分析1.1 界面及布局设计系统的整体布局为:BorderLayout布局, 采用了菜单、按钮、面板等组件,菜单主要包括选择级别,盘子个数,选择颜色,设置大小,按钮的功能包括重新开始,自动演示,播放,循环,停止,保存,演示,暂停,继续,关闭。1.2 A、B、C 座的实现方法Tower类是javax.swing包中JPanel容器的一个子类,创建的对象tower是HannoiWindow窗口的成员之一,被添加到HannoiWindow窗口的中心位置。标明Tower类的主要成员变量和方法以及和HannoiWindow类之间组合关系的UML图如图1-1所示。图1-1 Tower类的UML图成员变量(1)amountOfDisc是int型数据。用来确定tower对象中盘子的数目。(2)disc是Disc型数组, Disc数组的每个单元中存放一个Disc对象,依次表明tower对象中有怎样多的盘子。(3)towerName是char型数组,长度为3,即A、B、C。(4)maxDiscWidth和minDiscWidth的值分别用来确定最大盘子的宽度和最小盘子的宽度,discHeight的值确定每个盘子的高度。(5)pointA、pointB和pointC都是TowerPoint型数组,三个数组的长度与盘子数目相同,分别用来表示Hannoi塔中三个座上的塔点。A座、B座和C座上的三个塔点分别由pointA、pointB和pointC中的单元来确定。每个座上的三个塔点都是从座顶依次对应数组的相应单元中的TowerPoint对象。(6)handleMouse是HandleMouse类创建的鼠标事件监视器,用来监视disc数组的Disc对象上触发的鼠标事件。(7)autoMoveDisc是AutoMoveDisc创建的对话框。通过该对话框可以实现程序自动移动盘子。1.3 圆盘的实现方法Disc类是javax.swing包中Jbutton类的子类,所创建的对象称作Hannoi塔中的“盘子”。标明Disc类的主要成员变量、方法以及和Tower类之间组合关系的UML如图1-3所示。 图1-2 Disc 类的UML图1、成员变量(1) number的值确定所创建的“盘子”上的数字号码。 (2)point是TowerPoint对象,表明自己所在的塔点。1.4 记录时间方法Timer类,该类在javax.swing包中。当某些操作需要周期性地执行,就可以使用计时器。可以使用Timer类的构造方法:Timer(int a,Object b)创建一个计时器,其中的参数a的单位是毫秒,确定计时器每隔a毫秒“震铃”一次,参数b是计时器的监视器。计时器发生的震铃事件是ActionEvent类型事件。计时器创建后,使用Timer类的方法start()启动计时器,即启动线程。使用Timer类的方法stop()停止计时器,即挂起线程。使用restart()重新启动计时器,即恢复线程。本程序中,单击“显示当前时间”按钮启动计时器,并将时间显示在文本框中;单击“暂停当前时间”按钮计时器暂时停止计时;单击“重新显示当前时间”按钮重新启动计时器。二、 系统运行环境硬件要求能运行Windows 9.X操作系统的微机系统。JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。三、 功能需求描述(1) 设计Hannoi塔中有三个座,名字分别是A、B和C。初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上;(3)用户可以通过Hannoi塔界面提供的菜单来选择初级、中级、高级和自定义四个级别。初级级别A座上有3个大小不等盘子、中级级别A座上有4个大小不等盘子、高级级别A座上有5个大小不等盘子、自定义级别A座用户可以任意输入盘子数目;(4)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上;(5)用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始当前的级别;(6)有计时功能,即显示用户完成移动盘子所花费的时间;(7)用户可以设置最大和最小盘子的大小;(8)用户可以选择播放和暂停背景音乐;(9)用户可以设置盘子的颜色以及背景的颜色;(10)用户可以将自动移动盘子的文本信息保存到文件。四、 总体设计4.1 总体功能图图1-3 总体功能图4.2 总体流程图图1-4 总体流程图五、 主要功能设计流程5.1 A、B、C 座实现流程图图1-5 A、B、C座实现流程图5.2 圆盘画法流程图图1-6 圆盘画法流程图5.3 保存流程图图1-7 文件保存流程图5.4 时间流程图图1-8 记录时间流程图六、 程序模块设计6.1 间接关系图图1-9 类之间的组合关系图6.2 运行效果图图1-10 运行主界面效果图图1-11 自动演示效果图图1-12设置盘子颜色效果图图1-13 设置盘子大小效果图6.3 程序代码设计HannoiWindow类实现import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;import java.io.*;import .*;import java.applet.*;public class HannoiWindow extends JFrame implements ActionListener Tower tower = null;int amountOfDisc = 3;char towerName = A, B, C ;JMenuBar bar;JMenu menuGrade;boolean tag = true;int t = 0;/ 用在计时中的变量javax.swing.Timer secondTime;File file = new File(91.mid);URL url;AudioClip clip;JMenu menusetDisc;/ 加入代码JMenuItem setDiscAcount, setDiscWidth, setDiscColor;JMenu menumusic;JLabel timetext;JMenuItem oneGradeItem, twoGradeItem, threeGradeItem, musicstart,musicstop;JButton renew = null;JButton autoButton = null;JPanel center = new JPanel();HannoiWindow() t = 0;/ 用在计时中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(选择级别);oneGradeItem = new JMenuItem(初级);twoGradeItem = new JMenuItem(中级);threeGradeItem = new JMenuItem(高级);menuGrade.add(oneGradeItem);menuGrade.add(twoGradeItem);menuGrade.add(threeGradeItem);bar.add(menuGrade);menusetDisc = new JMenu(设置盘子);/ 加入代码menumusic = new JMenu(设置背景音乐);setDiscColor = new JMenuItem(设置盘子颜色);setDiscWidth = new JMenuItem(设置盘子大小);setDiscAcount = new JMenuItem(设置盘子数目);musicstart = new JMenuItem(背景音乐开启);musicstop = new JMenuItem(背景音乐关闭);menusetDisc.add(setDiscColor);menusetDisc.add(setDiscAcount);menusetDisc.add(setDiscWidth);menumusic.add(musicstart);menumusic.add(musicstop);bar.add(menusetDisc);bar.add(menumusic);secondTime = new javax.swing.Timer(1000, this);secondTime.start();timetext = new JLabel();try url = file.toURL();clip = Applet.newAudioClip(url); catch (Exception ex) clip.play();tag = true;setJMenuBar(bar);setDiscColor.addActionListener(this);/ 加入下3行代码setDiscWidth.addActionListener(this);setDiscAcount.addActionListener(this);musicstart.addActionListener(this);musicstop.addActionListener(this);oneGradeItem.addActionListener(this);twoGradeItem.addActionListener(this);threeGradeItem.addActionListener(this);renew = new JButton(重新开始);renew.addActionListener(this);autoButton = new JButton(自动演示);autoButton.addActionListener(this);JPanel north = new JPanel();JPanel south = new JPanel();/ /south.add(timetext);north.add(renew);north.add(autoButton);String mess = 将全部盘子从 + towerName0 + 座搬运到 + towerName1 + 座或+ towerName2 + 座;JLabel hintMess = new JLabel(mess, JLabel.CENTER);north.add(hintMess);add(north, BorderLayout.NORTH);add(south, BorderLayout.SOUTH);setResizable(false);setVisible(true);setBounds(60, 60, 460, 410);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);public void actionPerformed(ActionEvent e) if (e.getSource() = oneGradeItem) amountOfDisc = 3;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();t = 0; else if (e.getSource() = twoGradeItem) amountOfDisc = 4;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();t = 0; else if (e.getSource() = threeGradeItem) amountOfDisc = 5;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();t = 0; else if (e.getSource() = renew) tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();t = 0; 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(280, this.getBounds().height);tower.getAutoMoveDisc().setVisible(true); else if (e.getSource() = setDiscColor)/ 添加以下代码SetDiscColorDlg colorDlg = new SetDiscColorDlg(this, tower); else if (e.getSource() = setDiscWidth) SetDiscWidthDlg widthDlg = new SetDiscWidthDlg(this, tower);t = 0; else if (e.getSource() = setDiscAcount) SetDiscAcountDlg acountDlg = new SetDiscAcountDlg(this, tower);amountOfDisc = tower.amountOfDisc;t = 0; else if (e.getSource() = secondTime)/ 计时处理int hour, minute, second, a;String mytimer, strsec, strmin, strhour;t = t % (60 * 60 * 24);second = t % 60;a = t / 60;minute = a % 60;hour = a / 60;if (second = 9) strsec = 0 + String.valueOf(second); else strsec = String.valueOf(second);if (minute = 9) strmin = 0 + String.valueOf(minute); else strmin = String.valueOf(minute);if (hour = 9) strhour = 0 + String.valueOf(hour); else strhour = String.valueOf(hour);mytimer = strhour + : + strmin + : + strsec;timetext.setText(计时: + mytimer);t = t + 1;else if (e.getSource() = musicstart) if (tag = false) try url = file.toURL();clip = Applet.newAudioClip(url); catch (Exception ex) clip.play();tag = true;else if (e.getSource() = musicstop) if (tag = true) clip.stop();tag = false;validate();public static void main(String args) new HannoiWindow();Tower类实现import javax.swing.*;import java.awt.*;public class Tower extends JPanel int amountOfDisc = 3;Color color = Color.cyan;Disc disc;int maxDiscWidth, minDiscWidth, discHeight;char towerName;TowerPoint pointA, pointB, pointC;HandleMouse handleMouse;AutoMoveDisc autoMoveDisc;Tower(char towerName) handleMouse = new HandleMouse(this);this.towerName = towerName;setLayout(null);setBackground(new Color(200, 226, 226);public void setAmountOfDisc(int number) if (number = 1)amountOfDisc = 1;elseamountOfDisc = number;public void setMaxDiscWidth(int m) maxDiscWidth = m;public void setMinDiscWidth(int m) minDiscWidth = m;public void setDiscHeight(int h) discHeight = h;public AutoMoveDisc getAutoMoveDisc() return autoMoveDisc;public void putDiscOnTower() removeDisk();int n = (maxDiscWidth - minDiscWidth) / amountOfDisc;disc = new DiscamountOfDisc;for (int i = 0; i disc.length; i+) disci = new Disc(color);disci.setNumber(i);int diskwidth = minDiscWidth + i * n;disci.setSize(diskwidth, discHeight);disci.addMouseListener(handleMouse);disci.addMouseMotionListener(handleMouse);pointA = new TowerPointamountOfDisc;pointB = new TowerPointamountOfDisc;pointC = new TowerPointamountOfDisc;int vertialDistance = discHeight;for (int i = 0; i pointA.length; i+) pointAi = new TowerPoint(maxDiscWidth, 100 + vertialDistance);vertialDistance = vertialDistance + discHeight;vertialDistance = discHeight;for (int i = 0; i pointB.length; i+) pointBi = new TowerPoint(2 * maxDiscWidth, 100 + vertialDistance);vertialDistance = vertialDistance + discHeight;vertialDistance = discHeight;for (int i = 0; i pointC.length; i+) pointCi = new TowerPoint(3 * maxDiscWidth, 100 + vertialDistance);vertialDistance = vertialDistance + discHeight;for (int i = 0; i pointA.length; i+) pointAi.putDisc(disci, this);handleMouse.setPointA(pointA);handleMouse.setPointB(pointB);handleMouse.setPointC(pointC);autoMoveDisc = new AutoMoveDisc(this);autoMoveDisc.setTowerName(towerName);autoMoveDisc.setAmountOfDisc(amountOfDisc);autoMoveDisc.setPointA(pointA);autoMoveDisc.setPointB(pointB);autoMoveDisc.setPointC(pointC);validate();repaint();public void removeDisk() if (pointA != null) for (int i = 0; i pointA.length; i+) pointAi.removeDisc(pointAi.getDiscOnPoint(), this);pointBi.removeDisc(pointBi.getDiscOnPoint(), this);pointCi.removeDisc(pointCi.getDiscOnPoint(), this);public void paintComponent(Graphics g) super.paintComponent(g);int x1, y1, x2, y2;x1 = pointA0.getX();y1 = pointA0.getY() - discHeight / 2;x2 = pointAamountOfDisc - 1.getX();y2 = pointAamountOfDisc - 1.getY() + discHeight / 2;g.drawLine(x1, y1, x2, y2);x1 = pointB0.getX();y1 = pointB0.getY() - discHeight / 2;x2 = pointBamountOfDisc - 1.getX();y2 = pointBamountOfDisc - 1.getY() + discHeight / 2;g.drawLine(x1, y1, x2, y2);x1 = pointC0.getX();y1 = pointC0.getY() - discHeight / 2;x2 = pointCamountOfDisc - 1.getX();y2 = pointCamountOfDisc - 1.getY() + discHeight / 2;g.drawLine(x1, y1, x2, y2);g.setColor(Color.blue);x1 = pointAamountOfDisc - 1.getX() - maxDiscWidth / 2;y1 = pointAamountOfDisc - 1.getY() + discHeight / 2;x2 = pointCamountOfDisc - 1.getX() + maxDiscWidth / 2;y2 = pointCamountOfDisc - 1.getY() + discHeight / 2;int length = x2 - x1, height = 6;g.fillRect(x1, y1, length, height);int size = 5;for (int i = 0; i pointA.length; i+) g.fillOval(pointAi.getX() - size / 2,pointAi.getY() - size / 2, size, size);g.fillOval(pointBi.getX() - size / 2,pointBi.getY() - size / 2, size, size);g.fillOval(pointCi.getX() - size / 2,pointCi.getY() - size / 2, size, size);g.drawString(towerName0 + 座, pointAamountOfDisc - 1.getX(),pointAamountOfDisc - 1.getY() + 50);g.drawString(towerName1 + 座, pointBamountOfDisc - 1.getX(),pointBamountOfDisc - 1.getY() + 50);g.drawString(towerName2 + 座, pointCamountOfDisc - 1.getX(),pointCamountOfDisc - 1.getY() + 50);TowerPoint类实现import java.awt.*;public class TowerPoint int x, y;boolean haveDisc;Disc disc = null;public TowerPoint(int x, int y) this.x = x;this.y = y;public boolean isHaveDisc() return haveDisc;public void setHaveDisc(boolean boo) haveDisc = boo;public int getX() return x;public int getY() return y;public boolean equals(TowerPoint p) if (p.getX() = this.getX() & p.getY() = this.getY()return true;elsereturn false;public void putDisc(Component com, Container con) disc = (Disc) com;con.setLayout(null);con.add(disc);int w = disc.getBounds().width;int h = disc.getBounds().height;disc.setBounds(x - w / 2, y - h / 2, w, h);haveDisc = true;disc.setPoint(this);con.validate();public Disc getDiscOnPoint() return disc;public void removeDisc(Component com, Container con) if (com != null)con.remove(com);con.validate();AutoMoveDisc类实现import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;public class AutoMoveDisc extends JDialog implements ActionListenerint amountOfDisc=3; TowerPoint pointA,pointB,pointC; char towerName; Container con; StringBuffer moveStep; JTextArea showStep; JButton bStart,bStop,bContinue,bClose,bSave; Timer time; FileDialog saveDlg; 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(10,12); bStart=new JButton(演示); bStop=new JButton(暂停); bContinue=new JButton(继续); bClose=new JButton(关闭); bSave=new JButton(保存); bStart.addActionListener(this); bStop.addActionListener(this); bContinue.addActionListener(this); bClose.addActionListener(this); bSave.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); saveDlg=new FileDialog(this,保存到文件,FileDialog.SAVE); saveDlg.setVisible(false); saveDlg.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) saveDlg.setVisible(false); ); 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) this.pointA=pointA; public void setPointB(TowerPoint pointB) this.pointB=pointB; public void setPointC(TowerPoint pointC) this.pointC=pointC; public void setTowerName(char name) if(name0=name1|name0=name2|name1=name2) towerName0=A; towerName1=B; towerName2=C; else towerName=name; public void setAmountOfDisc(int n) amountOfDisc=n; public void actionPerf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西安理工大学《新时代高校劳动教育通论》2023-2024学年第二学期期末试卷
- 南京理工大学《乒乓球教学》2023-2024学年第二学期期末试卷
- 吉首大学张家界学院《声乐一》2023-2024学年第二学期期末试卷
- 滁州职业技术学院《民间美术图形创新设计》2023-2024学年第二学期期末试卷
- 桂林医学院《软件设计模式与体系结构(双语)》2023-2024学年第二学期期末试卷
- 社区服务中心设计
- 小学科学实验室安全教育
- 2024年水电站计算机监控装置项目资金筹措计划书代可行性研究报告
- 相关管理规定制度的教育
- 新生儿肺炎护理
- 厂房拆除及重建施工合同协议
- 《晨会的重要性》课件
- 安全色与安全标识
- 《康复工程学》课件-第一讲 康复工程概论
- 智能监测与控制系统-深度研究
- 水利施工超标准洪水应急预案
- 《自动瓷砖切割机的结构设计》12000字(论文)
- 海上丝绸之路(浙江海洋大学)学习通测试及答案
- 皮带机安全培训课件
- ISO 27040-2015 信息技术安全技术存储安全管理手册程序文件制度文件表单一整套
- 【MOOC】游戏开发程序设计基础-中国传媒大学 中国大学慕课MOOC答案
评论
0/150
提交评论