课程设计报告
设计题目:专 业 计算机科学与技术
班 级 101
学 号 201016021127
学生姓名 李贵云
指导教师 布瑞琴
起至时间 12.16~12.23
教师评分
20xx年 月 日
目 录
1.概述
1.1目的
这学期我们学习了Java语言,Java语言是面向对象的开发方法,是当今世界最流行的开发方法,是当今流行的网络编程语言。它具有面向对象、跨平台、分布应用等特点。它不仅具有贴近自然的语言,而且有利于软件的维护和继承。是很多程序开发人员的第一选择。
为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。让学生自己动手动脑,将书本上的知识运用到实践当中去,使知识能更好的融会贯通。
为了达到这个目的,我们需要自己动手做一个Java的课程设计,在这个课程设计里需要根据我们手中现有的软件与知识基础,独立的将它完成,只有这样,我们才能把理论变成实践,将知识真正的做到学以致用。
1.2课程设计的组成部分
课程设计报告的构成包括:(1)前置部分:封面、目录页;(2)主体部分:引言(设计目的、任务与要求等)、正文、结果、项目开发中遇到的困难及解决、体会、参考文献。
2.李贵云设计的内容
2.1设计题目
题目四:ATM柜员机模拟程序:对某帐号进行查询、取款、存款、查询余额。
2.2具体任务
类的创建,构造成员变量和成员方法,生成对象,方法的调用等。
2.3软件环境
JCreator Pro v4.0
2.4流程图
2.5程序源代码
import java.io.*;
class Account {
private String code =null;
private String name =null;
private String password=null;
private double money =0.0;
public Account(String code,String name,String password,double money)
{
this.code=code;
this.name=name;
this.password=password;
this.money=money;
}
protected String get_Code() {
return code;
}
protected String get_Name() {
return name;
}
protected String get_Password() {
return password;
}
public double get_Money() {
return money;
}
protected void set_Balance(double mon) { money -= mon;
}
}
class ATM {
Account act;
public ATM() {
act=new Account("000000","Devil","123456",50000); }
protected void Welcome()
{
String str="---------------------------------"; System.out.print(str+"\n"+
"欢迎使用Angel模拟自动取款机程序.\n"+str+"\n"); System.out.print(" 1.>取款."+"\n"+
" 2.>查询信息."+"\n"+
" 3.>密码设置."+"\n"+
" 4.>退出系统."+"\n");
}
protected void Load_Sys() throws Exception
{
String card,pwd;
int counter=0;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
do {
System.out.println("请输入您的信用卡号:");
card=br.readLine();
System.out.println("请输入您的密码:");
pwd=br.readLine();
if(!isRight(card,pwd))
{
System.out.println("您的卡号或密码输入有误.");
counter++;
}
else
SysOpter();
}while(counter<3);
Lock_Sys();
}
protected void SysOpter() throws Exception
{
int num;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请选择您要操作的项目(1-4):");
num=br.read();
switch(num) {
case 49: BetBalance(); break;
case 50: Inqu_Info(); break;
case 51: Set_Password(); break;
case 52: Exit_Sys(); break;
}
System.exit(1);
}
protected void Inqu_Info() {
System.out.print("---------------------\n"+
act.get_Code()+"\n"+
act.get_Name()+"\n"+
act.get_Money()+"\n"+
"-----------------------");
}
public void BetBalance() throws Exception
{
String str=null,str1;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
do {
System.out.println("请输入您要取的数目:");
str=br.readLine();
str1=String.valueOf(act.get_Money());
if(str.compareTo(str1)>0) {
System.out.println("超过已有的钱数,请重新输入您要取的数目:");
}
else {
System.out.println("取款成功,请收好您的钱.");
Welcome();
SysOpter();
}
}while(true);
}
protected boolean isBalance() {
if(act.get_Money()<0) {
return false;
}
return true;
}
protected boolean isRight(String card,String pwd) {
if(act.get_Code().equals(card)
act.get_Password().equals(pwd))
return true;
else
return false;
}
protected void Set_Password() throws Exception {
String pwd=null;
&&
int counter=0;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
do {
System.out.println("请输入旧密码:");
pwd=br.readLine();
if(act.get_Password().equals(pwd))
{
do {
System.out.println("请输入新密码:");
String pwd1=br.readLine();
System.out.println("请再次输入新密码:");
String pwd2=br.readLine();
if(!pwd1.equals(pwd2))
{
System.out.println("两次输入不一致,请再次输入."); }
else
{
System.out.println("密码修改成功,请使用新密码."); Welcome();
SysOpter();
}
}while(true);
}
}while(counter>3);
}
protected void Lock_Sys() {
System.out.println("对不起,您的操作有误,卡已被没收.");
System.exit(1);
}
protected void Exit_Sys() {
System.out.println("感谢您使用本系统,欢迎下次在来,再见!");
System.exit(1);
}
}
public class Text
{
public static void main(String[] args) throws Exception {
ATM atm=new ATM();
atm.Welcome();
atm.Load_Sys();
}
}
2.6运行结果
3.总结
在这次设计过程中,不仅复习课本上所学知识,还通过查资
料、问同学学到了课本上没有的知识。从而启发我,要想写好程序,在写好课本知识的同时还需要多读和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用,力争写出完美的程序。除此之外,我还得到了一些有用的教训:写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。在修改时要有耐心,编译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。
3.1项目开发中遇到的困难及解决
在设计中,一些小错误,导致了整个程序的错误,我会求助老师或同学帮我查找,发现错误然后加以改正。
虽然本程序在刚开始调试时有许多错误,但是在我的努力及同学和老师的帮助下这些困难都被一一克服,现在在操作本程序时可根据提示进行相关操作,能正确输出结果。
3.2体会
经过短暂的一周的Java程序设计,使我又学到了很多的知识,尤其是运用Java知识去解决实际问题的能力有得到了很大的提高。由于把所学到的知识做到很灵活的运用到实际中,对于现在的我还有一定的难度,故而,在设计的每个环节中,都会多多少少的遇到一些
问题,这就促使我去查阅各种资料,或者请教同学,极大的提高了我的专业素养,同时对在有些书上的理论知识在实际的运用,以及应该注意的问题有了比较深刻的认识。当然,仍然有些理论问题不是很好的去运用,或者是了解的不深刻。这就使得在实践中所设计的程序有些功能不是自己所想的那样完美。不过,既然发现了问题的所在,我就不会放弃,直至问题得到解决。这些也同时反映出了平时运用知识去实践这方面做的太少,缺乏经验。对所设计中将面临的问题认识不够。是Java课程设计让我认识到这些问题的存在。同时给我提供了去面对这些问题的平台。也使我充分地认识到在以后应该怎样去实践,怎样去学习一门计算机语言,以及如何去运用这门语言区解决实际问题等等。
总之,在经过这次Java的课程设计,使我认识到了自己很多的缺点,同时,也是我学到新知识和新方法的一个机会。这给我在以后继续学习好这门语言指明了方向。
3.3参考资料(书、论文、网络资料)
[1]Java语言程序设计(第三版)—邵丽萍 邵光亚 张后扬 编著 [2]
Java程序设计课程设计报告
( 20## -- 20## 年度第 1 学期)
Hannio塔
目 录... 2
1 概 述... 1
1.1 课程设计目的... 1
1.2 课程设计内容... 1
2 系统需求分析... 1
2.1 系统目标... 1
2.2 主体功能... 1
2.3 开发环境... 1
3 系统概要设计... 2
3.1 系统的功能模块划分... 2
3.2 系统流程图... 2
4系统详细设计... 2
5 测试... 14
5.1 测试方案... 14
5.2 测试结果... 14
6 小结... 16
参考文献... 17
附录1 源程序清单... 18
题目
随着社会的进步,我们用来娱乐的游戏世界也越来越丰富,越来越复杂。本程序的Hannoi塔游戏不但包括了游戏最基本的功能,而且还能培养用户的逻辑思维能力,同时也给玩家提供了一定的娱乐空间。本游戏还包括一个自动演示搬移Hannoi塔的功能,此功能能够帮助初次接触此游戏的用户了解此游戏的玩法。
设计HUI界面的Hannoi塔,用户可以通过拖动鼠标移动各个塔上的盘子,程序也可以自动演示盘子的移动过程
可以正常运行程序,并且按照设计目的预想的完成具体功能。
(1)设计GUI界面的Hannoi塔。Hannoi塔中有三个座,名字分别是A、B和C。初始状态 是A座上有五个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。
(2)程序要求用户在移动盘子过程中,不允许把大盘子放在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。
(3)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到B座或C座上。
(4)用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始游戏。
JDK1.6。
(1)Tower.java(主类)
Tower类负责创建Hannoi塔的主窗口,该类含有main方法,Hannoi塔从类开始执行。Tower类的成员变量中有两种重要类型的对象:一个int基本型数据和一个char型数组。两种类型的对象分别是:HannoiTower和Button对象 。
(2)HannoiTower.java
HannoiTower类是javax.swing包中JPanel容器的子类,创建的容器被添加到Tower窗口的中心。HannoiTower类的成员变量有两种重要类型的对象、一个int基类型数据和一个char型数组。两种类型的对象分别是:Disk、TowerPoint。
(3)TowerPoint.java
TowerPoint类负责在HannoiTower中创建表示位置的塔点对象。
(4)Disk.java
Disk类是Button的一个子类,创建的对象是HannoiTower容器中的一个按钮,用来表示HannoiTower中的盘子。
Tower类
Tower类是javax.swing包中Frame的一个子类,标明该类的主要成员变量和方法:
① 成员变量
tower是HannoiTower创建的对象。tower对象是一个容器,刻画了Hannoi塔的结构,该对象被添加到窗口的中心。
盘子数目是int型数据,它的默认值是5。盘子数目的值是用来确定tower对象中“盘子”的数目。
towerName是char型数组,长度为3,其三个单元的默认取值依次是A、B和C。towerName数组的单元的值用来确定tower中三个塔的名字。
renew和auto是Button创建的按钮对象,名字依次为“重新开始”和“自动演示搬盘子”,renew和auto都将当前窗口注册为自己的ActionEvent事件监视器。
② 方法
Tower()是构造方法,负责完成窗口的初始化。
main方法是Hannoi塔程序运行的入口方法。
actionPerformed(ActionEvent)方法是HannoiTower类实现的ActionListener 接口中的方法。HannoiTower创建的窗口是renew和auto两个按钮的ActionEvent事件监视器。当用户单击按钮时,窗口将执行actionPerformed(ActionEvent)方法进行相应的操作。当用户单击renew按钮时,actionPerformed(ActionEvent)方法所进行的操作是保持当前的盘子数目的值,并让tower对象根据盘子数目的值设置其初始状态。当用户单击auto按钮时,actionPerformed(ActionEvent)方法所进行的操作是让tower对象返回其中的AutoMoveDisc对象,该对象是一个对话框,用户可以通过对话框让程序自动地移动“盘子”。
代码(Tower.java)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Tower extends Frame implements ActionListener,Runnable
{ HannoiTower tower=null;
Button renew,auto=null;
char towerName[]={'A','B','C'};
int 盘子数目,盘宽,盘高;
Thread thread;
TextArea 信息条=null;
public Tower()
{ thread=new Thread(this);
盘子数目=5;
盘宽=80;
盘高=18;
信息条=new TextArea(12,12);
信息条.setText(null);
tower=new HannoiTower(盘子数目,盘宽,盘高,towerName,信息条);
renew=new Button("重新开始");
auto=new Button("自动演示搬盘子");
renew.addActionListener(this);
auto.addActionListener(this);
add(tower,BorderLayout.CENTER);
add(renew,BorderLayout.SOUTH);
add(auto,BorderLayout.NORTH);
add(信息条,BorderLayout.EAST);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);}
};
setVisible(true);
setBounds(60,20,670,540);
validate();
}
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==renew)
{ if(!(thread.isAlive()))
{ this.remove(tower);
信息条.setText(null);
tower=new HannoiTower(盘子数目,盘宽,盘高,towerName,信息条);
add(tower,BorderLayout.CENTER);
validate();
}
else
{ }
}
if(e.getSource()==auto)
{ if(!(thread.isAlive()))
{ thread=new Thread(this); }
try
{ thread.start(); }
catch(Exception eee)
{ }
}
}
public void run()
{ this.remove(tower);
信息条.setText(null);
tower=new HannoiTower(盘子数目,盘宽,盘高,towerName,信息条);
add(tower,BorderLayout.CENTER);
validate();
tower.自动演示搬运盘子(盘子数目,towerName[0] ,towerName[1],towerName[2]);
}
public static void main(String args[])
{ new Tower(); }
}
HannoiTower类
HannoiTower类是javax.swing包中JPanel容器的一个子类,创建的对象tower是Tower窗口的成员之一,被添加到Tower窗口的中心位置。
① 成员变量
盘子数目是int型数据。盘子数目值用来确定tower对象中盘子的数目。
盘子是Disk型数组,该数组的长度由盘子数目值来确定。Disk数组的每个单元中存放一个Disk对象,依次表明tower对象中有怎样多的盘子。
towerName是char型数组,长度为3,其三个单元的默认取值依次是A、B和C。
Height的值确定每个盘子的高度。
pointA、pointB、pointC都是TowerPoint型数组,三个数组的长度与盘子数目相同,即都是盘子数目。pointA、pointB和pointC的单元都是TowerPoint创建对象,分别用来表示Hannoi塔中三个座上的塔点。A座、B座和C座上的三个塔点分别由pointA、pointB和pointC中的单元来确定。每个座上的五个塔点都是从座顶到座底依次对应数组的相应单元中的TowerPoint对象。
② 方法
HannoiTower(char[])是构造方法,负责完成tower容器的初始化。
tower容器调用paintComponent(Graphics)方法绘制出塔点的位置和必要的视图。
代码(HannoiTower.java)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class HannoiTower extends JPanel implements MouseListener,MouseMotionListener
{ TowerPoint point[];
int x,y;
boolean move=false;
Disk 盘子[];
int startX,startY;
int startI ;
int 盘子数目=0;
int width,height;
char towerName[]={'A','B','C'};
TextArea 信息条=null;
public HannoiTower(int number,int w,int h,char[] name,TextArea text)
{ towerName=name;
盘子数目=number;
width=w;
height=h;
信息条=text;
setLayout(null);
addMouseListener(this);
addMouseMotionListener(this);
盘子= new Disk[盘子数目];
point=new TowerPoint[3*盘子数目];
int space=20;
for(int i=0;i<盘子数目;i++)
{ point[i]=new TowerPoint(40+width,100+space,false);
space=space+height;
}
space=20;
for(int i=盘子数目;i<2*盘子数目;i++)
{ point[i]=new TowerPoint(160+width,100+space,false);
space=space+height;
}
space=20;
for(int i=2*盘子数目;i<3*盘子数目;i++)
{ point[i]=new TowerPoint(280+width,100+space,false);
space=space+height;
}
int tempWidth=width;
int sub=(int)(tempWidth*0.2);
for(int i=盘子数目-1;i>=0;i--)
{ 盘子[i]=new Disk(i,this);
盘子[i].setSize(tempWidth,height);
tempWidth=tempWidth-sub;
}
for(int i=0;i<盘子数目;i++)
{ point[i].放置盘子(盘子[i],this);
if(i>=1)
盘子[i].set上方有盘(true);
}
}
public void paintComponent(Graphics g)
{ super.paintComponent(g);
g.drawLine(point[0].getX(),point[0].getY(),point[盘子数目-1].getX(),point[盘子数目-1].getY());
g.drawLine(point[盘子数目].getX(),point[盘子数目].getY(),point[2*盘子数目-1].getX(),point[2*盘子数目-1].getY());
g.drawLine(point[2*盘子数目].getX(),point[2*盘子数目].getY(),point[3*盘子数目-1].getX(),point[3*盘子数目-1].getY());
g.drawLine(point[盘子数目-1].getX()-width,point[盘子数目-1].getY(),point[3*盘子数目-1].getX()+width,point[3*盘子数目-1].getY());
int leftx=point[盘子数目-1].getX()-width;
int lefty=point[盘子数目-1].getY();
int w=(point[3*盘子数目-1].getX()+width)-(point[盘子数目-1].getX()-width);
int h=height/2;
g.setColor(Color.orange);
g.fillRect(leftx,lefty,w,h);
g.setColor(Color.red);
int size=4;
for(int i=0;i<3*盘子数目;i++)
{ g.fillOval(point[i].getX()-size/2,point[i].getY()-size/2,size,size); }
g.drawString(""+towerName[0]+"塔",point[盘子数目-1].getX(),point[盘子数目-1].getY()+30);
g.drawString(""+towerName[1]+"塔",point[2*盘子数目-1].getX(),point[盘子数目-1].getY()+30);
g.drawString(""+towerName[2]+"塔",point[3*盘子数目-1].getX(),point[盘子数目-1].getY()+30);
g.drawString("将全部盘子从"+towerName[0]+"塔搬运到"+towerName[1]+"塔或"+towerName[2]+"塔",point[盘子数目-1].getX(),point[盘子数目-1].getY()+80);
}
public void mousePressed(MouseEvent e)
{ Disk 盘子=null;
Rectangle rect=null;
if(e.getSource()==this)
move=false;
if(move==false)
if(e.getSource() instanceof Disk)
{ 盘子=(Disk)e.getSource();
startX=盘子.getBounds().x;
startY=盘子.getBounds().y;
rect=盘子.getBounds();
for(int i=0;i<3*盘子数目;i++)
{ int x=point[i].getX();
int y=point[i].getY();
if(rect.contains(x,y))
{ startI=i;
break;
}
}
}
}
public void mouseMoved(MouseEvent e)
{ }
public void mouseDragged(MouseEvent e)
{ Disk disk=null;
if(e.getSource() instanceof Disk)
{ disk=(Disk)e.getSource();
move=true;
e=SwingUtilities.convertMouseEvent(disk,e,this);
}
if(e.getSource()==this)
{ if(move&&disk!=null)
{ x=e.getX();
y=e.getY();
if(disk.get上方有盘()==false)
disk.setLocation(x-disk.getWidth()/2,y-disk.getHeight()/2);
}
}
}
public void mouseReleased(MouseEvent e)
{ Disk disk=null;
move=false;
Rectangle rect=null;
if(e.getSource() instanceof Disk)
{ disk=(Disk)e.getSource();
rect=disk.getBounds();
e=SwingUtilities.convertMouseEvent(disk,e,this);
}
if(e.getSource()==this)
{ boolean containTowerPoint=false;
int x=0,y=0;
int endI=0;
if(disk!=null)
{ for(int i=0;i<3*盘子数目;i++)
{ x=point[i].getX();
y=point[i].getY();
if(rect.contains(x,y))
{ containTowerPoint=true;
endI=i;
break;
}
}
}
if(disk!=null&&containTowerPoint)
{ if(point[endI].是否有盘子()==true)
{ disk.setLocation(startX,startY); }
else
{ if(endI==盘子数目-1||endI==2*盘子数目-1||endI==3*盘子数目-1)
{ point[endI].放置盘子(disk,this);
if(startI!=盘子数目-1&&startI!=2*盘子数目-1&&startI!=3*盘子数目-1)
{(point[startI+1].获取盘子()).set上方有盘(false);
point[startI].set有盘子(false);
}
else
{ point[startI].set有盘子(false);
}
}
else
{ if(point[endI+1].是否有盘子()==true)
{ Disk tempDisk=point[endI+1].获取盘子();
if((tempDisk.getNumber()-disk.getNumber())>=1)
{ point[endI].放置盘子(disk,this);
if(startI!=盘子数目-1&&startI!=2*盘子数目-1&&startI!=3*盘子数目-1)
{ (point[startI+1].获取盘子()).set上方有盘(false);
point[startI].set有盘子(false);
tempDisk.set上方有盘(true);
}
else
{ point[startI].set有盘子(false);
tempDisk.set上方有盘(true);
}
}
else
{ disk.setLocation(startX,startY); }
}
else
{disk.setLocation(startX,startY); }
}
}
}
if(disk!=null&&!containTowerPoint)
{ disk.setLocation(startX,startY);}
}
}
public void mouseEntered(MouseEvent e)
{ }
public void mouseExited(MouseEvent e)
{ }
public void mouseClicked(MouseEvent e)
{ }
public void 自动演示搬运盘子(int 盘子数,char one,char two,char three)
{ if(盘子数==1)
{ 信息条.append(""+one+" 到: "+three+"塔\n");
Disk disk=在塔中获取最上面的盘子(one);
int startI=在塔中获取最上面盘子的位置(one);
int endI=在塔中获取最上面盘子的上方位置(three);
if(disk!=null)
{ point[endI].放置盘子(disk,this);
point[startI].set有盘子(false);
try
{ Thread.sleep(1000); }
catch(Exception ee)
{ }
}
}
else
{ 自动演示搬运盘子(盘子数-1,one,three,two);
信息条.append(""+one+" 到: "+three+"塔\n");
Disk disk=在塔中获取最上面的盘子(one);
int startI=在塔中获取最上面盘子的位置(one);
int endI=在塔中获取最上面盘子的上方位置(three);
if(disk!=null)
{ point[endI].放置盘子(disk,this);
point[startI].set有盘子(false);
try
{ Thread.sleep(1000); }
catch(Exception ee)
{ }
}
自动演示搬运盘子(盘子数-1,two,one,three);
}
}
public Disk 在塔中获取最上面的盘子(char 塔名)
{ Disk disk=null;
if(塔名==towerName[0])
{ for(int i=0;i<盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ disk=point[i].获取盘子();
break;
}
}
}
if(塔名==towerName[1])
{ for(int i=盘子数目;i<2*盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ disk=point[i].获取盘子();
break;
}
}
}
if(塔名==towerName[2])
{ for(int i=2*盘子数目;i<3*盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ disk=point[i].获取盘子();
break;
}
}
}
return disk;
}
public int 在塔中获取最上面盘子的上方位置(char 塔名)
{ int position=0;
if(塔名==towerName[0])
{ int i=0;
for(i=0;i<盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ position=Math.max(i-1,0);
break;
}
}
if(i==盘子数目)
{ position=盘子数目-1;}
}
if(塔名==towerName[1])
{ int i=0;
for(i=盘子数目;i<2*盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ position=Math.max(i-1,0);
break;
}
}
if(i==2*盘子数目)
{ position=2*盘子数目-1; }
}
if(塔名==towerName[2])
{ int i=0;
for(i=2*盘子数目;i<3*盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ position=Math.max(i-1,0);
break;
}
}
if(i==3*盘子数目)
{ position=3*盘子数目-1; }
}
return position;
}
public int 在塔中获取最上面盘子的位置(char 塔名)
{ int position=0;
if(塔名==towerName[0])
{ int i=0;
for(i=0;i<盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ position=i;
break;
}
}
if(i==盘子数目)
{ position=盘子数目-1; }
}
if(塔名==towerName[1])
{ int i=0;
for(i=盘子数目;i<2*盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ position=i;
break;
}
}
if(i==2*盘子数目)
{ position=2*盘子数目-1; }
}
if(塔名==towerName[2])
{ int i=0;
for(i=2*盘子数目;i<3*盘子数目;i++)
{ if(point[i].是否有盘子()==true)
{ position=i;
break;
}
}
if(i==3*盘子数目)
{ position=3*盘子数目-1; }
}
return position;
}
}
Disk类是javax.swing包中Button类的子类,所创建的对象称作Hannoi塔中的“盘子”。HannoiTower类有Disk类型的数组盘子。盘子数组的单元是用Disk创建的对象,被放置在Tower所创建的容器tower中,用来表示tower中的“盘子”。
① 成员变量
number的值确定所创建的“盘子”上的数字号码,通过该号码的大小来确定盘子的大小关系,即号码大的盘子大于号码小的盘子。
② 方法
Disk()构造方法。创建盘子对象时需要使用该构造方法。
setNumber(int n)。盘子调用该方法设置其上的数字号码。
getNumber()方法。盘子调用该方法返回其上的数字号码。
set上方有盘()方法。盘子调用该方法设置其所在的塔点。
get上方有盘()方法。盘子调用该方法返回其所在的塔点。
代码(Disk.java)
import java.awt.*;
public class Disk extends Button
{ int number;
boolean 上方有盘=false;
public Disk(int number,HannoiTower con)
{ this.number=number;
setBackground(Color.blue);
addMouseMotionListener(con);
addMouseListener(con);
}
public boolean get上方有盘()
{ return 上方有盘; }
public void set上方有盘(boolean b)
{ 上方有盘=b; }
public int getNumber()
{ return number; }
}
TowerPoint类
TowerPoint所创建的对象将作为HannoiTower类中TowerPoint型数组pointA、pointB和pointC中的元素。
① 成员变量
x和y是TowerPoint对象中的两个int型数据,用来表示塔点在容器tower中的坐标。tower容器的坐标原点是容器的左上角,向右是x轴的正方向,向下是y轴的正方向。
有盘子是boolean数据,如果当前塔点上有盘子时,该数据为true;否则为false。
盘子是Disk声明的对象,用来存放当前塔点上的盘子对象的引用,如果当前塔点上有盘子,盘子存放的引用是null,即盘子是空对象。
② 方法
TowerPoint(int,int)是构造方法,用来创建塔点对象。
塔点对象调用是否有盘子()方法可以返回一个boolean数据,如果调用该方法的塔点上有盘子,是否有盘子()方法返回true;否则返回false。
塔点对象调用set有盘子(boolean)方法可以根据参数的值设置当前塔点上是否有盘子。
塔点对象调用getX()和getY()方法可以返回塔点的坐标中的x轴坐标和y轴坐标。
塔点对象调用Equals(TowerPoint)方法可以判断当前塔点是否和参数指定的塔点相同。
塔点对象调用Equals(TowerPoint)方法putDisc(Component com,Container con)方法,将参数com指定的盘子放置在参数con指定的容器中,盘子所在位置由当前的塔点坐标所确定,即将盘子放置在当前塔点上。
塔点对象调用getDiscOnPoint()方法可以返回当前塔点上的盘子。
塔点对象调用removeDisc(Component com,Container con)方法可以移掉当前塔点上的盘子。
代码(TowerPoint.java)
import java.awt.*;
public class TowerPoint
{ int x,y;
boolean 有盘子;
Disk 盘子=null;
HannoiTower con=null;
public TowerPoint(int x,int y,boolean boo)
{ this.x=x;
this.y=y;
有盘子=boo;
}
public boolean 是否有盘子()
{ return 有盘子; }
public void set有盘子(boolean boo)
{ 有盘子=boo; }
public int getX()
{ return x; }
public int getY()
{ return y; }
public void 放置盘子(Disk 盘子,HannoiTower con)
{ this.con=con;
con.setLayout(null);
this.盘子=盘子;
con.add(盘子);
int w=盘子.getBounds().width;
int h=盘子.getBounds().height;
盘子.setBounds(x-w/2,y-h/2,w,h);
有盘子=true;
con.validate();
}
public Disk 获取盘子()
{ return 盘子; }
}
本程序的初始状态是A塔上有五个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A塔上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。程序要求用户在移动盘子过程中,不允许把大盘子放在小盘子的上面,用户最终要完成的是把A塔上的全部盘子移动到B塔或C塔上。用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A塔上的盘子全部移动到B塔或C塔上。用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始游戏。
下面是程序运行的效果图。
(1)Tower类创建的窗口效果如图所示。
(2) HannoiTower类是javax.swing包中JPanel容器的一个子类,创建的对象tower是Tower窗口的成员之一,被添加到Tower窗口的中心位置。HannoiTower创建的容器效果如图所示。
(3) Disk类是javax.swing包中Button类的子类,所创建的对象称作Hannoi塔中的“盘子”。Disk创建的按钮的效果如图所示。
(4)TowerPoint创建的对象含有两个int型数据,用来表示塔点的位置坐标,该位置坐标由tower容器的pointComponent(Graphics g)方法负责绘制,绘制的形状是一个小圆点,如图所示。
(5)自动演示的效果图如图所示。
通过这次课程设计,使我充分的熟练了Java这种面向对象编程语言的编写。另外还巩固了我们在C语言和数据结构学过的许多知识,比如说if...else判断语句的应用,字符输出,用的最多的还是循环(While循环、For循环)。
在此感谢我们的原钥老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次课程设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。
[1]耿祥义,张跃平. Java2实用教程(第三版)[M] . 北京:清华大学出版社, 20##
[2]耿祥义. Java课程设计(第三版)[M] . 北京:清华大学出版社, 2004
[3]张跃平.Java2实用教程实验指导与习题解答(第三版)[M]. 北京:清华大学出版社, 2004
[4]Jacquie Barker,Java面向对象编程指南,电子工业出版社,2001
附 录
Flash程序设计课程设计报告课程名称Flash程序设计实验项目名称4屏flash焦点图上下切换效果程序院系物理与电子信息学院学号…
河北科技大学课程设计报告学生姓名祝冬冬学号专业班级计算机科学与技术课程名称学年学期指导教师2011年6月课程设计成绩评定表目录示例…
本科生课程设计课程名称Java程序设计B课程设计题目学号学生姓名所在专业所在班级指导教师成绩教师签字评语课程设计时间20xx年12…
呼伦贝尔学院计算机科学与技术学院软件工程报告书题目:JAVA记事本学生姓名:学号:专业班级:网络工程本四指导教师:完成时间:20#…
南京晓庄学院JAVA程序设计课程设计报告题目姓名学号班级指导教师完成时间贪吃蛇游戏系统的设计与实现刘婷婷1213074012软转1…
黄淮学院JAVA课程设计报告题目:《日记本的设计与实现》课程设计学院:信息工程学院姓名:学号:专业:软件工程班级:软工1101B班…
沈阳理工大学课程实践论文目录1前言111作业背景112课题简介113工作介绍1131个人主要工作1132主要收获2133自我评定2…
Java程序设计课程设计报告20xx20xx年度第1学期Hannio塔专业学生姓名班级学号指导教师完成日期计算机科学技术网络工程马…
Java课程设计报告课目计算器学院基础学院班级光信息20xx1学生指导教师丁振凡张晓瑞辅导教师江宇完成时间20xx年7月1日课程设…
安阳工学院计算机学院JAVA课程设计报告蜘蛛纸牌游戏专业班级09级网络工程2班学生姓名李瑞琳学生学号20xx03060016小组成…
Flash程序设计课程设计报告课程名称Flash程序设计实验项目名称4屏flash焦点图上下切换效果程序院系物理与电子信息学院学号…