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

📄 tower.java

📁 上载文件中包括我的论文和其他几个JSP源码,还有我的计算方法程序C语言的,请站长帮我开通帐户,万分感谢!!我回继续上载源码
💻 JAVA
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class Disk extends Button {
	/**
	 * 
	 */
	private static final long serialVersionUID = -6174681128406353175L;

	int number;

	boolean 上方有盘 = false;

	public Disk(int number, HannoiTower con) {
		this.number = number;
		setBackground(Color.blue);
		addMouseMotionListener(con);
		addMouseListener(con);
	}

	public boolean get上方有盘() {
		return 上方有盘;
	}

	public void set上方有盘(boolean b) {
		上方有盘 = b;
	}

	public int getNumber() {
		return number;
	}
}

class TowerPoint {
	int x, y;

	boolean 有盘子;

	Disk 盘子 = null;

	HannoiTower con = null;

	public TowerPoint(int x, int y, boolean boo) {
		this.x = x;
		this.y = y;
		有盘子 = boo;
	}

	public boolean 是否有盘子() {
		return 有盘子;
	}

	public void set有盘子(boolean boo) {
		有盘子 = boo;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	public void 放置盘子(Disk 盘子, HannoiTower con) {
		this.con = con;
		con.setLayout(null);
		this.盘子 = 盘子;
		con.add(盘子);
		int w = 盘子.getBounds().width;
		int h = 盘子.getBounds().height;
		盘子.setBounds(x - w / 2, y - h / 2, w, h);
		有盘子 = true;
		con.validate();
	}

	public Disk 获取盘子() {
		return 盘子;
	}
}

class HannoiTower extends JPanel implements MouseListener, MouseMotionListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = -901376788112177578L;

	TowerPoint point[];

	int x, y;

	boolean move = false;

	Disk 盘子[];

	int startX, startY;

	int startI;

	int 盘子数目 = 0;

	int width, height;

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

	TextArea 信息条 = null;

	public HannoiTower(int number, int w, int h, char[] name, TextArea text) {
		towerName = name;
		盘子数目 = number;
		width = w;
		height = h;
		信息条 = text;
		setLayout(null);
		addMouseListener(this);
		addMouseMotionListener(this);
		盘子 = new Disk[盘子数目];
		point = new TowerPoint[3 * 盘子数目];
		int space = 70;
		for (int i = 0; i < 盘子数目; i++) {
			point[i] = new TowerPoint(20 + width, 100 + space, false);
			space = space + height;
		}
		space = 70;
		for (int i = 盘子数目; i < 2 * 盘子数目; i++) {
			point[i] = new TowerPoint(170 + width, 100 + space, false);
			space = space + height;
		}
		space = 70;
		for (int i = 2 * 盘子数目; i < 3 * 盘子数目; i++) {
			point[i] = new TowerPoint(320 + width, 100 + space, false);
			space = space + height;
		}
		int tempWidth = width;
		int sub = (int) (tempWidth * 0.1);
		for (int i = 盘子数目 - 1; i >= 0; i--) {
			盘子[i] = new Disk(i, this);
			盘子[i].setSize(tempWidth, height);
			tempWidth = tempWidth - sub;
		}
		for (int i = 0; i < 盘子数目; i++) {
			point[i].放置盘子(盘子[i], this);
			if (i >= 1)
				盘子[i].set上方有盘(true);
		}
	}

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

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

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

