`
guoyiqi
  • 浏览: 1001817 次
社区版块
存档分类
最新评论

java 汉诺塔实现自动演示

 
阅读更多

1、增加计时功能,显示用户完成移动盘子所花费的时间
2、用户可以设置最大和最小盘子的大小
3、用户可以选择播放和暂停背景音乐
4、用户可以设置盘子的数目
5、用户可以设置盘子的颜色以及背景的颜色
6、用户可以将自动移动盘子的文本信息保存到文件
在原有代码上增加,增加的新代码要注释

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class AutoMoveDisc extends JDialog implements ActionListener{
    int amountOfDisc=3;
    TowerPoint [] pointA,pointB,pointC;
    char [] towerName;
    Container con;
    StringBuffer moveStep;
    JTextArea showStep;
    JButton bStart,bStop,bContinue,bClose;
    Timer time;
    int i=0,number=0;
    AutoMoveDisc(Container con){
        setModal(true);
        setTitle("自动演示搬盘子过程");
        this.con=con;
        moveStep=new StringBuffer();
        time=new Timer(1000,this);
        time.setInitialDelay(10);
        showStep=new JTextArea(10,12);
        bStart=new JButton("演示");
        bStop=new JButton("暂停");
        bContinue=new JButton("继续");
        bClose=new JButton("关闭");
        bStart.addActionListener(this);
        bStop.addActionListener(this);
        bContinue.addActionListener(this);
        bClose.addActionListener(this);
        JPanel south=new JPanel();
        south.setLayout(new FlowLayout());
        south.add(bStart);
        south.add(bStop);
        south.add(bContinue);
        south.add(bClose);
        add(new JScrollPane(showStep),BorderLayout.CENTER);
        add(south,BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        towerName=new char[3];
        addWindowListener(new WindowAdapter(){
                           public void windowClosing(WindowEvent e){
                              time.stop();
                              setVisible(false);
                           }
                         });
    }
    public void setPointA(TowerPoint [] pointA){
        this.pointA=pointA;
    }
    public void setPointB(TowerPoint [] pointB){
        this.pointB=pointB;
    }
    public void setPointC(TowerPoint [] pointC){
        this.pointC=pointC;
    }
    public void setTowerName(char name[]){
         if(name[0]==name[1]||name[0]==name[2]||name[1]==name[2]){
           towerName[0]='A';
           towerName[1]='B';
           towerName[2]='C';
         }
         else 
           towerName=name;
    }
    public void setAmountOfDisc(int n){
         amountOfDisc=n;
    }
   public void actionPerformed(ActionEvent e) {
      if(e.getSource()==time){
            number++;
            char cStart,cEnd;
            if(i<=moveStep.length()-2){
              cStart=moveStep.charAt(i);
              cEnd=moveStep.charAt(i+1);
              showStep.append("("+number+")从"+cStart+"座搬一个盘子到"+cEnd+"座\n");
              autoMoveDisc(cStart,cEnd);
            }
            i=i+2;
            if(i>=moveStep.length()-1){
                time.stop();
            } 
      }
      else if(e.getSource()==bStart){
           if(moveStep.length()==0){
             if(time.isRunning()==false){
                 i=0;
                 moveStep=new StringBuffer();
                 setMoveStep(amountOfDisc,towerName[0],towerName[1],towerName[2]);
                 number=0;
                 time.start();   
             }
           }
      }
      else if(e.getSource()==bStop){
           if(time.isRunning()==true)
                time.stop();   
      }
      else if(e.getSource()==bContinue){
           if(time.isRunning()==false)
                time.restart();   
      }
      else if(e.getSource()==bClose){
           time.stop();
           setVisible(false);  
      } 
   }
   private void setMoveStep(int amountOfDisc,char one,char two,char three){
      if(amountOfDisc==1){
             moveStep.append(one);
             moveStep.append(three);  
      }
      else{
             setMoveStep(amountOfDisc-1,one,three,two);
             moveStep.append(one);
             moveStep.append(three);
             setMoveStep(amountOfDisc-1,two,one,three);  
      }
   }
   private void autoMoveDisc(char cStart,char cEnd){
      Disc disc=null;
      if(cStart==towerName[0]){
               for(int i=0;i<pointA.length;i++){
                  if(pointA[i].isHaveDisc()==true){
                      disc=pointA[i].getDiscOnPoint();
                      pointA[i].setHaveDisc(false);     
                      break;
                  }
               }
      }
      if(cStart==towerName[1]){
               for(int i=0;i<pointB.length;i++){
                  if(pointB[i].isHaveDisc()==true){
                      disc=pointB[i].getDiscOnPoint();
                      pointB[i].setHaveDisc(false);
                      break;
                  }
               }
      }
      if(cStart==towerName[2]){
               for(int i=0;i<pointC.length;i++){
                  if(pointC[i].isHaveDisc()==true){
                      disc=pointC[i].getDiscOnPoint();
                      pointC[i].setHaveDisc(false);
                      break;
                  }
               }
      }
      TowerPoint endPoint=null;
      int i=0;    
      if(cEnd==towerName[0]){
               for(i=0;i<pointA.length;i++){
                  if(pointA[i].isHaveDisc()==true){
                     if(i>0){                                                                               endPoint=pointA[i-1];
                        break;
                     }
                     else if(i==0)
                        break;
                  }
               }
               if(i==pointA.length)
                 endPoint=pointA[pointA.length-1];
      }
      if(cEnd==towerName[1]){
               for(i=0;i<pointB.length;i++){
                  if(pointB[i].isHaveDisc()==true){                                                      if(i>0){                                                                               endPoint=pointB[i-1];
                        break;
                     }
                     else if(i==0)
                        break;
                  }
               }
               if(i==pointB.length)
                 endPoint=pointB[pointB.length-1];
      }
      if(cEnd==towerName[2]){
               for(i=0;i<pointC.length;i++){
                  if(pointC[i].isHaveDisc()==true){                                                      if(i>0){                                                                               endPoint=pointC[i-1];
                        break;
                     }
                     else if(i==0)
                        break;
                  }   
               }
               if(i==pointC.length)
                 endPoint=pointC[pointC.length-1];
      }
      if(endPoint!=null&&disc!=null){
             endPoint.putDisc(disc,con);
             endPoint.setHaveDisc(true);
      }
   }
}

分享到:
评论

相关推荐

    JAVA 汉诺塔自动演示

    JAVA 汉诺塔自动演示是指使用JAVA编程语言实现汉诺塔问题的自动化演示程序。 在JAVA中实现汉诺塔自动演示,主要涉及以下几个知识点: 1. **递归**:汉诺塔问题的解决方案是基于递归算法的。递归函数通常包含两个...

    JAVA实现汉诺塔自动演示

    总的来说,这个"JAVA实现汉诺塔自动演示"的项目是一个结合了基础数据结构、递归算法、事件驱动编程以及图形用户界面设计的实例。通过这个项目,学习者可以深入理解Java语言的多方面特性和编程技巧,同时对递归算法有...

    Java语言汉诺塔自动演示

    这个汉诺塔自动演示的Java源代码可以帮助初学者理解递归的概念和递归函数的工作方式。通过阅读和运行代码,你可以看到如何通过分解问题并逐步解决来实现复杂任务。递归是计算机科学中的一个重要概念,广泛应用于树...

    汉诺塔自动演示

    汉诺塔游戏是一种经典的逻辑谜题,...总的来说,"汉诺塔自动演示"是一个结合了基础数据结构、递归算法以及GUI编程的Java项目,对于学习者来说,这是一个很好的实践和理解递归、问题解决策略以及用户界面设计的实例。

    用JAVA实现的汉诺塔

    在提供的"汉诺塔自动演示"文件中,可能包含了这样的功能,它将上述逻辑与用户界面相结合,提供更生动的用户体验。 总结起来,Java实现的汉诺塔问题是一个典型的递归算法应用,它展示了如何通过分解问题并逐步解决来...

    java实现汉诺塔小游戏

    在Java中实现汉诺塔游戏,主要涉及到递归算法的应用。汉诺塔问题的解决方案可以通过将大问题分解为小问题来解决,也就是将n个圆盘从起始柱A通过中间柱B移动到目标柱C的过程可以分为三步: 1. **将n-1个圆盘从A移动...

    汉诺塔 Java版(可实现鼠标拖动和自动演示)

    在本项目中,"汉诺塔 Java版(可实现鼠标拖动和自动演示)",开发者不仅实现了基础的汉诺塔问题的解决方案,还增加了交互性的功能,让用户可以通过鼠标拖动盘子进行操作,这涉及到Java图形用户界面(GUI)的设计。...

    汉诺塔演示及手动程序(java)

    在这个"汉诺塔演示及手动程序(java)"中,开发者创建了一个Java应用程序,既能够模拟自动演示汉诺塔的解决方案,也允许用户手动操作体验游戏过程。 首先,我们来理解一下汉诺塔问题的基本概念。汉诺塔问题有三个...

    java GUI版汉诺塔源码

    为了实现自动演示,源码中可能包含一个定时器(`javax.swing.Timer`),在每次盘子移动后触发,使得用户可以观察到每一步的动画效果。通过调整定时器的延迟时间,可以控制动画的速度。 此外,源码还可能包含错误...

    汉诺塔java实现

    在实际的“汉诺塔自动演示”中,可能还会包含图形界面或者命令行界面来动态展示盘子的移动过程,使得用户可以直观地看到每一步操作。这样的实现不仅锻炼了编程技巧,也加深了对递归算法的理解。 总的来说,汉诺塔...

    Java 汉诺塔_Hannoi GUI 可视化_图形用户界面_源代码

    这是Java GUI可视化图形设计的汉诺塔(Hannoi)小游戏,使用Eclipse编译器制作,用户可以使用鼠标拖动盘子进行自己操作,或者选择自动演示;另外,增加了一些扩展功能:1、用户进行游戏的游戏时间记录;2、用户可...

    java swing汉诺塔窗体小游戏

    在这个Java Swing实现的汉诺塔窗体小游戏中,开发者为初学者提供了一个直观的学习平台,通过代码来理解递归和问题解决策略。 首先,`Hanoi11.java`是这个游戏的主要源代码文件。这个文件中,我们可能看到以下关键...

    汉诺塔自动演示- java项目

    在Java编程中实现汉诺塔自动演示,主要涉及以下几个关键知识点: 1. **递归算法**:汉诺塔问题的解决方案是基于递归的。在Java中,我们可以定义一个方法来表示将n个盘子从一个柱子移动到另一个柱子的逻辑。基本思想...

    汉诺塔图形演示(自动,手动,含源码)

    通过阅读和分析源码,可以了解到如何用编程语言(可能是Python、Java或其他常见语言)实现汉诺塔问题的解决方案,以及如何设计用户界面以实现自动和手动操作。 在解汉诺塔问题时,通常使用递归算法。这个算法基于...

    汉诺塔 演示 图形化界面 JAVA

    右上角有步数显示,下方有多个按钮,可实现暂停,一步步执行,和自动执行,刷新,等多种功能,花了一个星期编的,支持一下吧

    汉诺塔 能够实现10层以内的自选层数的汉诺塔

    汉诺塔 能够实现10层以内的自选层数的汉诺塔自动演示,停止,记录步数

    基于Java实现的Hannoi汉诺塔自动演示程序(GUI)【100013229】

    汉诺塔中有三个座,名字分别为A,B,C。初始状态时A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。释放鼠标来放置该盘子。 ...

    java汉诺塔

    下面我们将深入探讨这个Java汉诺塔项目,包括其核心概念、实现方式以及扩展功能。 首先,汉诺塔游戏的基本规则是:有三根柱子,每根柱子上自下而上按大小顺序叠放着若干个圆盘。目标是将所有圆盘从第一根柱子(源柱...

    JAVA程序课程大作业-汉诺塔自动演示.zip

    这个能够模拟1-9层汉诺塔的移动过程,不是简单的消失、重现,而是完整的一个盘子从一个柱子上升、平移、下落到另外一个柱子上的过程。只需你在输入框输入数字,点击确定之后便会自动帮你演示过程。欢迎下载。

Global site tag (gtag.js) - Google Analytics