2013年12月3日 星期二

java打地鼠


一、設計心得


1.利用java的Button元件來進行遊戲的變化,首先以網格配置方式來填裝Button(建置n*n的地圖大小)。
2.匯入圖片及音效、背景音樂來增加遊戲樂趣(音效以AudioClip進行播放、圖片則以ImageIcon變化)。
3.設計TimeClock介面進行時間控制。
4.設計一Thread介面來進行圖片的更換及時間的減少。
5.定義命中的分數、打到炸彈的扣分、打中時鐘則加時間等規則來增加耐玩度。

二、遊戲DEMO


三、原始碼

1.HitMouse_Applet.java
import java.applet.AudioClip;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class HitMouse_Applet extends JApplet implements ActionListener,MouseListener{
    private Cursor cusRemondRelease;//自訂滑鼠圖案放開時
    private Cursor cusRemondPress;//自訂滑鼠圖案按下時
    Image RemondImgRelease = new ImageIcon(getClass().getResource("picture/hammer.png")).getImage();
    Image RemondImgPress = new ImageIcon(getClass().getResource("picture/hammerDown.png")).getImage();
    private JPanel jpNorth = new JPanel(new FlowLayout());
    private JPanel jpCenter = new JPanel();
    private JPanel jpSouth = new JPanel(new FlowLayout());
    private JButton jbStart = new JButton();
    private JButton jbQuestion = new JButton();
    private JButton jbGame[];//配置按鈕
    private JComboBox comMap = new JComboBox();
    private JLabel jlTime = new JLabel("剩餘時間:30秒");//時間倒數
    private JLabel jlScore = new JLabel();//分數
    private int iLattice = 5;//Width & Height
    private int iTime = 30*1000;//30秒
    private ImageIcon iConMouse = new ImageIcon(getClass().getResource("picture/Mouse.png"));//Mouse圖片
    private ImageIcon iConBomb = new ImageIcon(getClass().getResource("picture/Bomb.png"));//Bomb圖片
    private ImageIcon iConTime = new ImageIcon(getClass().getResource("picture/time.png"));//Bomb圖片
    private ImageIcon iConBombing = new ImageIcon(getClass().getResource("picture/Bombing.jpg"));//Bombing圖片
    private ImageIcon iConWin = new ImageIcon(getClass().getResource("picture/Winner.jpg"));
    private ImageIcon iConGood = new ImageIcon(getClass().getResource("picture/GoodJob.jpg"));
    private ImageIcon iConText = new ImageIcon(getClass().getResource("picture/Answer.png"));
    private TimeThread_Applet timethread = null;
    private int iScore = 0;//分數
    private Color c;//預設按鈕顏色
    private AudioClip bombAudio,hitAudio,backAudio,timeAudio;
    public void init(){
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = toolkit.getScreenSize();
        int screenHeight = (int) screenSize.getHeight();// 解析度長
        int screenWidth = (int) screenSize.getWidth();// 解析度寬        
        this.getContentPane().setBackground(Color.CYAN);
        this.setSize(800,600);
        this.setLocation(screenWidth / 2 - this.getWidth() / 2, screenHeight / 2
    -   this.getHeight() / 2);// 設定Frame置中         
        cusRemondRelease = this.getToolkit().createCustomCursor(RemondImgRelease, new Point(16,16), "Tand");//自訂滑鼠圖案
        this.setCursor(cusRemondRelease);
        getjpNorth();
        getjpCenter();
        getjpSouth();
        this.add(jpNorth,BorderLayout.NORTH);  
        this.add(jpCenter,BorderLayout.CENTER);
        this.add(jpSouth,BorderLayout.SOUTH);  
        bombAudio = getAudioClip(getCodeBase(), "audio/bomb.wav"); 
        hitAudio = getAudioClip(getCodeBase(), "audio/hit.wav"); 
        backAudio = getAudioClip(getCodeBase(), "audio/back.mid"); 
        timeAudio = getAudioClip(getCodeBase(), "audio/time.wav"); 
        this.setVisible(true);
    }
     private void getjpNorth() {
        jbStart.addActionListener(this);
        jbStart.setPreferredSize(new java.awt.Dimension(32, 32));
        jbStart.setIcon(new ImageIcon(getClass().getResource("picture/start.png")));
        jbQuestion.addActionListener(this);
        jbQuestion.setPreferredSize(new java.awt.Dimension(32, 32));
        jbQuestion.setIcon(new ImageIcon(getClass().getResource("picture/Question.png")));
        DefaultComboBoxModel com = new DefaultComboBoxModel();
        com.addElement("地圖一");
        com.addElement("地圖二");
        com.addElement("地圖三");
        comMap.setModel(com);
        comMap.addActionListener(this);
        jpNorth.add(comMap);     
        jpNorth.add(jbStart);
        jpNorth.add(jbQuestion);
    }
    private void getjpCenter() {               
        ButtonInit();      
    }
    private void ButtonInit() {
        jpCenter.removeAll();
        if (comMap.getSelectedIndex() == 0){
            iLattice = 5;
            c =Color.BLUE;
        }else if (comMap.getSelectedIndex() == 1){
            iLattice = 6;
            c =Color.YELLOW;
        }else if (comMap.getSelectedIndex() == 2){
            iLattice = 7;
            c =Color.WHITE;
        }
        jbGame = new JButton[iLattice*iLattice];
        jpCenter.setLayout(new GridLayout(iLattice,iLattice));
          for (int i = 0; i < iLattice*iLattice; i++) {
            jbGame[i] = new JButton();
            jbGame[i].setBackground(c); 
            jbGame[i].addMouseListener(this);
            jpCenter.add(jbGame[i]);
        }
          this.validate();
    }
    private void Check(JButton jb) {      
        for (int i = 0; i < jbGame.length; i++) {
            if (jb == jbGame[i]){
                int nowTime = getTimeThread().getTime();
                if (jb.getIcon() == iConMouse) {
                    hitAudio.play();
                    jbGame[i].setIcon(null);
                    jbGame[i].setText("Hit"); 
                    jbGame[i].setBackground(Color.red);
                    iScore += 10;
                }else if (jb.getIcon() == iConBomb){
                    bombAudio.play();
                    getTimeThread().setTime(nowTime - 4000);//打到炸彈-4秒
                    jbGame[i].setIcon(iConBombing);
                    iScore -= 20;
                }else if (jb.getIcon() == iConTime){
                    timeAudio.play();
                    int addTime = (int)(Math.random()*3);
                    getTimeThread().setTime(nowTime + addTime*1000);//打到時鐘+0~2秒
                    jbGame[i].setIcon(null);
                    jbGame[i].setText("Time + " + addTime); 
                    jbGame[i].setBackground(Color.MAGENTA);
                }
                jlScore.setText("目前分數:" + (iScore));
            }        
        }
    }
    private void getjpSouth() {
        jpSouth.add(jlTime);
        jpSouth.add(jlScore);
    }    
    private void Start() {
        iScore = 0;
        jlScore.setText("目前分數:" + iScore);
        getTimeThread().setTime(iTime);
        getTimeThread().setStart();
        jbStart.setEnabled(false);
        comMap.setEnabled(false);
        Thread t = new Thread(getTimeThread());
        t.start();   
        backAudio.loop();
    }
     public void actionPerformed(ActionEvent e) {
        if (e.getSource() == jbStart) Start();
        else if (e.getSource() == comMap) ButtonInit();
        else if (e.getSource() == jbQuestion) Answer();
    }
    private TimeThread_Applet getTimeThread() {
        if (timethread == null) {
            timethread = new TimeThread_Applet();
            timethread.init(this);
        }
        return timethread;
    }//由TimeThread.java觸發
    public void setTime(String s){jlTime.setText("剩餘時間:" + s + "秒");}
    public void CreateRandom(String s){//由TimeThread.java觸發 
        int mouseElements = Math.abs(Integer.valueOf(s)%4);//產生0~3個目標物    
        int bombElements = Math.abs(Integer.valueOf(s)%7);//產生0~7個炸彈
        int timeElements = Math.abs((Integer.valueOf(s)%2));//產生0~1個時鐘
        int r;
        for (int i = 0; i < timeElements; i++) {//產生亂數
            r = (int) (Math.random()*iLattice*iLattice);       
            this.jbGame[r].setIcon(iConTime);//亂數產生Mouse圖片
        }
        for (int i = 0; i < mouseElements; i++) {//產生亂數
            r = (int) (Math.random()*iLattice*iLattice);       
            this.jbGame[r].setIcon(iConMouse);//亂數產生Mouse圖片
        }
        for (int i = 0; i < bombElements; i++) {
            r = (int) (Math.random()*iLattice*iLattice);
            this.jbGame[r].setIcon(iConBomb); //亂數產生Bomb圖片
        }
    }
    public void ClearIcon(){//由TimeThread.java觸發 
        for (int i = 0; i < iLattice*iLattice; i++) {
            this.jbGame[i].setIcon(null);//清除圖片
            this.jbGame[i].setText("");          
            this.jbGame[i].setBackground(c);
        }
    }
    public void GameOver(){//由TimeThread.java觸發 
        jbStart.setEnabled(true);
        comMap.setEnabled(true);
        if (iScore >= 500)
        JOptionPane.showMessageDialog(this, "你所得分數為:" + iScore + "\n非常厲害","得分",JOptionPane.INFORMATION_MESSAGE,iConWin);        
        else if (iScore >=300 && iScore < 500) 
        JOptionPane.showMessageDialog(this, "你所得分數為:" + iScore + "\n很有前途,再接再厲","得分",JOptionPane.INFORMATION_MESSAGE,iConGood);
        else if (iScore < 300) 
        JOptionPane.showMessageDialog(this, "你所得分數為:" + iScore + "\n要多加油囉!!!","得分",JOptionPane.INFORMATION_MESSAGE,iConBombing);        
        backAudio.stop();
    }    
    private void Answer(){
         JOptionPane.showMessageDialog(this, "", "說明", JOptionPane.INFORMATION_MESSAGE, iConText);
    }
    public void mouseClicked(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {
        cusRemondPress = this.getToolkit().createCustomCursor(RemondImgPress, new Point(16,16), "Tand");//自訂滑鼠圖案
        this.setCursor(cusRemondPress);  
        JButton jb = (JButton) e.getSource();
        Check(jb);   
    }
    public void mouseReleased(MouseEvent e) {
        cusRemondRelease = this.getToolkit().createCustomCursor(RemondImgRelease, new Point(16,16), "Tand");//自訂滑鼠圖案
        this.setCursor(cusRemondRelease);
    }
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}       
  
}
2.TimeThread_Applet.java
public class TimeThread_Applet implements java.lang.Runnable{
    private HitMouse_Applet hit = null;
    private TimeClock tc = null;  
    public void setStop(){this.tc.Stop();}
    public void setStart(){this.tc.Start();}
    public void setTime(int s){this.tc.setTime(s);}
    public int getTime(){return this.tc.getTimes();}
    public void init(HitMouse_Applet hit){
        this.hit = hit;
        tc = new TimeClock();
    }   
    public void run() {
        while (this.tc.isStop() == false){
            this.hit.CreateRandom(this.tc.getTime());
            this.tc.toDown();
            this.hit.setTime(this.tc.getTime());
            try {Thread.sleep(1000);}
            catch (InterruptedException ex) {System.out.println(ex.getMessage());}                  
            this.hit.ClearIcon();                                
         }
        hit.GameOver();
    }
}
3.TimeClock.java
public class TimeClock {
    private int t = 0;
    private boolean stop = false;
    public void setTime(int t){this.t = t;}//設定時間
    public String getTime(){return this.t/1000 + "";}//取得時間字串
    public int getTimes(){return t;}
    public boolean isStop(){return this.stop;}//確認是否停止
    public void Stop(){this.stop = true;}//停止
    public void Start(){this.stop = false;}//開始
    public void toDown(){      
        if (this.stop) return;
        if (t > 0){
            t -=1000;
        }else this.stop = true;
    }
}

沒有留言:

張貼留言