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

📄 hannoitower.java

📁 汉诺塔得演示程序.该程序是数据结构中得汉诺塔得演示程序.可以用来进行汉诺塔得教学演示
💻 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 desk[];

	int startX, startY;

	int startI;

	int deskNumber = 0;

	int width, height;

	char towerName[] = { 'A', 'B', 'C' };

	TextArea infoBar = null;

	public HannoiTower(int number, int w, int h, char[] name, TextArea text) {
		towerName = name;
		deskNumber = number;
		width = w;
		height = h;
		infoBar = text;
		setLayout(null);
		addMouseListener(this);
		addMouseMotionListener(this);
		desk = new Disk[deskNumber];
		point = new TowerPoint[3 * deskNumber];
		int space = 20;
		for (int i = 0; i < deskNumber; i++) {
			point[i] = new TowerPoint(40 + width, 100 + space, false);
			space = space + height;
		}
		space = 20;
		for (int i = deskNumber; i < 2 * deskNumber; i++) {
			point[i] = new TowerPoint(160 + width, 100 + space, false);
			space = space + height;
		}
		space = 20;
		for (int i = 2 * deskNumber; i < 3 * deskNumber; 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 = deskNumber - 1; i >= 0; i--) {
			desk[i] = new Disk(i, this);
			desk[i].setSize(tempWidth, height);
			tempWidth = tempWidth - sub;
		}
		for (int i = 0; i < deskNumber; i++) {
			point[i].placeDisk(desk[i], this);
			if (i >= 1)
				desk[i].setHasDesk(true);
		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawLine(point[0].getX(), point[0].getY(), point[deskNumber - 1]
				.getX(), point[deskNumber - 1].getY());
		g.drawLine(point[deskNumber].getX(), point[deskNumber].getY(),
				point[2 * deskNumber - 1].getX(), point[2 * deskNumber - 1]
						.getY());
		g.drawLine(point[2 * deskNumber].getX(), point[2 * deskNumber].getY(),
				point[3 * deskNumber - 1].getX(), point[3 * deskNumber - 1]
						.getY());
		g.drawLine(point[deskNumber - 1].getX() - width, point[deskNumber - 1]
				.getY(), point[3 * deskNumber - 1].getX() + width,
				point[3 * deskNumber - 1].getY());
		int leftx = point[deskNumber - 1].getX() - width;
		int lefty = point[deskNumber - 1].getY();
		int w = (point[3 * deskNumber - 1].getX() + width)
				- (point[deskNumber - 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 * deskNumber; i++) {
			g.fillOval(point[i].getX() - size / 2, point[i].getY() - size / 2,
					size, size);
		}
		g.drawString("" + towerName[0] + "塔", point[deskNumber - 1].getX(),
				point[deskNumber - 1].getY() + 30);
		g.drawString("" + towerName[1] + "塔", point[2 * deskNumber - 1].getX(),
				point[deskNumber - 1].getY() + 30);
		g.drawString("" + towerName[2] + "塔", point[3 * deskNumber - 1].getX(),
				point[deskNumber - 1].getY() + 30);

		g.drawString("将全部盘子从" + towerName[0] + "塔搬运到" + towerName[1] + "塔或"
				+ towerName[2] + "塔", point[deskNumber - 1].getX(),
				point[deskNumber - 1].getY() + 80);
	}

	public void mousePressed(MouseEvent e) {
		Disk disk = null;
		Rectangle rect = null;
		if (e.getSource() == this)
			move = false;
		if (move == false)
			if (e.getSource() instanceof Disk) {
				disk = (Disk) e.getSource();
				startX = disk.getBounds().x;
				startY = disk.getBounds().y;

				rect = disk.getBounds();
				for (int i = 0; i < 3 * deskNumber; 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.getHasDesk() == 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 * deskNumber; 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].hasDisk() == true) {
					disk.setLocation(startX, startY);
				} else {

					if (endI == deskNumber - 1 || endI == 2 * deskNumber - 1
							|| endI == 3 * deskNumber - 1) {
						point[endI].placeDisk(disk, this);

						if (startI != deskNumber - 1
								&& startI != 2 * deskNumber - 1
								&& startI != 3 * deskNumber - 1) {
							(point[startI + 1].getDisk()).setHasDesk(false);
							point[startI].setHasDisk(false);
						} else {
							point[startI].setHasDisk(false);
						}
					} else {
						if (point[endI + 1].hasDisk() == true) {
							Disk tempDisk = point[endI + 1].getDisk();
							if ((tempDisk.getNumber() - disk.getNumber()) >= 1) {
								point[endI].placeDisk(disk, this);
								if (startI != deskNumber - 1
										&& startI != 2 * deskNumber - 1
										&& startI != 3 * deskNumber - 1) {
									(point[startI + 1].getDisk())
											.setHasDesk(false);
									point[startI].setHasDisk(false);
									tempDisk.setHasDesk(true);
								} else {
									point[startI].setHasDisk(false);
									tempDisk.setHasDesk(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 autoRunDisk(int diskNumber, char one, char two, char three) {
		if (diskNumber == 1) {
			infoBar.append("" + one + " 到: " + three + "塔\n");
			Disk disk = getTopDisk(one);
			int startI = getTopDiskPlace(one);
			int endI = getTopPlaceFromTopDisk(three);
			if (disk != null) {
				point[endI].placeDisk(disk, this);
				point[startI].setHasDisk(false);
				try {
					Thread.sleep(1000);
				} catch (Exception ee) {
				}
			}
		} else {
			autoRunDisk(diskNumber - 1, one, three, two);
			infoBar.append("" + one + " 到: " + three + "塔\n");
			Disk disk = getTopDisk(one);
			int startI = getTopDiskPlace(one);// 在塔中获取最上面盘子的位置
			int endI = getTopPlaceFromTopDisk(three);// 在塔中获取最上面盘子的上方位置
			if (disk != null) {
				point[endI].placeDisk(disk, this);
				point[startI].setHasDisk(false);
				try {
					Thread.sleep(1000);
				} catch (Exception ee) {
				}
			}
			autoRunDisk(diskNumber - 1, two, one, three);
		}
	}

	public Disk getTopDisk(char name) {
		Disk disk = null;
		if (name == towerName[0]) {
			for (int i = 0; i < deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					disk = point[i].getDisk();
					break;
				}
			}
		}
		if (name == towerName[1]) {
			for (int i = deskNumber; i < 2 * deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					disk = point[i].getDisk();
					break;
				}
			}
		}
		if (name == towerName[2]) {
			for (int i = 2 * deskNumber; i < 3 * deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					disk = point[i].getDisk();
					break;
				}
			}
		}
		return disk;
	}

	public int getTopPlaceFromTopDisk(char name) {
		int position = 0;
		if (name == towerName[0]) {
			int i = 0;
			for (i = 0; i < deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					position = Math.max(i - 1, 0);
					break;
				}
			}
			if (i == deskNumber) {
				position = deskNumber - 1;
			}
		}
		if (name == towerName[1]) {
			int i = 0;
			for (i = deskNumber; i < 2 * deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					position = Math.max(i - 1, 0);
					break;
				}
			}
			if (i == 2 * deskNumber) {
				position = 2 * deskNumber - 1;
			}
		}
		if (name == towerName[2]) {
			int i = 0;
			for (i = 2 * deskNumber; i < 3 * deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					position = Math.max(i - 1, 0);
					break;
				}
			}
			if (i == 3 * deskNumber) {
				position = 3 * deskNumber - 1;
			}
		}
		return position;
	}

	public int getTopDiskPlace(char name) {
		int position = 0;
		if (name == towerName[0]) {
			int i = 0;
			for (i = 0; i < deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					position = i;
					break;
				}
			}
			if (i == deskNumber) {
				position = deskNumber - 1;
			}
		}
		if (name == towerName[1]) {
			int i = 0;
			for (i = deskNumber; i < 2 * deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					position = i;
					break;
				}
			}
			if (i == 2 * deskNumber) {
				position = 2 * deskNumber - 1;
			}
		}
		if (name == towerName[2]) {
			int i = 0;
			for (i = 2 * deskNumber; i < 3 * deskNumber; i++) {
				if (point[i].hasDisk() == true) {
					position = i;
					break;
				}
			}
			if (i == 3 * deskNumber) {
				position = 3 * deskNumber - 1;
			}
		}
		return position;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -