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写的Applet小程序,可以实现汉诺塔,并可以自动演示。
汉诺塔自动演示,java语言编写的源代码,有助于递归方法和编程思想的理解,很有用
汉诺塔自动演示
用java实现的汉诺塔游戏,含源代码和可执行exe文件,供初学者参考学习
java GUI版汉诺塔源码。 使用java swing . 可以自动演示搬运过程。
这是Java GUI可视化图形设计的汉诺塔(Hannoi)小游戏,使用Eclipse编译器制作,用户可以使用鼠标拖动盘子进行自己操作,或者选择自动演示;另外,增加了一些扩展功能:1、用户进行游戏的游戏时间记录;2、用户可...
用java swing写的一个简单的汉诺塔窗体小游戏,代码较为简单,有详细的注释,点击即可运行,适合新手学习的小项目
用java制作的汉诺塔自动演示小智力程序,运行时,只要点击开始演示就可以看到汉诺塔的演示全过程。
文件包含源程序,实验报告和使用说明. 程序可以实现鼠标拖动盘子,自动演示,选择盘子个数等功能. 这里的源程序是把从网上下载的一段源程序做了一些修改. 希望对大家有所帮助.
右上角有步数显示,下方有多个按钮,可实现暂停,一步步执行,和自动执行,刷新,等多种功能,花了一个星期编的,支持一下吧
汉诺塔 能够实现10层以内的自选层数的汉诺塔自动演示,停止,记录步数
汉诺塔中有三个座,名字分别为A,B,C。初始状态时A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。释放鼠标来放置该盘子。 ...
一个相当好的JAVA源代码 帮助提高JAVA编程 做的相当精髓
这个能够模拟1-9层汉诺塔的移动过程,不是简单的消失、重现,而是完整的一个盘子从一个柱子上升、平移、下落到另外一个柱子上的过程。只需你在输入框输入数字,点击确定之后便会自动帮你演示过程。欢迎下载。
java汉诺塔课设,添加了计时器和自动演示,还有选择盘子数量功能。
autoButton=new JButton("自动演示"); autoButton.addActionListener(this); JPanel north=new JPanel(); north.add(renew); north.add(autoButton); String mess="将全部盘子从"+towerName[0]+"座搬运到"+...
Java语言编写的汉诺塔程序,形象直观; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Tower extends Frame implements ActionListener,Runnable { HannoiTower tower=null; ...
本软件是汉诺塔游戏; (1) 可以实现计时功能; (2) 游戏结束时记录排名; (3) 在玩游戏的同时还可以欣赏歌曲; (4) 不知如何玩时可以实现自动演示;