设计一个HANOI塔移动演示软件。(盘子数量、移动速度可以设置,要求统计出移动次数和时间)
(要有用户界面,图像)提示:
     HANOI塔 可以用递归解决。

解决方案 »

  1.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;class MainWindow extends Frame
    implements ActionListener
    {
    int Num,Speed,Count,Time; //盘子移动 模拟 标签
    Label labelMove[][]=new Label[4][12];

    int isVisibleA[],isVisibleB[],isVisibleC[];

    int row_a,row_b,length;


    //菜单
    MenuBar menubar;
    Menu menu;
    MenuItem menuitem;

    //控制区pControl 内 标签、文本域
    Label labelNum,labelSpeed,labelCount,labelTime;
    TextField textNum,textSpeed,textCount,textTime;
    Button buttonEnter;

    //显示区pDisplay 内 标签##################################################################
    //Label labelA,labelB,labelC;
    // 显示区  和  控制区
    Panel pDisplay;
    Panel pControl;

    MainWindow()
    {
    FlowLayout flow=new FlowLayout();

    //菜单
    menubar=new MenuBar();
    menu=new Menu("文件");
    menuitem=new MenuItem("退出");
    menuitem.setShortcut(new MenuShortcut(KeyEvent.VK_E));
    menu.add(menuitem);
    menubar.add(menu);
    setMenuBar(menubar);
    menuitem.addActionListener(this);


    //控制区pControl 内 标签、文本域
    labelNum=new Label("盘子数量:");
    textNum=new TextField(5);
    labelSpeed=new Label("移动速度:");
    textSpeed=new TextField(5);
            labelCount=new Label("移动次数:");
            textCount=new TextField(5);
            labelTime=new Label("移动时间:");
    textTime=new TextField(5);
    buttonEnter=new Button("确定");

    buttonEnter.addActionListener(this);

    // 控制区
    pControl=new Panel();
    pControl.setBackground(Color.cyan);
    pControl.add(labelNum);
    pControl.add(textNum);
    pControl.add(labelSpeed);
    pControl.add(textSpeed);
    pControl.add(labelCount);
    pControl.add(textCount);
    pControl.add(labelTime);
    pControl.add(textTime);
    pControl.add(buttonEnter);

    add(pControl,BorderLayout.NORTH);


    //显示区pDisplay 内 标签
    // labelA=new Label("A",Label.CENTER);
    // labelB=new Label("B",Label.CENTER);
    // labelC=new Label("C",Label.CENTER);
    // labelA.setBackground(Color.red);
    // labelB.setBackground(Color.yellow);
    // labelC.setBackground(Color.blue);

    // labelA.setPreferredSize(new Dimension(200,20));
    // labelB.setPreferredSize(new Dimension(200,20));
    // labelC.setPreferredSize(new Dimension(200,20));

    // 显示区
    pDisplay=new Panel();
    pDisplay.setBounds(0, 0, 800, 500);
    pDisplay.setBackground(Color.gray);
    // pDisplay.add(labelA);
    // pDisplay.add(labelB);
    // pDisplay.add(labelC);



    add(pDisplay,BorderLayout.CENTER);


    setBounds(100,100,800,600);
    setVisible(true);
    validate();
    }

    void moveDisplay(int a,int b)
    {
    //System.out.println(a+"----->"+b+"\n");
    switch(a)
    {
    case 1:
    for(int i=0;i<4;i++)
    {
    if(isVisibleA[i]>0)
    {
    row_a=i;
    length=isVisibleA[row_a];
    break;
    }
    }
    for(int i=0;i<length;i++)
    {
    labelMove[row_a][i].setVisible(false);
    }
    isVisibleA[row_a]=0;
    break;
    case 2:
    for(int i=0;i<4;i++)
    {
    if(isVisibleB[i]>0)
    {
    row_a=i;
    length=isVisibleB[row_a];
    break;
    }
    }
    for(int i=0;i<length;i++)
    {
    labelMove[row_a][4+i].setVisible(false);
    }
    isVisibleB[row_a]=0;
    break;
    case 3:
    for(int i=0;i<4;i++)
    {
    if(isVisibleC[i]>0)
    {
    row_a=i;
    length=isVisibleC[row_a];
    break;
    }
    }
    for(int i=0;i<length;i++)
    {
    labelMove[row_a][8+i].setVisible(false);
    }
    isVisibleC[row_a]=0;
    break;

    }

    switch(b)
    {
    case 2:
    for(int i=0;i<4;i++)
    {
    if(isVisibleB[i]>0)
    {
    row_b=i;
    break;
    }
    }
    row_b=row_b-1;
    for(int i=0;i<length;i++)
    {
    labelMove[row_b][4+i].setVisible(true);
    }
    isVisibleA[row_b]=length;
    break;
    case 1:
    for(int i=0;i<4;i++)
    {
    if(isVisibleA[i]>0)
    {
    row_b=i;
    break;
    }
    }
    row_b=row_b-1;
    for(int i=0;i<length;i++)
    {
    labelMove[row_b][i].setVisible(true);
    }
    isVisibleA[row_b]=length;
    break;
    case 3:
    for(int i=0;i<4;i++)
    {
    if(isVisibleB[i]>0)
    {
    row_b=i;
    break;
    }
    }
    row_b=row_b-1;
    for(int i=0;i<length;i++)
    {
    labelMove[row_b][8+i].setVisible(true);
    }
    isVisibleA[row_b]=length;
    break;
    }
    }
    void hanoi(int n,int a,int b,int c)
    {
    if(n==1)
    {
    moveDisplay(a,c);
    }
    else
    {
    hanoi(n-1,a,c,b);
    moveDisplay(a,c);
    hanoi(n-1,b,a,c);
    }
    }
    public void actionPerformed(ActionEvent e)
    {
    if(e.getSource()==menuitem)  //菜单 退出
    {
    System.exit(0);
    }
    else if(e.getSource()==buttonEnter)  //确定 演示
    {
        Num=Integer.parseInt(textNum.getText());
        //Speed=Integer.parseInt(textSpeed.getText());
        
        //labelMove=new Label[4][12];
        for(int i=0;i<4;i++)
        {
         for(int j=0;j<12;j++)
         {
         pDisplay.add(labelMove[i][j]);
         labelMove[i][j].setBackground(Color.black);
         labelMove[i][j].setVisible(false);
         }
        }
        for(int i=0;i<=Num-1;i++)
        {
         for(int j=0;j<=Num-1;j++)
         {
         if(i>=j)
         {
         //labelMove[i][j].setVisible(true);
         }
         }
        }
        
        
        isVisibleA=new int[4];
        isVisibleB=new int[4];
        isVisibleC=new int[4];
        for(int i=0;i<=3;i++)
        {
         if(i<Num)
         {
         isVisibleA[i]=i+1;
         }
         else
         {
         isVisibleA[i]=0;
         }
         isVisibleB[i]=0;
         isVisibleC[i]=0;
        }
        
        
        hanoi(Num,1,2,3);
        
        
    }

    }
    }public class Main 
    {
    public static void main(String args[])
    {
    MainWindow win=new MainWindow();
    }}但是有错误 给看看什么地方错了
      

  2.   

    看我的吧:
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Stack;import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;public class HanoiPane extends JComponent implements Runnable{
    private static final long serialVersionUID=-5007996832452230212L; private final Stack<Integer> src=new Stack<Integer>();
    private final Stack<Integer> mid=new Stack<Integer>();
    private final Stack<Integer> tag=new Stack<Integer>(); public static void main(String[] args){
    JFrame f=new JFrame("汉诺塔演示");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(500,400);
    JPanel top=new JPanel(new GridLayout(1,0));
    top.add(new JLabel("盘子数:"));
    final JTextField tf=new JTextField();
    tf.setText("10");
    top.add(tf);
    top.add(new JLabel("间隔毫秒:"));
    final JTextField tt=new JTextField();
    tt.setText("20");
    top.add(tt);
    top.add(new JLabel("移动次数:"));
    final JTextField tc=new JTextField();
    tc.setEditable(false);
    top.add(tc);
    JButton b=new JButton("开始");
    final HanoiPane c=new HanoiPane();
    b.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
    try{
    c.start(Integer.parseInt(tf.getText()),Integer.parseInt(tt.getText()),tc);
    }
    catch(Exception ex){
    ex.printStackTrace();
    }
    }
    });
    top.add(b); f.add(top,BorderLayout.NORTH);
    f.add(c);
    f.setVisible(true); } private int moveCount; void move(Stack<Integer> src,Stack<Integer> tag){
    try{
    Thread.sleep(sleep);
    }
    catch(InterruptedException e){
    }
    tag.push(src.pop());
    moveCount++;
    if(timesComp != null){
    timesComp.setText("" + moveCount);
    }
    repaint();
    } public void move(int count,Stack<Integer> src,Stack<Integer> tag,Stack<Integer> mid){
    if(count == 1){
    move(src,tag);
    }
    else{
    move(count - 1,src,mid,tag);
    move(src,tag);
    move(count - 1,mid,tag,src);
    }
    } public void paintComponent(Graphics g){
    super.paintComponent(g);
    if(count <= 0){
    return;
    }
    int w=getWidth();
    int h=getHeight();
    int maxW=w / 3;
    int maxH=h / count;
    paintTower(g,src,w * 1 / 6,h,maxW,maxH);
    paintTower(g,mid,w * 3 / 6,h,maxW,maxH);
    paintTower(g,tag,w * 5 / 6,h,maxW,maxH);
    } private void paintTower(Graphics g,Stack<Integer> data,int x,int y,int maxW,int maxH){
    int len=data.size(); for(int i=0;i < len;i++){
    Integer n=data.get(i);
    int w=maxW - ((maxW / 2) * n / count);
    g.setColor(Color.BLUE);
    g.drawRect(x - w / 2,y - maxH,w,maxH);
    y-=maxH;
    }
    } private int count;
    private int sleep;
    private JTextField timesComp; /**
     * @param n 数目
     * @param sleep 间隔时间
     */
    public void start(int n,int sleep,JTextField timesComp){
    if(inWork){
    return;
    }
    this.count=n;
    this.sleep=sleep;
    this.timesComp=timesComp;
    this.moveCount=0;
    src.clear();
    mid.clear();
    tag.clear();
    for(int i=0;i < count;i++){
    src.push(i);
    }
    new Thread(this).start();
    } boolean inWork;
    public void run(){
    inWork=true;
    try{
    move(count,src,tag,mid);
    }
    finally{
    inWork=false;
    }
    }
    }