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 汉诺塔实现自动演示的更多相关文章

  1. Java汉诺塔算法

    汉诺塔问题[又称河内塔]是印度的一个古老的传说. 据传开天辟地之神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把 ...

  2. JAVA——汉诺塔

    大家还记得某年春晚小品那个把大象放冰箱需要几步吗? 今天,我准备写的是汉诺塔,有三个魔法石柱,分别:诚实.勇敢.正直.其中有一个石柱上从大到小,从地向上依次排放着四个魔法圆环,需要将那四个魔法圆环分别 ...

  3. Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法-un

    ylbtech-Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法 1.返回顶部 1. Java 实例 - 汉诺塔算法  Java 实例 汉诺塔(又称河内塔)问题是源 ...

  4. 用C语言实现汉诺塔自动递归演示程序

    用C语言实现汉诺塔自动递归演示程序 程序实现效果 1.变界面大小依照输入递归数改变. 2.汉诺塔自动移动演示. 3.采用gotoxy实现流畅刷新. 4.保留文字显示递归流程 程序展示及实现 githu ...

  5. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

  6. 编程:递归编程解决汉诺塔问题(用java实现)

    Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...

  7. Java递归算法——汉诺塔问题

    //================================================= // File Name : Tower_demo //-------------------- ...

  8. java 解决汉诺塔问题

    //汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...

  9. java 中递归的实现 以及利用递归方法实现汉诺塔

    今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...

随机推荐

  1. react输入 撤销

    销毁阶段可以使用的函数:componentWillUnmount:在删除组件之前进行清理操作,比如计时器和事件监听器.因为这些函数都是开发者手动加上去的,react不知道,必须进行手动清理. 实例第一 ...

  2. [NOIp2007提高组]矩阵取数游戏

    OJ题号:洛谷1005 思路: 动态规划. 不难发现每行能够取得的最大值仅与当前行的数据有关,因此本题可以对每行的数据分别DP,最后求和. 设$f_{i,j}$表示左边取$i$个.右边取$j$个的最大 ...

  3. Educational Codeforces Round 19 题解【ABCDE】

    A. k-Factorization 题意:给你一个n,问你这个数能否分割成k个大于1的数的乘积. 题解:因为n的取值范围很小,所以感觉dfs应该不会有很多种可能-- #include<bits ...

  4. [ Visual Studio ] MSDN

    在 Visual Studio 中创建自定义项目和项模板 编写和重构代码 (C++) C# 指南 C#最新版本 使用 MSBuild 如何:管理编辑器模式,进入全屏模式编写代码 自定义代码折叠

  5. Voltage Translation for Analog to Digital Interface ADC

    Voltage Translation for Analog to Digital Interface 孕龙逻辑分析仪 ZeroPlus Logic Analyzer How to modify an ...

  6. [Java] 简化正则表达式的使用

    使用 RegexString.with(string).pattern(pattern).start() + 后续操作(matches,find或者是replace) 源码 package com; ...

  7. I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

    问题: 安装TensorFlow(CPU版本),使用pip install tensorflow安装,安装一切顺利,但是在跑一个简单的程序时,遇到如下情况: 大概意思是:你的CPU支持AVX扩展,但是 ...

  8. 使用sshfs挂载远程服务器目录

    点击访问原文 您还可以加入全栈技术交流群(QQ群号:254842154) 服务器日志查看,是开发人员和服务器运维人员在工作中经常会遇到的一件事情,只有一台服务器时,比较好办,直接登录服务器使用tail ...

  9. 【Little Demo】左右按钮tab选项卡双切换

    通过前一篇文章 从简单的Tab标签到Tab图片切换 的说明,相关效果也就可以实现了. 1.左右按钮tab选项卡双切换 很明显,左右两个按钮是 absolute 布局,另外就是内容部分和Tab标签部分. ...

  10. 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节

    开篇介绍 最近有人问我有关文件处理中空值处理的相关问题: OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示? 为什么选中了 Keep Nulls 但是数据 ...