Java图形界面汉诺塔
来源:互联网 发布:java字符串转整型 编辑:程序博客网 时间:2024/05/22 11:53
一个Java初学者简单的小图形界面应用程序。。
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class Hanoi
{
public static void main(String args[])
{
new MyFrame();
}
}
class GamePanel extends Panel
{
Stick[] sticks=new Stick[3];
Button bt;
GamePanel(int n)
{
setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
sticks[0]=new Stick(n,Color.black);
sticks[1]=new Stick(n,Color.red);
sticks[2]=new Stick(n,Color.green);
for(int i=n-1;i>=0;i--)
{
sticks[0].addDish(new Dish(i));
}
add(sticks[0]);
add(Box.createHorizontalStrut(10));
add(sticks[1]);
add(Box.createHorizontalStrut(10));
add(sticks[2]);
validate();
}
public void paint(Graphics g)
{
g.drawRect(10,20,100,110);
sticks[0].repaint();
sticks[1].repaint();
sticks[2].repaint();
}
public void moveDish(int a,int b)
{
Dish dish=sticks[a].moveDish();
sticks[b].addDish(dish);
repaint();
}
}
class MyFrame extends Frame implements ActionListener
{
GamePanel panel;
Button pre,next,init;
TextField input;
Label label;
Panel menu;
int a[][],n=5,i=0;
public MyFrame()
{
super("汉诺塔");
a=new int[(int)Math.pow(2,n)][2];
panel=new GamePanel(n);
pre=new Button("preview");
next=new Button("next");
init=new Button("初始化");
label=new Label("盘子个数:");
input=new TextField("5",8);
menu =new Panel();
pre.addActionListener(this);
next.addActionListener(this);
init.addActionListener(this);
menu.add(label);
menu.add(input);
menu.add(pre);
menu.add(next);
menu.add(init);
add(panel,BorderLayout.CENTER);
add(menu,BorderLayout.SOUTH);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
setBounds(300,100,800,300);
setVisible(true);
validate();
hanoi(n,0,1,2);
i=0;
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==init)
{
try
{
n=Integer.parseInt(input.getText());
}
catch(NumberFormatException ee)
{
JOptionPane.showMessageDialog(null, "输入错误 ");
return;
}
remove(panel);
panel=new GamePanel(n);
add(panel,BorderLayout.CENTER);
validate();
a=new int[(int)Math.pow(2,n)][2];
i=0;
hanoi(n,0,1,2);
i=0;
}
else if(e.getSource()==next)
{
if(i>=(int)Math.pow(2,n)-1)
return;
panel.moveDish(a[i][0],a[i][1]);
i++;
}
else
{
if(i<=0)
return;
i--;
panel.moveDish(a[i][1],a[i][0]);
}
}
private void hanoi(int n,int x,int y,int z)
{
if(n==1)
{
a[i][0]=x;
a[i][1]=z;
i++;
}
else
{
hanoi(n-1,x,z,y);
a[i][0]=x;a[i][1]=z;i++;
hanoi(n-1,y,x,z);
}
}
}
class Dish
{
Point location;
int level;
Color color;
Dish(int l)
{
level=l;
Random rand=new Random();
color=new Color(rand.nextInt(256),rand.nextInt(256),rand.nextInt(256));
}
public void setLocation(Point p)
{
location=p;
}
public void Draw(Graphics g)
{
g.fillRect(location.x-(40+level*20)/2,location.y,40+level*20,10);
}
}
class Stick extends Canvas
{
Dish[] dishs;
int dishNum;
Color color;
Stick(int n,Color c)
{
dishNum=0;
color=c;
dishs=new Dish[n];
}
public void addDish(Dish dish)
{
dishs[dishNum]=dish;
dishNum++;
}
public Dish moveDish()
{
dishNum--;
Dish dish=dishs[dishNum];
dishs[dishNum]=null;
return dish;
}
public void paint(Graphics g)
{
g.setColor(color);
g.fillRect((getSize().width)/2-5, (int)(getSize().height*0.1),10,(int)(getSize().height*0.8));
g.fillRect((getSize().width)/10,(int)(getSize().height*0.8+10),(getSize().width)/5*4,(int)(getSize().height*0.09));
for(int i=0;i<dishNum;i++)
{
g.setColor(dishs[i].color);
dishs[i].setLocation(new Point((getSize().width)/2,(int)(getSize().height*0.8-i*10)));
dishs[i].Draw(g);
}
}
}
运行结果:
- Java图形界面汉诺塔
- java 图形界面
- java图形界面
- java图形界面
- Java图形界面
- java 图形界面
- Java 图形界面
- Java图形界面
- java Application创建图形界面
- java的图形界面
- Java图形界面开发
- java图形界面讲解
- JAVA图形界面编程
- java图形界面设计
- Java图形界面编程
- java图形界面应用程序
- java图形界面笔记
- Java图形界面设计
- 飞鸽传书系统上开发是一件多么惬意的事情
- 高效引用传值的方案
- HTML中使背景图片自适应浏览器大小
- FriendlyARM tiny6410 一步一步学与思(2)---buttons application
- 设计模式——备忘录模式(Memento)
- Java图形界面汉诺塔
- 结构体如何使用NSData包装
- linux基础之使用异步 I/O 大大提高应用程序的性能 学习何时以及如何使用 POSIX AIO API
- 开发随笔-.net ThreadPool
- ioctl Socket Control Operations
- 辗转相除
- C#访问PostGreSQL数据库
- Linux下的多进程编程初步
- 1716. Houses (邻接矩阵)