📄 hannoitower.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 + -