📄 hannoitower.java
字号:
package chapter1;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.TextArea;
import javax.swing.JPanel;
public class HannoiTower extends JPanel
{
TowerPoint[] point ;
Disk[] disk;
int startX,startY;// the initial coordinate of the disk
int startI;// the initial tower of the disk
int numberOfDisk;
int width,heigth;// the size of the largest disk i
char[] towerName = {'A','B','C'};
TextArea info = null;
public HannoiTower(int number,int w,int h,TextArea area)
{
numberOfDisk = number;
width = w;
heigth = h;
info = area;
setLayout(null);
disk =new Disk[numberOfDisk];
point = new TowerPoint[numberOfDisk *3];// there are three towers so the number of points is numberOfDisk *3
int space = 20;
for (int i = 0;i<numberOfDisk;i++)// set the coordinate of the points in tower A
{
point[i] = new TowerPoint(40 + width,100+space,false);
space +=heigth;
}
space = 20;
for (int i = numberOfDisk;i<2*numberOfDisk;i++)// set the coordinate of the points in tower B
{
point[i] = new TowerPoint(160+ width,100+space,false);
space +=heigth;
}
space = 20;
for (int i = 2*numberOfDisk;i<3*numberOfDisk;i++)// set the coordinate of the points in tower C
{
point[i] = new TowerPoint(280+ width,100+space,false);
space +=heigth;
}
int tempWidth = width;
int sub = (int)(tempWidth*0.2);//shink the disk by 20 percent as the disk goes higher
for(int i = numberOfDisk-1;i>=0;i--)
{
disk[i] = new Disk(i);
disk[i].setSize(tempWidth,heigth);
tempWidth-=sub;
}
point[0].setDisk(disk[0],this);
for(int i = 1;i<numberOfDisk;i++)//set the disk into tower A
{
point[i].setDisk(disk[i],this);
point[i].setIsDisk(true);
}
}
public void paintComponent(Graphics g)//connect the tower points
{
super.paintComponent(g);
g.drawLine(point[0].getX(),point[0].getY(),point[numberOfDisk-1].getX(),point[numberOfDisk-1].getY());
//paint tower A
g.drawLine(point[numberOfDisk].getX(),point[numberOfDisk].getY()
,point[numberOfDisk*2-1].getX(),point[numberOfDisk*2-1].getY());
//paint tower B
g.drawLine(point[numberOfDisk*2].getX(),point[numberOfDisk*2].getY()
,point[numberOfDisk*3-1].getX(),point[numberOfDisk*3-1].getY());
//paint tower C
g.drawLine(point[numberOfDisk-1].getX(),point[numberOfDisk-1].getY()
,point[numberOfDisk*3-1].getX(),point[numberOfDisk*3-1].getY());
//paint the horizonal line frome tower A to C
int leftx = point[numberOfDisk-1].getX()-width;
int lefty = point[numberOfDisk-1].getY();
int w = (point[numberOfDisk*3-1].getX() + width )-(point[numberOfDisk-1].getX()-width);// the line's length
int h = heigth /2;
g.setColor(Color.lightGray);// the color of the horizonal line frome tower A to C
g.fillRect(leftx,lefty,w,h);
g.setColor(Color.GREEN);// the color of each point
int size = 4;//the size of the point
for(int i=0;i<numberOfDisk*3;i++)//draw the points in each tower
g.fillOval(point[i].getX()-size/2,point[i].getY()-size/2,size,size);
g.drawString(" "+towerName[0]+" Tower",point[numberOfDisk-1].getX(),point[numberOfDisk-1].getY()+30);
g.drawString(" "+towerName[1]+" Tower",point[numberOfDisk*2-1].getX(),point[numberOfDisk-1].getY()+30);
g.drawString(" "+towerName[2]+" Tower",point[numberOfDisk*3-1].getX(),point[numberOfDisk-1].getY()+30);
}
public void autoShow(int numberOfDisk,char from,char auxliary,char to)
{
if(numberOfDisk==1)
{// base case
info.append("D"+numberOfDisk+" "+from +" to "+to+"\n");
Disk topdisk = getTopDisk(from);
int startI = getTopDiskLocation(from);
int endI = getAboveTopDiskLocation(to);//get the destination
if(topdisk !=null)
{
point[endI].setDisk(topdisk,this);
point[startI].setIsDisk(false);
try{
Thread.sleep(1000);
}catch(Exception e){}
}
}
else
{
//using recusive
autoShow(numberOfDisk-1,from,to,auxliary);
info.append("D"+numberOfDisk+" "+from +" to "+to+"\n");
Disk topdisk = getTopDisk(from);
int startI = getTopDiskLocation(from);
int endI = getAboveTopDiskLocation(to);//get the destination
if(topdisk !=null)
{
point[endI].setDisk(topdisk,this);
point[startI].setIsDisk(false);
try{
Thread.sleep(1000);
}catch(Exception e){}
}
autoShow(numberOfDisk-1,auxliary,from,to);
}
}
public Disk getTopDisk(char tower)
{
Disk disk = null;
if(tower == towerName[0])
{
for(int i=0;i<numberOfDisk;i++)
{
if(point[i].aDisk)//if it is a disk
{
disk = point[i].getDisk();
break;
}
}
}
if(tower == towerName[1])
{
for(int i=numberOfDisk;i<numberOfDisk*2;i++)
{
if(point[i].aDisk)//if it is a disk
{
disk = point[i].getDisk();
break;
}
}
}
if(tower == towerName[2])
{
for(int i=numberOfDisk*2;i<numberOfDisk*3;i++)
{
if(point[i].aDisk)//if it is a disk
{
disk = point[i].getDisk();
break;
}
}
}
return disk;
}
public int getAboveTopDiskLocation(char tower)
{
int position= 0;
if(tower == towerName[0])
{ int i =0;
for( i=0;i<numberOfDisk;i++)
{
if(point[i].aDisk)//if it is a disk
{
position = Math.max(i-1,0);
break;
}
}
if(i==numberOfDisk)
position = numberOfDisk -1;
}
if(tower == towerName[1])
{ int i =0;
for(i=numberOfDisk;i<numberOfDisk*2;i++)
{
if(point[i].aDisk)//if it is a disk
{
position = Math.max(i-1,0);
break;
}
}
if(i==numberOfDisk*2)
position = numberOfDisk*2 -1;
}
if(tower == towerName[2])
{ int i =0;
for(i=numberOfDisk*2;i<numberOfDisk*3;i++)
{
if(point[i].aDisk)//if it is a disk
{
position = Math.max(i-1,0);
break;
}
}
if(i==numberOfDisk*3)
position = numberOfDisk*3 -1;
}
return position;
}
public int getTopDiskLocation(char tower)
{
int position =0;
if(tower == towerName[0])
{ int i =0;
for( i=0;i<numberOfDisk;i++)
{
if(point[i].aDisk)//if it is a disk
{
position =i;
break;
}
}
if(i==numberOfDisk)
position = numberOfDisk -1;
}
if(tower == towerName[1])
{ int i =0;
for( i=numberOfDisk;i<numberOfDisk*2;i++)
{
if(point[i].aDisk)//if it is a disk
{
position =i;
break;
}
}
if(i==numberOfDisk*2)
position = numberOfDisk*2 -1;
}
if(tower == towerName[2])
{ int i =0;
for( i=numberOfDisk*2;i<numberOfDisk*3;i++)
{
if(point[i].aDisk)//if it is a disk
{
position =i;
break;
}
}
if(i==numberOfDisk*3)
position = numberOfDisk*3-1;
}
return position;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -