⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hannoitower.java

📁 JAVA写的图形化汉诺塔程序 swing实现
💻 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 + -