一个汉诺塔自动演示的问题~

BlueDe 2010-05-21 01:27:05
想实现一个3阶汉诺塔的自动演示,主要是想看到每次移动的过程,但是用Timer或者Thread.sleep都弄不好```
求大侠帮忙看看应该怎么弄~

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class HanoiDemo extends JFrame {
private panel p = new panel();

public HanoiDemo() {
add(p);
}

public void doDemo() {
p.moveDisks(3, 'A', 'B', 'C');
}

private class panel extends JPanel {
private int xA;
private int xB;
private int xC;

private int numbersOfA = 3; //柱子盘子的数目
private int numbersOfB = 0;
private int numbersOfC = 0;

private int[] disksOfA = new int[]{3, 2, 1}; //柱子上放盘子情况
private int[] disksOfB = new int[]{0, 0, 0};
private int[] disksOfC = new int[]{0, 0, 0};



private Timer timer = new Timer(100, new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
repaint();
}
});

public void paintComponent(Graphics g) {
super.paintComponent(g);

xA = getWidth() / 4;
xB = getWidth() / 2;
xC = getWidth() / 4 * 3;
g.drawRect(xA - 10, getHeight() / 4, 20, getHeight() / 4 * 3);
g.drawRect(xB - 10, getHeight() / 4, 20, getHeight() / 4 * 3);
g.drawRect(xC - 10, getHeight() / 4, 20, getHeight() / 4 * 3);


if (numbersOfA != 0) {
for (int i = 0; i < 3; i++) {
if (disksOfA[i] != 0)
g.fillRect(xA - 10 - disksOfA[i] * 10, getHeight() - 20 - i * 20, 20 + disksOfA[i] * 20, 20);
}
}

if (numbersOfB != 0) {
for (int i = 0; i < 3; i++) {
if (disksOfB[i] != 0)
g.fillRect(xB - 10 - disksOfB[i] * 10, getHeight() - 20 - i * 20, 20 + disksOfB[i] * 20, 20);
}
}

if (numbersOfC != 0) {
for (int i = 0; i < 3; i++) {
if (disksOfC[i] != 0)
g.fillRect(xC - 10 - disksOfC[i] * 10, getHeight() - 20 - i * 20, 20 + disksOfC[i] * 20, 20);
}
}

}

public void moveDisks(int n, char fromTower, char toTower, char auxTower) {
try {
Thread.sleep(500);
repaint();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //本来想用sleep来看每次移动的过程,但动作一卡一卡的
if (n == 1){ // Stopping condition
System.out.println("Move disk " + n + " from " +
fromTower + " to " + toTower);
if (fromTower == 'A') {
if (toTower == 'B') {
move(disksOfA, disksOfB);
numbersOfA--;
numbersOfB++;
}
else {
move(disksOfA, disksOfC);
numbersOfA--;
numbersOfC++;
}
}
if (fromTower == 'B') {
if (toTower == 'A') {
move(disksOfB, disksOfA);
numbersOfB--;
numbersOfA++;
}
else {
move(disksOfB, disksOfC);
numbersOfB--;
numbersOfC++;
}
}
if (fromTower == 'C') {
if (toTower == 'B') {
move(disksOfC, disksOfB);
numbersOfC--;
numbersOfB++;
}
else {
move(disksOfC, disksOfA);
numbersOfC--;
numbersOfA++;
}
}
}

else {
moveDisks(n - 1, fromTower, auxTower, toTower);
System.out.println("Move disk " + n + " from " +
fromTower + " to " + toTower);
if (fromTower == 'A') {
if (toTower == 'B') {
move(disksOfA, disksOfB);
numbersOfA--;
numbersOfB++;
}
else {
move(disksOfA, disksOfC);
numbersOfA--;
numbersOfC++;
}
}
if (fromTower == 'B') {
if (toTower == 'A') {
move(disksOfB, disksOfA);
numbersOfB--;
numbersOfA++;
}
else {
move(disksOfB, disksOfC);
numbersOfB--;
numbersOfC++;
}
}
if (fromTower == 'C') {
if (toTower == 'B') {
move(disksOfC, disksOfB);
numbersOfC--;
numbersOfB++;
}
else {
move(disksOfC, disksOfA);
numbersOfC--;
numbersOfA++;
}
}
moveDisks(n - 1, auxTower, toTower, fromTower);
}
}

public void move(int[] from, int[] to) {
int i = 2;
while (from[i] == 0) {
i--;
}
int moveDisk = from[i];
from[i] = 0;
i = 0;
while (to[i] != 0) {
i++;
}
to[i] = moveDisk;
}

}


public static void main(String[] args) {
// TODO Auto-generated method stub
HanoiDemo frame = new HanoiDemo();
frame.setTitle("HanoiDemo");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
frame.doDemo();
}

}

...全文
168 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kdois 2010-05-23
  • 打赏
  • 举报
回复
好厉害 .....
ningbupt 2010-05-23
  • 打赏
  • 举报
回复
这个很复杂。理解起来很费劲
  • 打赏
  • 举报
回复
代码有点长,而且运行不出来啊,不好解决,望大虾解决
BlueDe 2010-05-23
  • 打赏
  • 举报
回复
汗````
是不是我的代码写得太乱
大侠不愿意看啊 - -#
BlueDe 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dr_lou 的回复:]

Java code
public static void move(int size,String from,String temp,String to){
if (size == 1) {
System.out.println("把"+size+"#从"+from+"移动到"+to);
}else {
……
[/Quote]

关键是怎么能做到每次移动都显示出移动效果
zhuyouyong 2010-05-22
  • 打赏
  • 举报
回复
顶[Quote=引用 3 楼 dr_lou 的回复:]
Java code
public static void move(int size,String from,String temp,String to){
if (size == 1) {
System.out.println("把"+size+"#从"+from+"移动到"+to);
}else {
……
[/Quote]
dr_lou 2010-05-21
  • 打赏
  • 举报
回复
        public static void move(int size,String from,String temp,String to){
if (size == 1) {
System.out.println("把"+size+"#从"+from+"移动到"+to);
}else {
move(size - 1, from, to, temp); //from-->inner
System.out.println("把"+size+"#从"+from+"移动到"+to);
move(size - 1, temp, from, to); //inner-->to
}
}


递归的汉诺塔,每次move前你绘图即可
lxy15329 2010-05-21
  • 打赏
  • 举报
回复
我也正想用applet做一个动态设计呢,不过现在还没有思路
andy2u 2010-05-21
  • 打赏
  • 举报
回复
不错,我也想知道,在这里先支持下你的帖子了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