				rect = 盘子.getBounds();
				for (int i = 0; i < 3 * 盘子数目; 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.get上方有盘() == 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 * 盘子数目; 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].是否有盘子() == true) {
					disk.setLocation(startX, startY);
				} else {

					if (endI == 盘子数目 - 1 || endI == 2 * 盘子数目 - 1
							|| endI == 3 * 盘子数目 - 1) {
						point[endI].放置盘子(disk, this);

						if (startI != 盘子数目 - 1 && startI != 2 * 盘子数目 - 1
								&& startI != 3 * 盘子数目 - 1) {
							(point[startI + 1].获取盘子()).set上方有盘(false);
							point[startI].set有盘子(false);
						} else {
							point[startI].set有盘子(false);
						}
					} else {
						if (point[endI + 1].是否有盘子() == true) {
							Disk tempDisk = point[endI + 1].获取盘子();
							if ((tempDisk.getNumber() - disk.getNumber()) >= 1) {
								point[endI].放置盘子(disk, this);
								if (startI != 盘子数目 - 1
										&& startI != 2 * 盘子数目 - 1
										&& startI != 3 * 盘子数目 - 1) {
									(point[startI + 1].获取盘子()).set上方有盘(false);
									point[startI].set有盘子(false);
									tempDisk.set上方有盘(true);
								} else {
									point[startI].set有盘子(false);
									tempDisk.set上方有盘(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 自动演示搬运盘子(int 盘子数, char one, char two, char three) {
		if (盘子数 == 1) {
			信息条.append("从" + one + " 到: " + three + "塔\n");
			Disk disk = 在塔中获取最上面的盘子(one);
			int startI = 在塔中获取最上面盘子的位置(one);
			int endI = 在塔中获取最上面盘子的上方位置(three);
			if (disk != null) {
				point[endI].放置盘子(disk, this);
				point[startI].set有盘子(false);
				try {
					Thread.sleep(400);
				} catch (Exception ee) {
				}
			}
		} else {
			自动演示搬运盘子(盘子数 - 1, one, three, two);
			信息条.append("从" + one + " 到: " + three + "塔\n");
			Disk disk = 在塔中获取最上面的盘子(one);
			int startI = 在塔中获取最上面盘子的位置(one);
			int endI = 在塔中获取最上面盘子的上方位置(three);
			if (disk != null) {
				point[endI].放置盘子(disk, this);
				point[startI].set有盘子(false);
				try {
					Thread.sleep(400);
				} catch (Exception ee) {
				}
			}
			自动演示搬运盘子(盘子数 - 1, two, one, three);
		}
	}

	public Disk 在塔中获取最上面的盘子(char 塔名) {
		Disk disk = null;
		if (塔名 == towerName[0]) {
			for (int i = 0; i < 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					disk = point[i].获取盘子();
					break;
				}
			}
		}
		if (塔名 == towerName[1]) {
			for (int i = 盘子数目; i < 2 * 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					disk = point[i].获取盘子();
					break;
				}
			}
		}
		if (塔名 == towerName[2]) {
			for (int i = 2 * 盘子数目; i < 3 * 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					disk = point[i].获取盘子();
					break;
				}
			}
		}
		return disk;
	}

	public int 在塔中获取最上面盘子的上方位置(char 塔名) {
		int position = 0;
		if (塔名 == towerName[0]) {
			int i = 0;
			for (i = 0; i < 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					position = Math.max(i - 1, 0);
					break;
				}
			}
			if (i == 盘子数目) {
				position = 盘子数目 - 1;
			}
		}
		if (塔名 == towerName[1]) {
			int i = 0;
			for (i = 盘子数目; i < 2 * 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					position = Math.max(i - 1, 0);
					break;
				}
			}
			if (i == 2 * 盘子数目) {
				position = 2 * 盘子数目 - 1;
			}
		}
		if (塔名 == towerName[2]) {
			int i = 0;
			for (i = 2 * 盘子数目; i < 3 * 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					position = Math.max(i - 1, 0);
					break;
				}
			}
			if (i == 3 * 盘子数目) {
				position = 3 * 盘子数目 - 1;
			}
		}
		return position;
	}

	public int 在塔中获取最上面盘子的位置(char 塔名) {
		int position = 0;
		if (塔名 == towerName[0]) {
			int i = 0;
			for (i = 0; i < 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					position = i;
					break;
				}
			}
			if (i == 盘子数目) {
				position = 盘子数目 - 1;
			}
		}
		if (塔名 == towerName[1]) {
			int i = 0;
			for (i = 盘子数目; i < 2 * 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					position = i;
					break;
				}
			}
			if (i == 2 * 盘子数目) {
				position = 2 * 盘子数目 - 1;
			}
		}
		if (塔名 == towerName[2]) {
			int i = 0;
			for (i = 2 * 盘子数目; i < 3 * 盘子数目; i++) {
				if (point[i].是否有盘子() == true) {
					position = i;
					break;
				}
			}
			if (i == 3 * 盘子数目) {
				position = 3 * 盘子数目 - 1;
			}
		}
		return position;
	}
}

public class Tower extends Frame implements ActionListener, Runnable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 393700440148005563L;

	HannoiTower tower = null;

	Button renew, auto = null;

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

	int 盘子数目, 盘宽, 盘高;

	Thread thread;

	TextArea 信息条 = null;

	public Tower() {
		setTitle("汉诺塔游戏-作者:康多全");
		thread = new Thread(this);
		盘子数目 = 4;
		盘宽 = 120;
		盘高 = 25;
		信息条 = new TextArea(12, 12);
		信息条.setText(null);
		tower = new HannoiTower(盘子数目, 盘宽, 盘高, towerName, 信息条);
		renew = new Button("重新开始");
		auto = new Button("自动演示搬盘子");
		renew.addActionListener(this);
		auto.addActionListener(this);
		add(tower, BorderLayout.CENTER);
		add(renew, BorderLayout.SOUTH);
		add(auto, BorderLayout.NORTH);
		add(信息条, BorderLayout.EAST);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		setVisible(true);
		setBounds(60, 20, 700, 640);
		validate();
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == renew) {
			if (!(thread.isAlive())) {
				this.remove(tower);
				信息条.setText(null);
				tower = new HannoiTower(盘子数目, 盘宽, 盘高, towerName, 信息条);
				add(tower, BorderLayout.CENTER);
				validate();
			} else {
			}
		}
		if (e.getSource() == auto) {
			if (!(thread.isAlive())) {
				thread = new Thread(this);
			}
			try {

				thread.start();
			} catch (Exception eee) {
			}

		}
	}

	public void run() {
		this.remove(tower);
		信息条.setText(null);
		tower = new HannoiTower(盘子数目, 盘宽, 盘高, towerName, 信息条);
		add(tower, BorderLayout.CENTER);
		validate();
		tower.自动演示搬运盘子(盘子数目, towerName[0], towerName[1], towerName[2]);
	}

	public static void main(String args[]) {
		new Tower();
	}
}

⌨️ 快捷键说明

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