發新話題

誠徵JAVA高手!! 謝謝

誠徵JAVA高手!! 謝謝

有JAVA高手可以幫我解釋這個程式的主程式進入點在哪及分析程式內容嗎??謝謝!!
import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class JMemoryGame extends JFrame implements Runnable
{
        private ButtonHandler bh = new ButtonHandler();//功能表單事件
        private JMenuBar jmb;
        private final int ROW = 4;
        private final int COL = 4;
        private final int LOOK_SEC = 4; //設定一開始可看幾秒
        private final int ADD = 1000, DECR = 100;//得分1000,扣分100
        private final int SEC = 1; //設定翻開的牌不相同時間隔秒數會蓋回去
        private int imgH = 0,imgW =0,score = 0; //imgH圖高,imgW圖寬,score分數
        private JMenu game = new JMenu("遊戲"),about = new JMenu("關於");;
        private JMenuItem [] gm = new JMenuItem[3];//遊戲
        private JMenuItem [] abo = new JMenuItem[2];//關於
        private JButton [] imgBtn = new JButton[ROW * COL]; //按鈕
        private ImageIcon [] img = new ImageIcon[ROW * COL]; //存放圖物件
        private JPanel jpl = new JPanel(new GridLayout(4,4,0,0));
        private JLabel jl = new JLabel("SCORE : 0");
        private int [] m;//存放每次重新玩的圖片順序
        private int [] twoImg = {-1,-1}; //記錄目前翻開的兩張圖編號
        private int [] btnIndex = {-1,-1}; //記錄被翻開兩張圖的按鈕位置
        private boolean isChange = false; //用來切換存放兩張圖順序
        private boolean isStart = false; //是否開始
        private boolean [] imgShow = new boolean[8]; //記錄已配對成功過的圖
        private boolean [] btnDown = new boolean [16]; //記錄被按過的按鈕
        
        public JMemoryGame()
        {
                super("記憶圖遊戲");
                Container c = getContentPane();
                c = this.getContentPane();
                jmb = new JMenuBar();
                this.setJMenuBar(jmb); //加入工具列
               
                //初始化所有按鈕上的圖,預設為不可以按
                for(int i = 0; i < img.length; i++)
                {
                        img = new ImageIcon(getClass().getResource("images/p0.jpg"));
                        imgBtn = new JButton(img);
                        imgBtn.addActionListener(bh);
                        imgBtn.setEnabled(false);
                        jpl.add(imgBtn);
                        jpl.add(jl);
                }
               
                c.add(jpl,BorderLayout.CENTER);
                c.add(jl,BorderLayout.SOUTH); //將分數label放到最下面
                //遊戲的選擇項目
                jmb.add(game);
                gm[0] = new JMenuItem("開始遊戲");
                gm[1] = new JMenuItem("重新遊戲");
                gm[1].setEnabled(false);
                gm[2] = new JMenuItem("離開遊戲");
                game.add(gm[0]);
                game.add(gm[1]);
                game.addSeparator();
                game.add(gm[2]);
               
                //關於的選擇項目
                jmb.add(about);
                abo[0] = new JMenuItem("遊戲說明");
                abo[1] = new JMenuItem("作者");
                about.add(abo[0]);
                about.add(abo[1]);
                              
                //設定視窗
                    imgH = img[0].getIconHeight() * ROW; //取得圖片高度
                    imgW = img[0].getIconWidth() * COL;  //取得圖片寬度
                setSize(imgW,imgH);
                setLocation(200,100);
                setResizable(false);//視窗放大按鈕無效
                setVisible(true);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        
                //註冊功能表單傾聽者
                for(int m=0;m<gm.length;m++)
                        gm[m].addActionListener(bh);
                abo[0].addActionListener(bh);
                abo[1].addActionListener(bh);            
        }
        
        
        //功能表單事件處理
        private class ButtonHandler implements  ActionListener
        {
               
            public void actionPerformed(ActionEvent ae)
            {
                    //按鈕事件
                for(int i = 0; i < img.length; i++)
                {
                        if(ae.getSource() == imgBtn)
                        {
                                checkIsRight(i,imgIndex(m));
                                break;
                        }
                }
                       
                if(ae.getSource() == gm[0]) //開始遊戲
                {
                        replay();
                }
                else if(ae.getSource() == gm[1]) //重新遊戲
                {
                        replay();
                }
                else if(ae.getSource() == gm[2]) //結束遊戲
                {
                        System.exit(0);
                }
                else if(ae.getSource() == abo[0]) //關於
                {
                        JOptionPane.showMessageDialog(null,
                        "1.圖片為" + ROW + "乘" + COL +",共" + (ROW * COL) + "張圖\n" +
                    "2.一開始會讓玩家看" + LOOK_SEC + "秒記圖片\n"+
                    "3.翻錯圖片時,錯誤圖片會停留" + SEC + "秒讓玩家記\n"+
                    "4.猜對得" + ADD + "分,猜錯扣" + DECR + "\n" +
                    "5.分數顯示在左下方" ,
                        "遊戲說明如下:",
                        JOptionPane.INFORMATION_MESSAGE);
                }
                else if(ae.getSource() == abo[1]) //作者
                {
                         JOptionPane.showMessageDialog(null,
                         "        程式設計:吉他手\n"+
                     "http://blog.xuite.net/ray00000test/blog" ,
                     "作者",
                     JOptionPane.INFORMATION_MESSAGE);
                }
            }
        }
        
        //回傳一個存放1~N數值亂數陣列
        private int [] rand(int N)
        {
                int temp [] = new int[N];
               
                for(int i = 0; i < N; i++)
                {
                        temp = i;
                }
            for(int i = 0; i < N; i++)
            {
                    int j = (int) (Math.random() * N);
                    int tmp = temp;
                    temp = temp[j];
                    temp[j] = tmp;
            }
                return temp;
        }
        
        //將記錄的圖片索引值0~15轉換為1~8
        private int imgIndex(int n)
        {
                return ((n/2)+1);
        }
        
        //開始(重玩)遊戲
        private void replay()
        {
                gm[0].setEnabled(false);
                gm[1].setEnabled(true);
                m = rand(16); //取得按鈕下次重排的圖案順序
               
            //設定所有圖片為可以翻狀態
                for(int i = 0; i < img.length; i++)
                {
                        imgBtn.setEnabled(true);
                        imgBtn.setIcon(new ImageIcon(getClass().getResource("images/p" + imgIndex(m) + ".jpg")));
                }
               
                //清除記錄兩張翻開圖片按鈕與位置
                twoImg[0] = twoImg[1] = btnIndex[0] = btnIndex[1] = -1;
                isChange = false; //重設翻牌順序
                score = 0; //分數歸零
                jl.setText("SCORE : " + score); //更新顯示分數
                isStart = false;
               
                new Thread(new Runnable()
                {
                        public void run()
                        {
                                try{
                                 Thread.sleep(LOOK_SEC * 1000);
                         }catch(InterruptedException e){}
                         //將圖清改為預設圖,並設定無法按按鍵
                    for(int i = 0; i < img.length; i++)
                    {
                            img = new ImageIcon(getClass().getResource("images/p0.jpg"));
                            imgBtn.setIcon(img);
                            btnDown = false; //將記錄過的按鈕清除
                    }
                    isStart = true;
                        }
                }).start();
               
            //清除上局存放配對成功的圖片位置
            for(int i = 0; i < imgShow.length; i++)
                    imgShow = false;
        }
        
        //檢查是目前兩張圖是否配對
        private void checkIsRight(int btnN, int jpgNum)
        {
                if(!isStart) return; //判斷是否已讓玩家看完圖片排列,再開始
                if(btnDown[btnN]) return;//如果按下的圖片已翻開,就離開method
                btnDown[btnN] = true; //表示此按鈕已翻開狀態
                       imgBtn[btnN].setIcon(new ImageIcon(getClass().getResource("images/p" + jpgNum + ".jpg")));                  
                      
                       //記錄上張與目前圖片編號、按鈕位置twoImg[1]是上一張,twoImg[0]是目前                                     
                int temp = twoImg[0];
                int btnTemp = btnIndex[0];
                twoImg[0] = jpgNum;
                btnIndex[0] = btnN;
                twoImg[1] = temp;
                btnIndex[1] = btnTemp;
            
            if(isChange)
            {
                    if(imgShow[jpgNum-1]) return; //若已配對成功
                     if(twoImg[1] == twoImg[0])
                        {
                                imgShow[jpgNum-1] = true; //記錄已配對的圖片索引值
                                twoImg[1] = -1;
                                btnIndex[1] = -1;
                                isChange = false;
                                score += ADD; //配對成功分數增加
                                jl.setText("SCORE : " + score);
                                return;
                        }
                    
                     //設定翻開兩張圖片時,其他圖片不能翻
                     for(int i = 0; i < btnDown.length; i++)
                             if(!btnDown) imgBtn.setEnabled(false);
                    
                     new Thread(this).start();
                }            
                isChange = !isChange;
        }
        
        public void run ()
        {
                 try{
                         Thread.sleep(SEC * 1000);
                 }catch(InterruptedException e){}
                
                    //蓋住原本翻開的圖片               
                    btnDown[btnIndex[0]] = false;
                    btnDown[btnIndex[1]] = false;
                       imgBtn[btnIndex[0]].setIcon(new ImageIcon(getClass().getResource("images/p0.jpg")));
                       imgBtn[btnIndex[1]].setIcon(new ImageIcon(getClass().getResource("images/p0.jpg")));
                      
                       //設定蓋回兩張翻開圖片時,其他圖片可以回覆可以翻的狀態
                       for(int i = 0; i < btnDown.length; i++)
                         if(!btnDown) imgBtn.setEnabled(true);
                      
                       score -= DECR; //猜錯扣分
                        jl.setText("SCORE : " + score);
        }
        
        public static void main(String [] args)
        {
                new JMemoryGame();
        }
}

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。