📄 haniota.java
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class haniota extends Frame implements ActionListener,Runnable
{
tower tow=null;
boolean move=false;
Button start,stop,auto=null;
char towerName[]={'A','B','C'};
int dnum,dwidth,dheight;
Thread thread;
TextArea text=null;
private JTextField textf,textp,textk,textj;
JPanel pane,tssj;
private JLabel lDiskNum,pausetime,kssj,jssj;
public haniota()
{
super("汉诺塔--03级软件(2)班 陈伟 3103003333");
thread=new Thread(this);
dwidth=148;
dheight=18;
text=new TextArea(14,14);
text.setText(null);
text.enable(false);
textf=new JTextField(8);
textk=new JTextField(8);
textj=new JTextField(8);
textp=new JTextField(8);
textf.setText(null);
textp.setText("500");
textk.setText("2005-1-4");
textj.setText("2005-1-5");
textk.enable(false);
textj.enable(false);
lDiskNum = new JLabel("盘子的数目");
pausetime= new JLabel("延迟时间");
kssj = new JLabel("开始调试时间");
jssj = new JLabel("结束调试时间");
pane = new JPanel();
tssj = new JPanel();
pane.setLayout(new FlowLayout());
tssj.setLayout(new FlowLayout());
start=new Button("开始");
auto=new Button("自动演示");
stop=new Button("停止");
start.addActionListener(this);
stop.addActionListener(this);
auto.addActionListener(this);
pane.add(pausetime);
pane.add(textp);
pane.add(lDiskNum);
pane.add(textf);
pane.add(start);
pane.add(stop);
pane.add(auto);
tssj.add(kssj);
tssj.add(textk);
tssj.add(jssj);
tssj.add(textj);
pane.setBackground(Color.blue);
tssj.setBackground(Color.blue);
add(tssj,BorderLayout.NORTH);
add(text,BorderLayout.EAST);
add(pane,BorderLayout.SOUTH);
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()==start)
{
if(!(thread.isAlive()))
{
thread=new Thread(this);
}
try
{
move=false;
thread.start();
dnum=Integer.parseInt(textf.getText());
this.remove(tow);
text.setText(null);
validate();
}
catch(Exception eee)
{
}
}
if(e.getSource()==stop)
{
if(thread.isAlive())
{
try
{
thread.stop();
}
catch(Exception eee)
{
}
}
}
if(e.getSource()==auto)
{
if(!(thread.isAlive()))
{
thread=new Thread(this);
}
try
{
move=true;
thread.start();
this.remove(tow);
text.setText(null);
validate();
}
catch(Exception eee)
{
}
}
}
public void run()
{
text.setText(null);
tow=new tower(dnum,dwidth,dheight,towerName,text);
add(tow,BorderLayout.CENTER);
validate();
if(move)tow.automove(dnum,towerName[0] ,towerName[1],towerName[2]);
move=false;
}
public static void main(String args[])
{
new haniota();
}
public class tower extends JPanel implements MouseListener,MouseMotionListener
{
tpoint point[];
boolean move=false;
tdisk disk[];
int sI ;
int x,y;
int sX,sY;
int disknum=0;
int width,height;
char tname[]={'A','B','C'};
TextArea textf=null;
public tower(int number,int w,int h,char[] name,TextArea text)
{
tname=name;
disknum=number;
width=w;
height=h;
textf=text;
setLayout(null);
addMouseListener(this);
addMouseMotionListener(this);
disk= new tdisk[disknum];
point=new tpoint[3*disknum];
this.setBackground(Color.orange);
int sp=20;
for(int i=0;i<disknum;i++)
{
point[i]=new tpoint(5+width,50+sp,false);
sp=sp+height;
}
sp=20;
for(int i=disknum;i<2*disknum;i++)
{
point[i]=new tpoint(150+width,50+sp,false);
sp=sp+height;
}
sp=20;
for(int i=2*disknum;i<3*disknum;i++)
{
point[i]=new tpoint(300+width,50+sp,false);
sp=sp+height;
}
int dwidth=width;
int small=(int)(dwidth*0.1);
for(int i=disknum-1;i>=0;i--)
{
disk[i]=new tdisk(i,this);
disk[i].setSize(dwidth,height);
dwidth=dwidth-small;
}
for(int i=0;i<disknum;i++)
{
point[i].setdisk(disk[i],this);
if(i>=1)
disk[i].setupdisk(true);
disk[i].setLabel(""+(i+1));
}
}
public void paint(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.white);
int size=4;
for(int i=0;i<3*disknum;i++)
{
g.fillOval(point[i].getX()-size/2,point[i].getY()-size/2,size,size);
}
g.drawString(""+tname[0]+"塔",point[disknum-1].getX(),point[disknum-1].getY()+30);
g.drawString(""+tname[1]+"塔",point[2*disknum-1].getX(),point[disknum-1].getY()+30);
g.drawString(""+tname[2]+"塔",point[3*disknum-1].getX(),point[disknum-1].getY()+30);
}
public void mousePressed(MouseEvent e)
{
tdisk disk=null;
Rectangle rect=null;
if(e.getSource()==this)
move=false;
if(move==false)
if(e.getSource() instanceof tdisk)
{
disk=(tdisk)e.getSource();
sX=disk.getBounds().x;
sY=disk.getBounds().y;
rect=disk.getBounds();
for(int i=0;i<3*disknum;i++)
{
int x=point[i].getX();
int y=point[i].getY();
if(rect.contains(x,y))
{
sI=i;
break;
}
}
}
}
public void mouseMoved(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
tdisk disk=null;
if(e.getSource() instanceof tdisk)
{
disk=(tdisk)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.getupdisk()==false)
disk.setLocation(x-disk.getWidth()/2,y-disk.getHeight()/2);
}
}
}
public void mouseReleased(MouseEvent e)
{
tdisk disk=null;
move=false;
Rectangle rect=null;
if(e.getSource() instanceof tdisk)
{
disk=(tdisk)e.getSource();
rect=disk.getBounds();
e=SwingUtilities.convertMouseEvent(disk,e,this);
}
if(e.getSource()==this)
{
boolean cpoint=false;
int x=0,y=0;
int eI=0;
if(disk!=null)
{
for(int i=0;i<3*disknum;i++)
{
x=point[i].getX();
y=point[i].getY();
if(rect.contains(x,y))
{
cpoint=true;
eI=i;
break;
}
}
}
if(disk!=null&&cpoint)
{
if(point[eI].ifdisk()==true)
{
disk.setLocation(sX,sY);
}
else
{
if(eI==disknum-1||eI==2*disknum-1||eI==3*disknum-1)
{
point[eI].setdisk(disk,this);
if(sI!=disknum-1&&sI!=2*disknum-1&&sI!=3*disknum-1)
{
(point[sI+1].getdisk()).setupdisk(false);
point[sI].sethdisk(false);
}
else
{
point[sI].sethdisk(false);
}
}
else
{
if(point[eI+1].ifdisk()==true)
{
tdisk tempDisk=point[eI+1].getdisk();
if((tempDisk.getNumber()-disk.getNumber())>=1)
{
point[eI].setdisk(disk,this);
if(sI!=disknum-1&&sI!=2*disknum-1&&sI!=3*disknum-1)
{
(point[sI+1].getdisk()).setupdisk(false);
point[sI].sethdisk(false);
tempDisk.setupdisk(true);
}
else
{
point[sI].sethdisk(false);
tempDisk.setupdisk(true);
}
}
else
{
disk.setLocation(sX,sY);
}
}
else
{
disk.setLocation(sX,sY);
}
}
}
}
if(disk!=null&&!cpoint)
{
disk.setLocation(sX,sY);
}
}
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
public void automove(int num,char A,char B,char C)
{
int sI,eI;
if(num==1)
{
textf.append(""+A+"塔 -----> "+C+"塔\n");
tdisk disk=gettopdisk(A);
sI=gettoppos(A);
eI=gettopuppos(C);
if(disk!=null)
{
point[eI].setdisk(disk,this);
point[sI].sethdisk(false);
pause();
}
}
else
{
automove(num-1,A,C,B);
textf.append(""+A+"塔 -----> "+C+"塔\n");
tdisk disk=gettopdisk(A);
sI=gettoppos(A);
eI=gettopuppos(C);
if(disk!=null)
{
point[eI].setdisk(disk,this);
point[sI].sethdisk(false);
pause();
}
automove(num-1,B,A,C);
}
}
public tdisk searchdisk(int a,int b)
{
tdisk disk=null;
for(int i=a;i<b;i++)
{
if(point[i].ifdisk()==true)
{
disk=point[i].getdisk();
break;
}
}
return disk;
}
public tdisk gettopdisk(char name)
{
tdisk disk=null;
if(name==tname[0])disk=searchdisk(0,disknum);
if(name==tname[1])disk=searchdisk(disknum,2*disknum);
if(name==tname[2])disk=searchdisk(2*disknum,3*disknum);
return disk;
}
public int searchpos(int a,int b,int p)
{
int i=0;
int position=0;
for(i=a;i<b;i++)
{
if(point[i].ifdisk()==true)
{
if(p==1)position=Math.max(i-1,0);
else if(p==2)position=i;
break;
}
}
if(i==b)
{
position=b-1;
}
return position;
}
public int gettopuppos(char name)
{
int position=0;
if(name==tname[0])position=searchpos(0,disknum,1);
if(name==tname[1])position=searchpos(disknum,2*disknum,1);
if(name==tname[2])position=searchpos(2*disknum,3*disknum,1);
return position;
}
public int gettoppos(char name)
{
int position=0;
if(name==tname[0])position=searchpos(0,disknum,2);
if(name==tname[1])position=searchpos(disknum,2*disknum,2);
if(name==tname[2])position=searchpos(2*disknum,3*disknum,2);
return position;
}
public void pause()
{
int pau=Integer.parseInt(textp.getText());
try{
Thread.sleep(pau);
}catch(InterruptedException e){}
}
}
class tpoint
{
int x,y;
boolean hdisk;
tdisk disk=null;
tower t=null;
public tpoint(int x,int y,boolean b)
{
this.x=x;
this.y=y;
hdisk=b;
}
public boolean ifdisk()
{
return hdisk;
}
public void sethdisk(boolean b)
{
hdisk=b;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public void setdisk(tdisk disk,tower t)
{
this.t=t;
t.setLayout(null);
this.disk=disk;
t.add(disk);
int w=disk.getBounds().width;
int h=disk.getBounds().height;
disk.setBounds(x-w/2,y-h/2,w,h);
hdisk=true;
t.validate();
}
public tdisk getdisk()
{
return disk;
}
}
class tdisk extends Button
{
int num;
boolean updisk=false;
public tdisk(int number,tower t)
{
this.num=number;
setBackground(Color.red);
addMouseMotionListener(t);
addMouseListener(t);
}
public boolean getupdisk()
{
return updisk;
}
public void setupdisk(boolean b)
{
updisk=b;
}
public int getNumber()
{
return num;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -