📄 hnt.java
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
public class HNT
{
public static void main(String[] args)
{
HNTFrame frame=new HNTFrame();
frame.setSize(600,450);
frame.setLocation(200,200);
frame.setTitle("汉诺塔");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class HNTFrame extends JFrame
{
public HNTFrame()
{
n=null;
bnt=new JButton("确定");
tf=new JTextField(5);
panel1=new JPanel();
//*******************
sourcePanel=new DrawPanel(false);
sourcePanel.setPreferredSize(new Dimension(180,350));
sourcePanel.setBackground(Color.WHITE);
sourcePanel.setAction("out");
//**********************
aimPanel=new DrawPanel(true);
aimPanel.setPreferredSize(new Dimension(180,350));
aimPanel.setBackground(Color.WHITE);
aimPanel.setAction("in");
//*************************
standbyPanel=new DrawPanel(false);
standbyPanel.setPreferredSize(new Dimension(180,350));
standbyPanel.setBackground(Color.WHITE);
standbyPanel.setAction("in");
//************
sourcePanel.setEnabled(false);
aimPanel.setEnabled(false);
standbyPanel.setEnabled(false);
//************
sList=new ArrayList<NewRect>();
aList=new ArrayList<NewRect>();
stList=new ArrayList<NewRect>();
aList.clear();
stList.clear();
sourcePanel.setList(sList);
aimPanel.setList(aList);
standbyPanel.setList(stList);
panel1.add(new JLabel("输入层数"));
panel1.add(tf);
panel1.add(bnt);
label=new JLabel();
panel1.add(new JLabel("步数:"));
panel1.add(label);
add(panel1,BorderLayout.NORTH);
//add(b,BorderLayout.CENTER);
JPanel panel=new JPanel();
panel.add(sourcePanel);
panel.add(aimPanel);
panel.add(standbyPanel);
add(panel,BorderLayout.CENTER);
bnt.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
count=0;
String n=tf.getText();
if(!n.trim().equals(""))
{
num=Integer.parseInt(n);
//System.out.println(num);
aimPanel.setLength(num);
for(int i=0;i<num;i++)
{
NewRect nr=new NewRect(WIDTH-(i*20),sourcePanel);
//System.out.println(nr);
sList.add(nr);
}
sourcePanel.setList(sList);
sourcePanel.repaint();
aList.clear();
stList.clear();
aimPanel.setList(aList);
standbyPanel.setList(stList);
aimPanel.repaint();
standbyPanel.repaint();
bnt.setEnabled(false);
tf.setEnabled(false);
sourcePanel.setEnabled(true);
aimPanel.setEnabled(true);
standbyPanel.setEnabled(true);
}
else
{
JOptionPane.showMessageDialog(null,"输入层数");
tf.grabFocus();
return;
}
}
}
);
//******************************
sourcePanel.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
label.setText((count++)+"");
//source.action();
if(e.getButton()==MouseEvent.BUTTON1)
{
if(n==null)
{
/*aimPanel.setAction("in");
standbyPanel.setAction("in");*/
if(!sList.isEmpty())
{
int size=sList.size();
n=(NewRect)sList.remove(size-1);
sourcePanel.setList(sList);
sourcePanel.repaint();
}
else return;
}
else
{
/*aimPanel.setAction("in");
standbyPanel.setAction("in");*/
al=sourcePanel.getList();
int size=al.size();
if(size>0)
{
if(n.getW()<al.get(size-1).getW())
{
n.setPanel(sourcePanel);
sList.add(n);
sourcePanel.setList(sList);
sourcePanel.repaint();
n=null;
}
else
{
DrawPanel pp=n.getPanel();
al=pp.getList();
al.add(n);
n=null;
pp.setList(al);
pp.repaint();
}
}
else if(size==0)
{
n.setPanel(sourcePanel);
sList.add(n);
sourcePanel.setList(sList);
sourcePanel.repaint();
n=null;
}
}
}
else return;
}
}
);
aimPanel.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
label.setText((count++)+"");
if(e.getButton()==MouseEvent.BUTTON1)
{
if(n==null)
{
/*aimPanel.setAction("in");
standbyPanel.setAction("in");*/
if(!aList.isEmpty())
{
int size=aList.size();
n=(NewRect)aList.remove(size-1);
aimPanel.setList(aList);
aimPanel.repaint();
}
else return;
}
else
{
al=aimPanel.getList();
int size=al.size();
if(size>0)
{
if(n.getW()<al.get(size-1).getW())
{
n.setPanel(aimPanel);
aList.add(n);
aimPanel.setList(aList);
aimPanel.repaint();
n=null;
al=aimPanel.getList();
int s=al.size();
//System.out.println(s);
if(s==num)
{
JOptionPane.showMessageDialog(null,"成功");
sourcePanel.setEnabled(false);
aimPanel.setEnabled(false);
standbyPanel.setEnabled(false);
tf.setEnabled(true);
bnt.setEnabled(true);
}
}
else
{
DrawPanel pp=n.getPanel();
al=pp.getList();
al.add(n);
n=null;
pp.setList(al);
pp.repaint();
al=aimPanel.getList();
int s=al.size();
//System.out.println(s);
if(s==num)
{
JOptionPane.showMessageDialog(null,"成功");
}
}
}
else if(size==0)
{
n.setPanel(aimPanel);
aList.add(n);
aimPanel.setList(aList);
aimPanel.repaint();
n=null;
}
}
}
else return;
}
}
);
standbyPanel.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
label.setText((count++)+"");
if(e.getButton()==MouseEvent.BUTTON1)
{
if(n==null)
{
/*aimPanel.setAction("in");
standbyPanel.setAction("in");*/
if(!stList.isEmpty())
{
int size=stList.size();
n=(NewRect)stList.remove(size-1);
standbyPanel.setList(stList);
standbyPanel.repaint();
}
else return;
}
else
{
/*aimPanel.setAction("in");
standbyPanel.setAction("in");*/
/*stList.add(n);
standbyPanel.setList(stList);
standbyPanel.repaint();
n=null;*/
al=standbyPanel.getList();
int size=al.size();
if(size>0)
{
if(n.getW()<al.get(size-1).getW()||size==0)
{
n.setPanel(standbyPanel);
stList.add(n);
standbyPanel.setList(stList);
standbyPanel.repaint();
n=null;
}
else
{
DrawPanel pp=n.getPanel();
al=pp.getList();
al.add(n);
n=null;
pp.setList(al);
pp.repaint();
}
}
else if(size==0)
{
n.setPanel(standbyPanel);
stList.add(n);
standbyPanel.setList(stList);
standbyPanel.repaint();
n=null;
}
}
}
else return;
}
}
);
}
private JLabel label;
private static int count=0;
private ArrayList<NewRect> al;
private int num;
private JButton bnt;
private final int WIDTH=150;
private JPanel panel1;
private JTextField tf;
private DrawPanel sourcePanel;
private DrawPanel aimPanel;
private DrawPanel standbyPanel;
private ArrayList<NewRect> sList,aList,stList;
private NewRect n;
}
class DrawPanel extends JPanel
{
public DrawPanel(boolean b)
{
final boolean bb=b;
//System.out.println(ac);
final DrawPanel dp=this;
r=null;
}
public void setLength(int len)
{
this.len=len;
}
public int getLength()
{
return len;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
int size=list.size();
int height=getHeight()-size*20;
//g2.translate(0,0);
int i=list.size();
//System.out.println(i);
if(i==0) return;
while(i>0)
{
//System.out.println(i);
/*if(ac.equals("out")&&i==list.size())
g2.setPaint(Color.BLACK);
else */
NewRect r=(NewRect)list.get(i-1);
r.setRect(((double)getWidth()-r.getW())/2,(double)height,r.getW(),20);
g2.setPaint(Color.RED);
g2.fill(r);
//g2.setForeground(Color.YELLOW);
//super.paintComponent(g);
i--;
height=height+21;
//g2.translate(0,hight);
}
}
public void setAction(String ac)
{
this.ac=ac;
}
public String getAction()
{
return ac;
}
public void action()
{
if(ac.equals("out")) ac="in";
else ac="out";
}
public void setList(ArrayList<NewRect> list)
{
this.list=list;
}
public ArrayList<NewRect> getList()
{
return list;
}
private NewRect r;
private int len;
private String ac="";
private ArrayList<NewRect> list;
}
//*********************
class NewRect extends Rectangle2D.Double
{
public NewRect(int width,DrawPanel panel)
{
this.width=width;
this.panel=panel;
}
public DrawPanel getPanel()
{
return panel;
}
public void setPanel(DrawPanel panel)
{
this.panel=panel;
}
public int getW()
{
return width;
}
public String toString()
{
return ""+width;
}
private DrawPanel panel;
private int width;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -