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中实现汉诺塔自动演示,主要涉及以下几个知识点: 1. **递归**:汉诺塔问题的解决方案是基于递归算法的。递归函数通常包含两个...
总的来说,这个"JAVA实现汉诺塔自动演示"的项目是一个结合了基础数据结构、递归算法、事件驱动编程以及图形用户界面设计的实例。通过这个项目,学习者可以深入理解Java语言的多方面特性和编程技巧,同时对递归算法有...
这个汉诺塔自动演示的Java源代码可以帮助初学者理解递归的概念和递归函数的工作方式。通过阅读和运行代码,你可以看到如何通过分解问题并逐步解决来实现复杂任务。递归是计算机科学中的一个重要概念,广泛应用于树...
汉诺塔游戏是一种经典的逻辑谜题,...总的来说,"汉诺塔自动演示"是一个结合了基础数据结构、递归算法以及GUI编程的Java项目,对于学习者来说,这是一个很好的实践和理解递归、问题解决策略以及用户界面设计的实例。
在提供的"汉诺塔自动演示"文件中,可能包含了这样的功能,它将上述逻辑与用户界面相结合,提供更生动的用户体验。 总结起来,Java实现的汉诺塔问题是一个典型的递归算法应用,它展示了如何通过分解问题并逐步解决来...
在Java中实现汉诺塔游戏,主要涉及到递归算法的应用。汉诺塔问题的解决方案可以通过将大问题分解为小问题来解决,也就是将n个圆盘从起始柱A通过中间柱B移动到目标柱C的过程可以分为三步: 1. **将n-1个圆盘从A移动...
在本项目中,"汉诺塔 Java版(可实现鼠标拖动和自动演示)",开发者不仅实现了基础的汉诺塔问题的解决方案,还增加了交互性的功能,让用户可以通过鼠标拖动盘子进行操作,这涉及到Java图形用户界面(GUI)的设计。...
在这个"汉诺塔演示及手动程序(java)"中,开发者创建了一个Java应用程序,既能够模拟自动演示汉诺塔的解决方案,也允许用户手动操作体验游戏过程。 首先,我们来理解一下汉诺塔问题的基本概念。汉诺塔问题有三个...
为了实现自动演示,源码中可能包含一个定时器(`javax.swing.Timer`),在每次盘子移动后触发,使得用户可以观察到每一步的动画效果。通过调整定时器的延迟时间,可以控制动画的速度。 此外,源码还可能包含错误...
在实际的“汉诺塔自动演示”中,可能还会包含图形界面或者命令行界面来动态展示盘子的移动过程,使得用户可以直观地看到每一步操作。这样的实现不仅锻炼了编程技巧,也加深了对递归算法的理解。 总的来说,汉诺塔...
这是Java GUI可视化图形设计的汉诺塔(Hannoi)小游戏,使用Eclipse编译器制作,用户可以使用鼠标拖动盘子进行自己操作,或者选择自动演示;另外,增加了一些扩展功能:1、用户进行游戏的游戏时间记录;2、用户可...
在这个Java Swing实现的汉诺塔窗体小游戏中,开发者为初学者提供了一个直观的学习平台,通过代码来理解递归和问题解决策略。 首先,`Hanoi11.java`是这个游戏的主要源代码文件。这个文件中,我们可能看到以下关键...
在Java编程中实现汉诺塔自动演示,主要涉及以下几个关键知识点: 1. **递归算法**:汉诺塔问题的解决方案是基于递归的。在Java中,我们可以定义一个方法来表示将n个盘子从一个柱子移动到另一个柱子的逻辑。基本思想...
通过阅读和分析源码,可以了解到如何用编程语言(可能是Python、Java或其他常见语言)实现汉诺塔问题的解决方案,以及如何设计用户界面以实现自动和手动操作。 在解汉诺塔问题时,通常使用递归算法。这个算法基于...
右上角有步数显示,下方有多个按钮,可实现暂停,一步步执行,和自动执行,刷新,等多种功能,花了一个星期编的,支持一下吧
汉诺塔 能够实现10层以内的自选层数的汉诺塔自动演示,停止,记录步数
汉诺塔中有三个座,名字分别为A,B,C。初始状态时A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。释放鼠标来放置该盘子。 ...
下面我们将深入探讨这个Java汉诺塔项目,包括其核心概念、实现方式以及扩展功能。 首先,汉诺塔游戏的基本规则是:有三根柱子,每根柱子上自下而上按大小顺序叠放着若干个圆盘。目标是将所有圆盘从第一根柱子(源柱...
这个能够模拟1-9层汉诺塔的移动过程,不是简单的消失、重现,而是完整的一个盘子从一个柱子上升、平移、下落到另外一个柱子上的过程。只需你在输入框输入数字,点击确定之后便会自动帮你演示过程。欢迎下载。