誠徵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();
}
}