📄 hanoi.java
字号:
Close.setBackground(Color.white);
Close.setBorder(border2);
Close.setFont(defaultFont);
Close.setText("关闭");
jPanel3.add(Close);
Close.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) { setVisible(false); }
});
this.setLocationRelativeTo(null);
this.setModal(true);
this.show();
}
}
//*******************************帮助dialog*****************************
class DialogHelp extends JDialog
{
JScrollPane scrollPane ;
Border border1 = new EmptyBorder(20,15,5,15);
Border border2 = BorderFactory.createBevelBorder(BevelBorder.LOWERED,
new Color(204,236,255),
new Color(204,236,255), //43, 66, 97
new Color(45, 92, 162),
new Color(45, 92, 162));
JPanel Panel1 = new JPanel();
JPanel Panel2 = new JPanel(new BorderLayout());
JButton Close = new JButton();
Font defaultFont = new Font("宋体",Font.PLAIN,12);
JTextArea jTextArea = new JTextArea();
public DialogHelp(JFrame frame) throws HeadlessException
{
super(frame, true);
this.setSize(new Dimension(300, 200));
this.setTitle("帮 助 ");
jTextArea.setEditable(false);
jTextArea.setText(" 关于汉诺塔\n\n"
+" 在印度,有这么一个古老的传说:\n"
+" 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。\n"
+" 印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。\n"
+" 不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。\n"
+" 僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。\n\n"
+" 后来,这个传说就演变为汉诺塔游戏:\n"
+" 1.有三根杆子A,B,C。A杆上有若干盘子\n"
+" 2.每次移动一块盘子,小的只能叠在大的上面 \n"
+" 3.把所有碟子从A杆全部移到C杆上\n\n"
+" 游戏说明:\n"
+" 规则:每次只能移动箭头所指向的柱子上的盘子。\n"
+" 操作:\n"
+" D:向左移动箭头 K:向右移动箭头\n"
+" F:向左移动碟子 J:向右移动碟子\n");
jTextArea.setLineWrap(true);
jTextArea.setForeground(new Color(55, 77, 118));
scrollPane = new JScrollPane(jTextArea);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setBorder(border2);
scrollPane.setOpaque(false);
scrollPane.setPreferredSize(new Dimension(240,110));
Close.setBackground(Color.white);
Close.setActionCommand("jButton1");
Close.setText("关闭");
Close.setFont(defaultFont);
Close.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) { setVisible(false); }
});
Panel1.setSize(new Dimension(200,40));
Panel1.setBorder(new EmptyBorder(0,0,5,0));
Panel1.setBackground(new Color(185,211,238));
Panel1.add(Close, null);
JPanel p1 = new JPanel();
p1.add(scrollPane);
p1.setBackground(new Color(185,211,238));
JPanel p2 = new JPanel();
p2.setBackground(new Color(185,211,238));
p2.setPreferredSize(new Dimension(300,7));
this.add(p2,BorderLayout.NORTH);
this.add(Panel1,BorderLayout.SOUTH);
this.add(p1, BorderLayout.CENTER);
this.setLocationRelativeTo(null);
this.setModal(true);
this.show();
}
}
//******************************首选项dialog*****************************
class ButtonPanel extends JPanel
{
private ButtonGroup group ;
JRadioButton b[] ;
int n ;
Font defaultFont = new Font("宋体",Font.PLAIN,13);
public ButtonPanel(String title , String[] options)
{
setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),title));
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
group = new ButtonGroup();
b = new JRadioButton[options.length];
for(int i = 0 ; i < options.length ; i ++)
{
b[i] = new JRadioButton(" "+options[i]);
b[i].setFocusable(false);
b[i].setFont(defaultFont);
b[i].setActionCommand(options[i]);
add(b[i]);
group.add(b[i]);
}
n = 0 ;
b[n].setSelected(true);
}
public void setSelect(int n)
{
b[n].setSelected(true);
}
public String getSelection()
{
return group.getSelection().getActionCommand();
}
}
class DialogOption extends JDialog implements ActionListener
{
Hanoi mainFrame ;
private ButtonPanel ratePanel ;
private ButtonPanel soundPanel ;
private ButtonPanel musicPanel ;
private JButton close ;
public DialogOption(Hanoi f)
{
super(f,true);
mainFrame = f ;
setTitle("首 选 项 ");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
Font defaultFont = new Font("宋体",Font.PLAIN,13);
JPanel gridPanel = new JPanel();
gridPanel.setPreferredSize(new Dimension(300,195));
gridPanel.setLayout(new GridLayout(1,2));
gridPanel.setBorder(new EmptyBorder(5,10,5,10));
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2,1));
panel.setBorder(new EmptyBorder(0,0,0,5));
soundPanel = new ButtonPanel("音效",new String[]
{
"开",
"关"
});
soundPanel.setSelect(1);
musicPanel = new ButtonPanel("背景音乐",new String[]
{
"开",
"关"
});
musicPanel.setSelect(1);
panel.add(soundPanel);
panel.add(musicPanel);
ratePanel = new ButtonPanel("演示速度",new String[]
{
"1倍速",
"2倍速",
"3倍速",
"4倍速"
});
ratePanel.setSelect(3-(int)(Math.log(mainFrame.getDelay()/50)/Math.log(2)));
gridPanel.add(panel);
gridPanel.add(ratePanel);
JPanel p = new JPanel();
p.setPreferredSize(new Dimension(300,40));
close = new JButton("关闭");
close.setActionCommand("关闭");
close.setBackground(Color.white);
close.setFont(defaultFont);
close.setFocusable(false);
close.addActionListener(this);
p.add(close);
this.add(gridPanel , BorderLayout.CENTER);
this.add(p , BorderLayout.SOUTH);
this.setSize(new Dimension(300,235));
this.setLocationRelativeTo(null);
this.show();
}
public void actionPerformed(ActionEvent e)
{
if(ratePanel.getSelection() == "1倍速")
{
mainFrame.setDelay(400);
}
else if(ratePanel.getSelection() == "2倍速")
{
mainFrame.setDelay(200);
}
else if(ratePanel.getSelection() == "3倍速")
{
mainFrame.setDelay(100);
}
else if(ratePanel.getSelection() == "4倍速")
{
mainFrame.setDelay(50);
}
setVisible(false);
}
}
//*******************************盘数自定义dialog**************************
class DialogCustomDisk extends JDialog implements ChangeListener
{
Hanoi mainFrame ;
JPanel panel = new JPanel();
JSlider slider = new JSlider(3,10,3);
JLabel label = new JLabel("盘 数 : ");
JButton close = new JButton("关闭");
Font labelFont = new Font("宋体",Font.PLAIN,14);
Font buttonFont = new Font("宋体",Font.PLAIN,13);
public DialogCustomDisk(Hanoi f)
{
super(f, true);
mainFrame = f ;
this.setSize(new Dimension(300, 150));
this.setTitle("设置盘数");
slider.setMajorTickSpacing(1); //显示标尺,每单元现实一个大标尺
slider.setPaintTicks(true); //显示标尺
slider.setSnapToTicks(true); //强制滑块对齐标尺
slider.setPaintLabels(true); //给达标尺添加标尺标签
slider.addChangeListener(this);
label.setFont(labelFont);
close.setBackground(Color.white);
close.setFont(buttonFont);
close.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) { setVisible(false); }
});
panel.add(label);
panel.add(slider);
panel.add(close);
panel.setBorder(new EmptyBorder(10,5,10,5));
panel.setLayout(new FlowLayout(FlowLayout.CENTER,5,10));
this.add(panel,BorderLayout.CENTER);
this.setLocationRelativeTo(null);
this.show();
}
public void stateChanged(ChangeEvent event)
{
int diskNum = slider.getValue();
mainFrame.setDiskTotalNum(diskNum) ;
}
}
//******************************passGameDialog*****************************
class DialogPassGame extends JDialog
{
private Hanoi mainFrame ;
public DialogPassGame(Hanoi f)
{
super(f,true) ;
mainFrame = f ;
Font defaultFont = new Font("宋体",Font.PLAIN,13);
Font font = new Font("宋体",Font.BOLD,14);
JLabel labelText = new JLabel("恭喜您! 第"+(mainFrame.getDiskTotalNum()-2)+"关 过关!",JLabel.CENTER);
labelText.setFont(font);
labelText.setForeground(Color.red);
labelText.setPreferredSize(new Dimension(300,35));
labelText.setBackground(new Color(248,248,255));
labelText.setOpaque(true);
JPanel panelText = new JPanel(new GridLayout(3,1));
panelText.setPreferredSize(new Dimension(240,105));
panelText.setBackground(Color.white);
String s1 = mainFrame.getRecord(mainFrame.getDiskTotalNum()-2) ; //当前记录
String s2 = mainFrame.getTime(); //玩家过关时间
JLabel l1 = new JLabel("",JLabel.CENTER);
if(mainFrame.isDigital(s1))
l1.setText("目前最高记录:"+s1+" 秒");
else
l1.setText("目前最高记录: 无");
JLabel l2 = new JLabel("您的时间:"+s2+" 秒",JLabel.CENTER);
JLabel l3 = new JLabel();
JLabel labelIcon = new JLabel();
labelIcon.setPreferredSize(new Dimension(125,115));
labelIcon.setBorder(new EmptyBorder(0,10,0,10));
if(!mainFrame.isDigital(s1) || Float.parseFloat(s1) > Float.parseFloat(s2)) //当前记录大于玩家过关时间则刷新
{
mainFrame.setRecord(s2,mainFrame.getDiskTotalNum()-2);
l3.setText("挑战成功!新记录诞生!");
l3.setHorizontalAlignment(JLabel.CENTER);
l3.setForeground(Color.red);
labelIcon.setIcon(new ImageIcon("images/pass2.gif"));
}
else
{
l3.setText("挑战失败!下次继续努力!");
l3.setHorizontalAlignment(JLabel.CENTER);
l3.setForeground(Color.GREEN);
labelIcon.setIcon(new ImageIcon("images/pass1.gif"));
}
l1.setFont(defaultFont);
l2.setFont(defaultFont);
l3.setFont(defaultFont);
panelText.add(l1);
panelText.add(l2);
panelText.add(l3);
JPanel panelButton = new JPanel();
panelButton.setPreferredSize(new Dimension(300,35));
panelButton.setBackground(new Color(248,248,255));
JButton close = new JButton("关闭");
close.setBackground(Color.white);
close.setFont(defaultFont);
close.setFocusable(false);
close.setPreferredSize(new Dimension(60,25));
close.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) { setVisible(false); }
});
panelButton.add(close);
this.add(labelText,BorderLayout.NORTH);
this.add(labelIcon,BorderLayout.WEST);
this.add(panelText,BorderLayout.CENTER);
this.add(panelButton,BorderLayout.SOUTH);
this.setBackground(new Color(248,248,255));
this.setSize(365,210);
this.setLocationRelativeTo(null);
this.show();
}
}
//***********************************自动演示线程*******************************
class ThreadAutoPlay extends Thread
{
Hanoi mainFrame ;
public ThreadAutoPlay(Hanoi f)
{
mainFrame = f ;
}
public void run()
{
mainFrame.timeStart();
hPlay(mainFrame.getDiskTotalNum(),0,1,2);
mainFrame.timeStop();
}
public void hPlay(int n , int a , int b ,int c)
{
if(n > 0)
{
hPlay(n-1,a,c,b);
if(n>1)
{
pause() ;
mainFrame.moveArrow( a-b ) ;
}
pause() ;
mainFrame.moveDisk( c-a );
if(n>1)
{
pause() ;
mainFrame.moveArrow( b-c ) ;
}
hPlay(n-1,b,a,c);
}
}
public void pause()
{
try
{
Thread.sleep(mainFrame.getDelay());//可以修改此值加快盘子移动的速度
}catch(InterruptedException e){}
}
}
//**************************************计时器线程*********************************
class ThreadTime extends Thread
{
Hanoi mainFrame ;
int times ;
public ThreadTime(Hanoi f)
{
mainFrame = f ;
}
public void run()
{
times = 0 ;
while(true)
{
try
{
sleep(100);
}catch(InterruptedException e){}
times ++ ;
mainFrame.setTime(times);
mainFrame.printTime();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -