辽 宁 工 业 大 学
JAVA程序设计 课程设计(论文)
题目: Hannoi塔
院(系): 软件学院 专业班级: 软件技术091班 学 号: 888888888 学生姓名: tianxi 指导教师: tianxi 教师职称: 助 教 起止时间: 2010.12.1至2010.12.16
程序设计专题(报告)任务及评语
院(系):软件学院 教研室:软件教研室 学 号 程序设计(报告)题目 程序设计专题的任务与要求: (1)掌握Java编程、面向对象的基础知识。 (2)较熟练地编写Java应用程序Application。 (3)了解Java的常用标准类库、编程技巧、异常处理。 (5)联系已学过的内容,巩固所学的理论,增强独立工作能力。 (6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。 (7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。 课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。 08888888 学生姓名 tianxi 专业班级 软件技术091班 Hannoi塔 程序设计(报告)任务 指导教师评语及成绩 成绩: 指导教师签字: 2009 年 12 月 20 日 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
目 录
第1章 课程设计的目的与要求 ........................................... 1 1.1 课程设计目的 ........................................................ 1 1.2 课程设计的实验环境 .................................................. 1 1.3 课程设计的预备知识 .................................................. 1 1.4 课程设计要求 ........................................................ 1 第2章 课程设计内容 ........................................................ 2
2.1课程设计主要内容 .................................................... 2 2.2概要设计 ............................................................ 2
2.2.1自定义类说明 .................................................. 2 2.4详细设计 ............................................................ 4 2.4测试分析 ........................................................... 14
2.4.1程序运行情况 ................................................. 14 图2.4.1-2游戏胜利时界面 ................................................... 15
2.4.2程序异常处理 ................................................. 15
参考资料 17
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第1章 课程设计的目的与要求
1.1 课程设计目的
《JAVA程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。 1.2 课程设计的实验环境
硬件要求能运行Windows 9.X操作系统的微机系统。JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。 1.3 课程设计的预备知识
熟悉JAVA语言及ECLIPSE开发工具。 1.4 课程设计要求
按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JAVA程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
1
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第2章 课程设计内容
2.1课程设计主要内容
我设计的Hannoi塔,除了要编写的6个java文件所给出的类外,还需要java系统提供的一些重要的类,如JButton,JCheckBox等。汉诺塔中有三个座,名字分别为A,B,C。刚开始的时候A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。释放鼠标来放置该盘子。程序要求用户在移动盘子的过程中,不允许吧大盘子放置在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。用户可以通过Hannoi塔界面的提供的改变盘子数目功能来改变盘子的数目,同时可以改变盘子的大小以及改变盘子和界面的背景颜色,而且还可以选择控制背景音乐的播放。用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始。 2.2概要设计
主要要实现的功能有: 完成汉诺塔的“手工移动演示”;完成汉诺塔的“自动移动演示”;增加计时功能,即显示用户完成移动盘子所花费的时间;用户可以设置最大和最小盘子的大小;用户可以选择播放和暂停背景音乐;用户可以设置盘子的数目;用户可以设置盘子的颜色以及背景颜色;用户可以将自动移动盘子的文本信息保存到文件;
2.2.1自定义类说明
********************************************************** * 类名: JButton*
* 作用: 自定义主类, 实现圆盘的类Disc继承JButton类 * 继承的父类: Disc类 * * 实现的接口: 没有 *
**********************************************************
2
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
表1-成员变量表
表2.1 JButton成员变量 成员变量描述 控制盘子数目 重新开始 开始游戏 背景颜色 盘子颜色
表2-方法表 表2 Chesspad方法 方法名 fillRect() g.fillOval() drawString() setBackground() 功能 绘制出矩形区域 绘制相同数目点 绘制出A、B、C座 备注 构造方法 构造方法 构造方法 构造方法 变量类型 String String String String String JLabel renew.setText renew.setText bgcolor pzcolor 名称 设置背景颜色和盘子颜色 创建一个计时器 停止计时器计时 保存文件 事件处理 评估 Timer(int a,Object b) stop() write actionPerformed evaluate
构造方法 接口方法 接口方法 3
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
2.4详细设计
HannoiWindow.java import javax.swing.*; import java.awt.*;
import java.awt.event.*; import javax.swing.Timer; import sun.audio.*; import java.util.*; import java.util.Date; import java.io.*;
public class HannoiWindow extends JFrame implements ActionListener,ItemListener{ Tower tower=null; int amountOfDisc=3;
char []towerName={'A','B','C'}; JButton renew=null; JButton autoButton=null; Timer t;
JTextField timeShow,w11,h11,w22,h22; JPanel panel1,panel2;
JSplitPane rightPanel,leftPanel; TowerPoint [] pointD; TowerPoint [] pointE;
JPanel center=new JPanel();
long time1=0,leftTime,leftHour,leftMinute,leftSecond; FlowLayout flow; JComboBox li; JButton bt1,bt2; JPanel max,min; JLabel shumu; JPanel yanse;
JButton bgcolor,pzcolor; JCheckBox yinyue;
ContinuousAudioDataStream cas; HannoiWindow(){
tower=new Tower(towerName);
tower.setAmountOfDisc(amountOfDisc); tower.setMaxDiscWidth(120); tower.setMinDiscWidth(50); tower.setDiscHeight(16); tower.putDiscOnTower(); t=new Timer(1000,this); t.setInitialDelay(1000);
timeShow=new JTextField(10);
4
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
timeShow.setHorizontalAlignment(SwingConstants.RIGHT); timeShow.setEditable(false); panel1=new JPanel();
panel1.add(new JLabel(\"用时:\")); panel1.add(timeShow);
panel1.setBorder(BorderFactory.createTitledBorder(\"计时器\")); li=new JComboBox(); li.addItem(\"3\"); li.addItem(\"4\"); li.addItem(\"5\"); li.addItem(\"6\"); li.addItem(\"7\"); li.addItem(\"8\"); li.addItem(\"9\"); li.addItem(\"10\"); li.addItem(\"11\"); li.addItem(\"12\"); li.addItem(\"13\"); li.addItem(\"14\"); li.addItem(\"15\");
bt1=new JButton(\"确定\"); bt2=new JButton(\"取消\"); bt1.addActionListener(this); bt2.addActionListener(this); panel2=new JPanel(); panel2.setLayout(null);
shumu=new JLabel(\"盘子数目:\"); panel2.add(shumu); panel2.add(li); panel2.add(bt1); panel2.add(bt2);
shumu.setBounds(5,0,80,35); li.setBounds(80,5,80,25); bt1.setBounds(20,290,60,25); bt2.setBounds(90,290,60,25); max=new JPanel(); max.setLayout(null);
max.setBorder(BorderFactory.createTitledBorder(\"最大盘子大小\")); JLabel w1=new JLabel(\"宽度:\"); JLabel h1=new JLabel(\"高度:\"); w11=new JTextField(10); h11=new JTextField(10); max.add(w1); max.add(h1);
5
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
max.add(w11); max.add(h11);
w1.setBounds(10,10,50,40); h1.setBounds(10,40,50,35); w11.setBounds(70,20,90,20); h11.setBounds(70,50,90,20); min=new JPanel(); min.setLayout(null);
min.setBorder(BorderFactory.createTitledBorder(\"最小盘子大小\")); JLabel w2=new JLabel(\"宽度:\"); JLabel h2=new JLabel(\"高度:\"); w22=new JTextField(10); h22=new JTextField(10); min.add(w2); min.add(h2); min.add(w22); min.add(h22);
w2.setBounds(10,10,50,40); h2.setBounds(10,40,50,35); w22.setBounds(70,20,90,20); h22.setBounds(70,50,90,20); panel2.add(max); panel2.add(min);
max.setBounds(0,40,185,80); min.setBounds(0,120,185,80); h22.setEditable(false); yanse=new JPanel(); yanse.setLayout(null);
yanse.setBorder(BorderFactory.createTitledBorder(\"颜色\")); bgcolor=new JButton(\"背景颜色\"); pzcolor=new JButton(\"盘子颜色\"); bgcolor.addActionListener(this); pzcolor.addActionListener(this); yanse.add(bgcolor); yanse.add(pzcolor);
bgcolor.setBounds(40,20,100,25); pzcolor.setBounds(40,50,100,25); panel2.add(yanse);
yanse.setBounds(0,200,185,85);
JScrollPane spanel=new JScrollPane(panel2);
spanel.setBorder(BorderFactory.createTitledBorder(\"设置选项\"));
rightPanel=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,spanel,panel1); rightPanel.setDividerLocation(345);
tower.setBorder(BorderFactory.createTitledBorder(\"Hannoi塔\"));
6
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
leftPanel=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,rightPanel,tower); leftPanel.setDividerLocation(185); add(leftPanel,BorderLayout.CENTER); renew=new JButton(\"开始游戏\"); renew.addActionListener(this);
autoButton=new JButton(\"自动演示\"); autoButton.addActionListener(this); flow=new FlowLayout();
flow.setAlignment(FlowLayout.LEFT); flow.setHgap(30);
yinyue=new JCheckBox(\"背景音乐\ yinyue.addItemListener(this); JPanel north=new JPanel(); north.setLayout(flow); north.add(renew);
north.add(autoButton);
String mess=\"将全部盘子从\"+towerName[0]+\"座搬运到\"+towerName[1]+ \"座或\"+towerName[2]+\"座\";
JLabel hintMess=new JLabel(mess,JLabel.CENTER); north.add(hintMess); north.add(yinyue);
add(north,BorderLayout.NORTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { FileInputStream fileau = new FileInputStream(\"beijing.WAV\");//背景音乐 AudioStream as = new AudioStream(fileau); AudioData data = as.getData cas = new ContinuousAudioDataStream (data); AudioPlayer.player.start(cas); } catch (Exception e1) {} setVisible(true);
setBounds(60,60,640,500); validate(); }
public boolean panduan() {
7
(); 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
boolean b=true;
pointD=tower.getpointC();
for(int i=0;i =true; eak; } else b=false; return b; } public boolean panduan1() { boolean b=true; pointE=tower.getpointB(); for(int i=0;i 8 { b br } { 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) { =true; eak; } else b=false; return b; } public void itemStateChanged(ItemEvent e) { if(yinyue.isSelected()) AudioPlayer.player.start(cas); else AudioPlayer.player.stop(cas); } public void actionPerformed(ActionEvent e){ if(e.getSource()==t) { olean b,b1,b2; =panduan(); 9 b br } bo b b1 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) =panduan1(); b==true&&b1==false) b2=false; se if(b==false&&b1==true) b2=false; se b2=true; b2) me1=time1+1000; ftTime=time1/1000; ftHour=leftTime/3600; ftMinute=(leftTime-leftHour*3600)/60; ftSecond=leftTime%60; meShow.setText(\"\"+leftHour+\"小时\"+leftMinute+\"分\"+leftSecond+\"秒\"); 10 if( el el if( { ti le le le le ti 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) } else { t.stop(); time1=0; String s=\"恭喜你!你完成了,用时:\"+leftHour+\"小时\"+leftMinute+\"分\"+leftSecond+\"秒\"; JOptionPane.showMessageDialog(this,s,\"对话框\ timeShow.setText(\"\"); } } if(e.getSource()==bgcolor){ Color newColor=JColorChooser.showDialog(this,\"调色板\ 11 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) newColor!=null) wer.setBackground(newColor); } if(e.getSource()==pzcolor){ olor newColor=JColorChooser.showDialog(this,\"调色板\ newColor!=null) wer.setBG(newColor); } if(e.getSource()==bt1){ t w1,w2,h; renew.setText(\"开始游戏\"); amountOfDisc=Integer.parseInt((String)li.getSelectedItem()); String s=(String)w11.getText(); String s1=(String)w22.getText(); String s2=(String)h11.getText(); if(s.equals(\"\")) w1=120; else w1=Integer.parseInt(s); if(s1.equals(\"\")) w2=50; else w2=Integer.parseInt(s1); if(s2.equals(\"\")) h=16; else h=Integer.parseInt(s2); tower.setMaxDiscWidth(w1); tower.setMinDiscWidth(w2); tower.setDiscHeight(h); tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); 12 if( to C if( to in 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) } if(e.getSource()==bt2){ 11.setText(\"\"); 22.setText(\"\"); 1.setText(\"\"); } else if(e.getSource()==renew){ renew.getText()==\"开始游戏\") t.start(); tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); renew.setText(\"重新开始\"); time1=0; t.restart(); } else if(e.getSource()==autoButton){ time1=0; t.stop(); timeShow.setText(\"\"); 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(350,this.getBounds().height); tower.getAutoMoveDisc().setVisible(true); } validate(); } } 13 w w h1 if( 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) 2.4测试分析 2.4.1程序运行情况 图2.4.1-1 Hannoi塔开始主界面 14 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) 图2.4.1-2游戏胜利时界面 2.4.2程序异常处理 当大盘子试图往小盘子上移动的时候,将抛出一个规则违类异常对象,具体如下: if(pointE[i].isHaveDisc()==false) { b=true; break; } else b=false; return b; 15 } 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) 第3章 课程设计总结 通过着为期两周的时间,我学到了很多,自然在这期间遇到的困难数不胜数,开始最让我没辙的是题目不知道该订什么好,想过很多个题目但往往跟其他同学重复了,为了避免做出来的东西雷同了,只能继续想其他方面的,想过去做些复杂的,但实在是能力有限,呵呵,最后终于决定做这个Hannoi塔游戏. 这个Hannoi塔游戏就是在原有的程序基础上增加了改变盘子数目功能、改变盘子大小功能、改变背景颜色功能、改变盘子颜色功能、计时器功能以及保存信息到文件功能,由于是在原有的基础上修改的,虽然理论上那个来讲这应该很简单,不会太难,但当我真正着手做起来得时候才发现,原来自己还是太嫩,刚开始什么都不懂,于是我就去图书馆参阅了大量的资料,也不停的向同学们请教,终于渐渐的让我从刚开始连如何运行程序,甚至类的作用等一些罪基本的东西都不清楚到最后通过努力终于把这个程序成功搞定.自然这期间除了辛苦也让我明白了很多,有些小问题也是不容忽视的,就如公共类只能有一个,而且必须要有.及类名必须要同公共类名相同.否则程序就无法运行. 经过编写这个Hannoi塔游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。除此之外让我对java变成语言又有了更深一步的了解,曾经对于一些类名的似是而非,现在通过编写这个程序让我逐渐变得明朗一些了,至少可以分清父类子类,以及一些类和方法的用途,总之通过这次课程设计真的让我学到了很多. 16 辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文) 参考资料 1. 耿祥义 JAVA大学实用教程 电子工业出版社 2005-03 2. 耿祥义 JAVA大学实用教程实验指导 电子工业出版社 2005-03 3.郝玉龙 J2EE编程技术 北方交大出版 2003-02 4. 朱喜福 Java程序设计 人民邮电出版 2003-04 5. 王路群 Java高级程序设计 中国水利水电出版社 2009-8 6. 王碧波 JBuilder 10入门与提高 清华大学出版 2004-11 7. 吴其庆 Java程序设计实例教程 冶金工业出版社 2007-11 8. 柳西玲 Java语言应用开发基础 清华大学出版社 2008-2 9. 朱战立 Java程序设计实用教程 人民邮电出版 2004-03 10. 宛延闿等 实用Java程序设计教程 机械工业出版社 2008-1 17 因篇幅问题不能全部显示,请点此查看更多更全内容