import java.awt.*;import java.awt.event.*;importjava.util.Random;import javax.swing.*;importjavax.swing.border.LineBorder;public class GameFrame extendsJFrame {/*** 菜单栏*/JMenuBar menuBar;/*** "菜单"选项*/JMenu menu;/*** "帮助"选项*/JMenu help;/*** "重新开始"选项*/JMenuItem mItem1;/*** "退出"选项*/JMenuItem mItem2;/*** "关于"选项*/JMenuItem hItem;/*** 游戏面板*/JPanel panel;/*** 游戏中的按钮*/JButton buttons[]= new JButton[16];/*** 按钮监听器*/GameListener listener;/*** 背景颜色*/Color backgruond=Color.DARK_GRAY;/*** 前景颜色*/Color foreground=Color.WHITE;/*** 游戏中的字体*/Font font= new Font("Consolas", Font.PLAIN, 14);publicGameFrame() {//TODO Auto-generated constructor stub
setSize(500, 520);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
menuBar= newJMenuBar();
menu= new JMenu("Menu");
menu.setForeground(foreground);
menu.setFont(font);
mItem1= new JMenuItem("Restart");
mItem1.setFont(font);
mItem1.addActionListener(newActionListener() {public voidactionPerformed(ActionEvent e) {
init();
}
});
mItem2= new JMenuItem("Exit");
mItem2.setFont(font);
mItem2.addActionListener(newActionListener() {public voidactionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(mItem1);
menu.add(mItem2);
help= new JMenu("Help");
help.setForeground(foreground);
help.setFont(font);
hItem= new JMenuItem("About");
hItem.setFont(font);
hItem.addActionListener(newActionListener() {public voidactionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Maked by : 胡靖");
}
});
help.add(hItem);
menuBar.add(menu);
menuBar.add(help);
menuBar.setBackground(backgruond);
setJMenuBar(menuBar);
panel= newJPanel();
panel.setLayout(new GridLayout(4, 4));
add(panel);
setTitle("Loading...");
listener= newGameListener(buttons);for (int i = 0; i < 16; i++) {if (i == 15)
buttons[i]= new JButton(" ");elsebuttons[i]= new JButton("" + (i + 1));
buttons[i].setBackground(backgruond);
buttons[i].setForeground(foreground);
buttons[i].setBorder(newLineBorder(Color.GRAY));
buttons[i].setFont(new Font("Consolas", Font.PLAIN, 40));
buttons[i].addActionListener(listener);
panel.add(buttons[i]);
}
gameOn();
validate();
}/*** 初始话第一次游戏,并有动态初始化效果*/
public voidgameOn() {for (int i = 0; i < 16; i++)
buttons[i].setEnabled(false);
menu.setEnabled(false);
help.setEnabled(false);
Random random= newRandom();int d[] = { -4, 1, -1, 4};int p = 15;for (int i = 0; i < 1000; i++) { //打乱的次数
int tmp = random.nextInt(4);int next = p +d[tmp];if (p % 4 == 0 && next % 4 == 3 || p % 4 == 3 && next % 4 == 0)continue;if (next >= 0 && next < 16) {
String s=buttons[p].getText();
buttons[p].setText(buttons[next].getText());
buttons[next].setText(s);
p=next;try{
Thread.sleep(1);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
judge();for (int i = 0; i < 16; i++)
buttons[i].setEnabled(true);
menu.setEnabled(true);
help.setEnabled(true);
}/*** 重新开始游戏的初始化,与第一次游戏使用的初始化方式不同*/
public voidinit() {for (int i = 0; i < 16; i++)
buttons[i].setEnabled(false);
Random random= newRandom();boolean flag[] = new boolean[16];for (int i = 0; i < 16; i++) {int tmp = random.nextInt(16);while(flag[tmp])
tmp= random.nextInt(16);if (tmp == 15)
buttons[i].setText(" ");elsebuttons[i].setText("" + (tmp + 1));
flag[tmp]= true;
}
judge();for (int i = 0; i < 16; i++)
buttons[i].setEnabled(true);
}/*** 判断生成的序列是否可行,如果不可行交换任意相邻两个按钮的文本即可*/
public voidjudge() {int sum = 0;int a[] = new int[16];for (int i = 0; i < 16; i++) {
String s=buttons[i].getText();if (s.equals(" "))
a[i]= 0;elsea[i]=Integer.parseInt(s);
}for (int i = 0; i < 15; i++) {if (a[i] == 0) {
sum+= i % 4;
sum+= i / 4;continue;
}for (int j = i + 1; j < 16; j++)if (a[i] >a[j])
sum++;
}if (sum % 2 == 0) {
String s= buttons[0].getText();
buttons[0].setText(buttons[1].getText());
buttons[1].setText(s);
}
}
}