设计一个HANOI塔移动演示软件。(盘子数量、移动速度可以设置,要求统计出移动次数和时间)
(要有用户界面,图像)提示:
HANOI塔 可以用递归解决。
(要有用户界面,图像)提示:
HANOI塔 可以用递归解决。
解决方案 »
- EJB3.0保存数据时报异常:org.hibernate.StaleStateException
- SSH 不能插入数据 WARN JDBCExceptionReporter:49
- 跨库调用存储过程,并希望高手能讲下关于存储过程相关知识。。
- Spring 使用定时器问题
- 求关于怎么改变界面的肤色方案
- 在eclipse里无法正常打开jsp页。MyEclipse的简单问题~!
- 谁有关于控制时间的代码?我现在急用!!谢谢了
- 那位高知道在Tomcat中,如何在部署时就自动把jsp页面编译成.class?
- TableCellRenderer和TableCellEditor有人懂瓦?
- WSAD5中如何配置EJB的JNDI?
- 寻Crystal Report for java
- 求JasperReport的JRTableModelDataSource数据源的实例
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;class MainWindow extends Frame
implements ActionListener
{
int Num,Speed,Count,Time; //盘子移动 模拟 标签
Label labelMove[][]=new Label[4][12];
int isVisibleA[],isVisibleB[],isVisibleC[];
int row_a,row_b,length;
//菜单
MenuBar menubar;
Menu menu;
MenuItem menuitem;
//控制区pControl 内 标签、文本域
Label labelNum,labelSpeed,labelCount,labelTime;
TextField textNum,textSpeed,textCount,textTime;
Button buttonEnter;
//显示区pDisplay 内 标签##################################################################
//Label labelA,labelB,labelC;
// 显示区 和 控制区
Panel pDisplay;
Panel pControl;
MainWindow()
{
FlowLayout flow=new FlowLayout();
//菜单
menubar=new MenuBar();
menu=new Menu("文件");
menuitem=new MenuItem("退出");
menuitem.setShortcut(new MenuShortcut(KeyEvent.VK_E));
menu.add(menuitem);
menubar.add(menu);
setMenuBar(menubar);
menuitem.addActionListener(this);
//控制区pControl 内 标签、文本域
labelNum=new Label("盘子数量:");
textNum=new TextField(5);
labelSpeed=new Label("移动速度:");
textSpeed=new TextField(5);
labelCount=new Label("移动次数:");
textCount=new TextField(5);
labelTime=new Label("移动时间:");
textTime=new TextField(5);
buttonEnter=new Button("确定");
buttonEnter.addActionListener(this);
// 控制区
pControl=new Panel();
pControl.setBackground(Color.cyan);
pControl.add(labelNum);
pControl.add(textNum);
pControl.add(labelSpeed);
pControl.add(textSpeed);
pControl.add(labelCount);
pControl.add(textCount);
pControl.add(labelTime);
pControl.add(textTime);
pControl.add(buttonEnter);
add(pControl,BorderLayout.NORTH);
//显示区pDisplay 内 标签
// labelA=new Label("A",Label.CENTER);
// labelB=new Label("B",Label.CENTER);
// labelC=new Label("C",Label.CENTER);
// labelA.setBackground(Color.red);
// labelB.setBackground(Color.yellow);
// labelC.setBackground(Color.blue);
// labelA.setPreferredSize(new Dimension(200,20));
// labelB.setPreferredSize(new Dimension(200,20));
// labelC.setPreferredSize(new Dimension(200,20));
// 显示区
pDisplay=new Panel();
pDisplay.setBounds(0, 0, 800, 500);
pDisplay.setBackground(Color.gray);
// pDisplay.add(labelA);
// pDisplay.add(labelB);
// pDisplay.add(labelC);
add(pDisplay,BorderLayout.CENTER);
setBounds(100,100,800,600);
setVisible(true);
validate();
}
void moveDisplay(int a,int b)
{
//System.out.println(a+"----->"+b+"\n");
switch(a)
{
case 1:
for(int i=0;i<4;i++)
{
if(isVisibleA[i]>0)
{
row_a=i;
length=isVisibleA[row_a];
break;
}
}
for(int i=0;i<length;i++)
{
labelMove[row_a][i].setVisible(false);
}
isVisibleA[row_a]=0;
break;
case 2:
for(int i=0;i<4;i++)
{
if(isVisibleB[i]>0)
{
row_a=i;
length=isVisibleB[row_a];
break;
}
}
for(int i=0;i<length;i++)
{
labelMove[row_a][4+i].setVisible(false);
}
isVisibleB[row_a]=0;
break;
case 3:
for(int i=0;i<4;i++)
{
if(isVisibleC[i]>0)
{
row_a=i;
length=isVisibleC[row_a];
break;
}
}
for(int i=0;i<length;i++)
{
labelMove[row_a][8+i].setVisible(false);
}
isVisibleC[row_a]=0;
break;
}
switch(b)
{
case 2:
for(int i=0;i<4;i++)
{
if(isVisibleB[i]>0)
{
row_b=i;
break;
}
}
row_b=row_b-1;
for(int i=0;i<length;i++)
{
labelMove[row_b][4+i].setVisible(true);
}
isVisibleA[row_b]=length;
break;
case 1:
for(int i=0;i<4;i++)
{
if(isVisibleA[i]>0)
{
row_b=i;
break;
}
}
row_b=row_b-1;
for(int i=0;i<length;i++)
{
labelMove[row_b][i].setVisible(true);
}
isVisibleA[row_b]=length;
break;
case 3:
for(int i=0;i<4;i++)
{
if(isVisibleB[i]>0)
{
row_b=i;
break;
}
}
row_b=row_b-1;
for(int i=0;i<length;i++)
{
labelMove[row_b][8+i].setVisible(true);
}
isVisibleA[row_b]=length;
break;
}
}
void hanoi(int n,int a,int b,int c)
{
if(n==1)
{
moveDisplay(a,c);
}
else
{
hanoi(n-1,a,c,b);
moveDisplay(a,c);
hanoi(n-1,b,a,c);
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==menuitem) //菜单 退出
{
System.exit(0);
}
else if(e.getSource()==buttonEnter) //确定 演示
{
Num=Integer.parseInt(textNum.getText());
//Speed=Integer.parseInt(textSpeed.getText());
//labelMove=new Label[4][12];
for(int i=0;i<4;i++)
{
for(int j=0;j<12;j++)
{
pDisplay.add(labelMove[i][j]);
labelMove[i][j].setBackground(Color.black);
labelMove[i][j].setVisible(false);
}
}
for(int i=0;i<=Num-1;i++)
{
for(int j=0;j<=Num-1;j++)
{
if(i>=j)
{
//labelMove[i][j].setVisible(true);
}
}
}
isVisibleA=new int[4];
isVisibleB=new int[4];
isVisibleC=new int[4];
for(int i=0;i<=3;i++)
{
if(i<Num)
{
isVisibleA[i]=i+1;
}
else
{
isVisibleA[i]=0;
}
isVisibleB[i]=0;
isVisibleC[i]=0;
}
hanoi(Num,1,2,3);
}
}
}public class Main
{
public static void main(String args[])
{
MainWindow win=new MainWindow();
}}但是有错误 给看看什么地方错了
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;public class HanoiPane extends JComponent implements Runnable{
private static final long serialVersionUID=-5007996832452230212L; private final Stack<Integer> src=new Stack<Integer>();
private final Stack<Integer> mid=new Stack<Integer>();
private final Stack<Integer> tag=new Stack<Integer>(); public static void main(String[] args){
JFrame f=new JFrame("汉诺塔演示");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500,400);
JPanel top=new JPanel(new GridLayout(1,0));
top.add(new JLabel("盘子数:"));
final JTextField tf=new JTextField();
tf.setText("10");
top.add(tf);
top.add(new JLabel("间隔毫秒:"));
final JTextField tt=new JTextField();
tt.setText("20");
top.add(tt);
top.add(new JLabel("移动次数:"));
final JTextField tc=new JTextField();
tc.setEditable(false);
top.add(tc);
JButton b=new JButton("开始");
final HanoiPane c=new HanoiPane();
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
c.start(Integer.parseInt(tf.getText()),Integer.parseInt(tt.getText()),tc);
}
catch(Exception ex){
ex.printStackTrace();
}
}
});
top.add(b); f.add(top,BorderLayout.NORTH);
f.add(c);
f.setVisible(true); } private int moveCount; void move(Stack<Integer> src,Stack<Integer> tag){
try{
Thread.sleep(sleep);
}
catch(InterruptedException e){
}
tag.push(src.pop());
moveCount++;
if(timesComp != null){
timesComp.setText("" + moveCount);
}
repaint();
} public void move(int count,Stack<Integer> src,Stack<Integer> tag,Stack<Integer> mid){
if(count == 1){
move(src,tag);
}
else{
move(count - 1,src,mid,tag);
move(src,tag);
move(count - 1,mid,tag,src);
}
} public void paintComponent(Graphics g){
super.paintComponent(g);
if(count <= 0){
return;
}
int w=getWidth();
int h=getHeight();
int maxW=w / 3;
int maxH=h / count;
paintTower(g,src,w * 1 / 6,h,maxW,maxH);
paintTower(g,mid,w * 3 / 6,h,maxW,maxH);
paintTower(g,tag,w * 5 / 6,h,maxW,maxH);
} private void paintTower(Graphics g,Stack<Integer> data,int x,int y,int maxW,int maxH){
int len=data.size(); for(int i=0;i < len;i++){
Integer n=data.get(i);
int w=maxW - ((maxW / 2) * n / count);
g.setColor(Color.BLUE);
g.drawRect(x - w / 2,y - maxH,w,maxH);
y-=maxH;
}
} private int count;
private int sleep;
private JTextField timesComp; /**
* @param n 数目
* @param sleep 间隔时间
*/
public void start(int n,int sleep,JTextField timesComp){
if(inWork){
return;
}
this.count=n;
this.sleep=sleep;
this.timesComp=timesComp;
this.moveCount=0;
src.clear();
mid.clear();
tag.clear();
for(int i=0;i < count;i++){
src.push(i);
}
new Thread(this).start();
} boolean inWork;
public void run(){
inWork=true;
try{
move(count,src,tag,mid);
}
finally{
inWork=false;
}
}
}