📄 tower.java
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
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];
int sp=20;
for(int i=0;i<disknum;i++)
{
point[i]=new tpoint(50+width,50+sp,false);
sp=sp+height;
}
sp=20;
for(int i=disknum;i<2*disknum;i++)
{
point[i]=new tpoint(180+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);
}
}
public void paint(Graphics g)
{
super.paintComponent(g);
//int lx=point[disknum-1].getX()-width;
//int ly=point[disknum-1].getY();
//int w=(point[3*disknum-1].getX()+width)-(point[disknum-1].getX()-width);
//int h=height/2;
g.setColor(Color.red);
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 gettopdisk(char name)
{
tdisk disk=null;
if(name==tname[0])
{
for(int i=0;i<disknum;i++)
{
if(point[i].ifdisk()==true)
{
disk=point[i].getdisk();
break;
}
}
}
if(name==tname[1])
{
for(int i=disknum;i<2*disknum;i++)
{
if(point[i].ifdisk()==true)
{
disk=point[i].getdisk();
break;
}
}
}
if(name==tname[2])
{
for(int i=2*disknum;i<3*disknum;i++)
{
if(point[i].ifdisk()==true)
{
disk=point[i].getdisk();
break;
}
}
}
return disk;
}
public int gettopuppos(char name)
{
int position=0;
if(name==tname[0])
{
int i=0;
for(i=0;i<disknum;i++)
{
if(point[i].ifdisk()==true)
{
position=Math.max(i-1,0);
break;
}
}
if(i==disknum)
{
position=disknum-1;
}
}
if(name==tname[1])
{
int i=0;
for(i=disknum;i<2*disknum;i++)
{
if(point[i].ifdisk()==true)
{
position=Math.max(i-1,0);
break;
}
}
if(i==2*disknum)
{
position=2*disknum-1;
}
}
if(name==tname[2])
{
int i=0;
for(i=2*disknum;i<3*disknum;i++)
{
if(point[i].ifdisk()==true)
{
position=Math.max(i-1,0);
break;
}
}
if(i==3*disknum)
{
position=3*disknum-1;
}
}
return position;
}
public int gettoppos(char name)
{
int position=0;
if(name==tname[0])
{
int i=0;
for(i=0;i<disknum;i++)
{
if(point[i].ifdisk()==true)
{
position=i;
break;
}
}
if(i==disknum)
{
position=disknum-1;
}
}
if(name==tname[1])
{
int i=0;
for(i=disknum;i<2*disknum;i++)
{
if(point[i].ifdisk()==true)
{
position=i;
break;
}
}
if(i==2*disknum)
{
position=2*disknum-1;
}
}
if(name==tname[2])
{
int i=0;
for(i=2*disknum;i<3*disknum;i++)
{
if(point[i].ifdisk()==true)
{
position=i;
break;
}
}
if(i==3*disknum)
{
position=3*disknum-1;
}
}
return position;
}
public void pause()
{
try{
Thread.sleep(800);
}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.blue);
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 + -