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汉诺塔算法
汉诺塔问题[又称河内塔]是印度的一个古老的传说. 据传开天辟地之神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把 ...
- JAVA——汉诺塔
大家还记得某年春晚小品那个把大象放冰箱需要几步吗? 今天,我准备写的是汉诺塔,有三个魔法石柱,分别:诚实.勇敢.正直.其中有一个石柱上从大到小,从地向上依次排放着四个魔法圆环,需要将那四个魔法圆环分别 ...
- Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法-un
ylbtech-Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法 1.返回顶部 1. Java 实例 - 汉诺塔算法 Java 实例 汉诺塔(又称河内塔)问题是源 ...
- 用C语言实现汉诺塔自动递归演示程序
用C语言实现汉诺塔自动递归演示程序 程序实现效果 1.变界面大小依照输入递归数改变. 2.汉诺塔自动移动演示. 3.采用gotoxy实现流畅刷新. 4.保留文字显示递归流程 程序展示及实现 githu ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
- 编程:递归编程解决汉诺塔问题(用java实现)
Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...
- Java递归算法——汉诺塔问题
//================================================= // File Name : Tower_demo //-------------------- ...
- java 解决汉诺塔问题
//汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...
- java 中递归的实现 以及利用递归方法实现汉诺塔
今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...
随机推荐
- for循环的灵活性
for循环把初始化.测试和更新组合在一起,其基本形式如下所示: for(初始化:测试条件:更新表达式) { //循环体 } 关键字for后面的圆括号中3个表达式,分别用两个分号隔开: 第一 ...
- 洛谷.3391.文艺平衡树(fhq Traep)
题目链接 //注意反转时先分裂r,因为l,r是针对整棵树的排名 #include<cstdio> #include<cctype> #include<algorithm& ...
- 解决angular页面值闪现问题
<body ng-app="ngAnimate"ng-cloak></body> <input type="checkbox" n ...
- web前端不可错过的开发工具–Adobe Brackets
Adobe Brackets是一个开源的基于HTML/CSS/JavaScript开发,运行在native shell上的集成开发环境.该项目由Adobe创建和维护,根据MIT许可证发布.提供Wind ...
- CocosCreator动作系统
废话没有,直接上代码,有注释可以看的, cc.Class({ extends: cc.Component, properties: { player:{ default:null, type:cc.N ...
- Object类--toString方法
toString()方法 1.在Object类中定义toString()方法的时候返回对象的哈希code码(对象地址字符串) 直接输出对象: 2.可以通过重写toString()方法表示出对象的属性之 ...
- AngularJS中Scope间通讯Demo
在AngularJS中,每一个controller都有对应的Scope,而Scope间有时候需要通讯.比如有如下的一个controller嵌套: <body ng-controller=&quo ...
- hdu4607Park Visit 树的直径
//给一棵双向树,数中边的权值为1,问对于这颗树中走k个节点的最短路径 //假设k小于这颗数的直径加1,那么走k个节点就没有反复的路,假设大于 //那么大于的节点都须要走两遍 #include< ...
- svn与git操作对比 (未来有空做一个 svn与git实战对比 )
svn是集中式的,git是分布式的,但是我们日常使用的都是按照集中式唯一服务器仓库的方式来去做的,最终我们的代码都要提交到一个唯一仓库中. 他们最大的区别是本地工作拷贝的工作方式不同, 一.svn本地 ...
- Chart-template
ylbtech-Chart: 1.返回顶部 1-1. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 ...