文件列表
2.主程序入口
3.1部分源代碼

package MineSweeper; import java.awt.BorderLayout; import java.awt.Font; import java.util.Enumeration; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.Timer; import javax.swing.UIManager; public class SartFrame extends JFrame{ private static final long serialVersionUID = -1585043387266273492L; private MineState mineState; // 記雷數 private MineField mineField; // 布置labble和雷數 private MineMenu mineMenu; private Timer timer; private Timers timers; /** * 游戲是否開始 */ private boolean isStart; JLabel jLabel_start = new JLabel(); // 開始圖片 public SartFrame() { // 改變系統默認字體 Font font = new Font("Dialog", Font.PLAIN, 12); Enumeration<Object> keys = UIManager.getDefaults().keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); Object value = UIManager.get(key); if (value instanceof javax.swing.plaf.FontUIResource) { UIManager.put(key, font); } } this.setTitle("掃雷"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); setIconImage(Tools.iicon); // 利用tools來做的作法 this.setResizable(false); // 這樣讓窗口不會可放大 // ..................狀態欄..................... mineState = new MineState(this); this.add(mineState, BorderLayout.NORTH); // ...................雷區...................... mineField = new MineField(this); this.add(mineField, BorderLayout.CENTER); jLabel_start.setIcon(Tools.start); this.add(jLabel_start, BorderLayout.CENTER); // ....................菜單欄................ mineMenu = new MineMenu(this); this.setJMenuBar(mineMenu); // .....................時間................ Tools.time = 0; timers = new Timers(mineState); timer = new Timer(1000, timers); // ...................聲音................... // AudioClip s1=loadSound("alarm1.wav"); //AudioClip類的對象s1通過方法 loadSound()裝載聲音 // public AudioClip loadSound(String filename){ //返回一個AudioClip對象 // URL url=null; //因為newAudioClip()的參數為URL型 // try{ // url=new URL("file:"+filename); //指定文件,“file:"不能少 // } // catch(MalformedURLException e){ } // return Applet.newAudioClip(url); //通過newAudioClip( // )方法裝載聲音,此方法為JDK后添加的方法,太老的JDK里可能沒有 // } // // // // pack(); this.setVisible(true); } // 重新布局 public void restart() { this.remove(mineState); this.remove(mineField); this.remove(jLabel_start); // ..................狀態欄..................... mineState = new MineState(this); this.add(mineState, BorderLayout.NORTH); // ...................雷區...................... mineField = new MineField(this); this.add(mineField, BorderLayout.CENTER); // .....................時間................ Tools.time = 0; Timers timers = new Timers(mineState); timer = new Timer(1000, timers); pack(); validate();// 刷新窗體 } public static long getSerialversionuid() { return serialVersionUID; } public MineState getMineState() { return mineState; } public MineField getMineField() { return mineField; } public MineMenu getMineMenu() { return mineMenu; } public Timer getTimer() { return timer; } public Timers getTimers() { return timers; } public boolean isStart() { return isStart; } public void setStart(boolean isStart) { this.isStart = isStart; } public static void main(String[] args) { new SartFrame(); } }
About.java

package MineSweeper; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class About extends JDialog { private static final long serialVersionUID = 1L; private JTextField jTextField1,jTextField2,jTextField3; private JButton butyes,butno; SartFrame sartFrame; public About(SartFrame sartFrame) { this.sartFrame = sartFrame; this.setTitle(""); this.setLocationRelativeTo(null); this.setModal(true); this.setSize(new Dimension(200,200)); this.init(); this.setVisible(true); } private void init() { JPanel jPanel = new JPanel(); new JLabel(""); jTextField1=new JTextField(12); jTextField2=new JTextField(12); jTextField3=new JTextField(12); JLabel jLabelTotalx=new JLabel("行數:"); JLabel jLabelTotaly=new JLabel("列數:"); JLabel jLabelTotalMine=new JLabel("雷數:"); jPanel.add(jLabelTotalx); jPanel.add(jTextField1); jPanel.add(jLabelTotaly); jPanel.add(jTextField2); jPanel.add(jLabelTotalMine); jPanel.add(jTextField3); butyes = new JButton("確定"); butno = new JButton("取消"); jPanel.add(butyes); jPanel.add(butno); butyes.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { try { Tools.totalx=Integer.parseInt(jTextField1.getText()); Tools.totaly=Integer.parseInt(jTextField2.getText()); Tools.totalMine=Integer.parseInt(jTextField3.getText()); if(Tools.totalx>9&&Tools.totalx<30){ if(Tools.totaly>9&&Tools.totaly<30){ if(Tools.totalMine>=10&&Tools.totalMine<Tools.totalx*Tools.totaly*4/5){ sartFrame.restart(); About.this.dispose(); }else{ JOptionPane.showMessageDialog(null, "布雷有誤請重試!!!\n布雷數應少於總格子數!!!", "提示消息", JOptionPane.NO_OPTION); } }else { JOptionPane.showMessageDialog(null, "您輸入的列數有誤\n請重試!!!", "提示消息", JOptionPane.NO_OPTION); } }else { JOptionPane.showMessageDialog(null, "您輸入的行數有誤\n請重試!!!", "提示消息", JOptionPane.NO_OPTION); } } catch (Exception e2) { JOptionPane.showMessageDialog(null, "必須是數字類型", "提示消息", JOptionPane.NO_OPTION); return; } } }); butno.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { About.this.dispose(); } }); this.add(jPanel); } }