上篇文章介紹了對對碰遊戲的理論部分和介紹了JLabel、JButton、JPanel、ImageIcon、JTextField、JProgressBar等組件的基本使用,介紹了進度條(JProgressBar)常用的方法。今天小編繼續帶來進行具體的對對碰遊戲功能實現。
項目實施
在實現對對碰功能之前,回顧一下上一節我們主要完成了開始遊戲按鈕、分數、時間進度條、退出遊戲按鈕,8X8的動物矩陣的界面設計;
效果圖如下所示:
接下來,小編繼續帶大家完成遊戲功能,實現遊戲功能需要了解什麼是交換、消去、連鎖,在遊戲項目設定那裡有,在這就不重複寫了。
(一)添加DuiDuiPeng類的成員變量:定義一些變量
代碼如下所示:
private MyListener my = new MyListener(); private Timer timer; private int score=0;//總分 private int jindu=0; private int x1,y1;//第一次點擊按鈕的坐標位置 private int x2,y2;//第二次點擊按鈕的坐標位置 private final int EMPTY=-1;//為空的標記 private boolean isDoubleClicked=false;//是否點擊兩次
(二)在DuiDuiPeng構造函數裡給指定組件添加監聽
btn_start.addActionListener(my);//開始遊戲 btn_exit.addActionListener(my);//退出
(三)實現事件處理的函數體
當點擊開始按鈕時候,計時器啟動,設置進度條,8X8動物矩陣可以互換位置,當點擊退出按鈕,計時器停止,8X8動物矩陣不可以互換位置。
代碼如下所示:
private class MyListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==btn_start){//開始遊戲 btn_start.setEnabled(false); timer.start(); jindu=0; progress.setValue(jindu); score=0; text_score.setText(""+score); for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ button[i][j].setEnabled(true); } } do{initAllAnimals();//初始化動物矩陣 }while(searchAllAnimals(1));//searchAllAnimals 1為查詢連接 2為去除連接 } if(e.getSource()==btn_exit){//退出按鈕 timer.stop(); for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ button[i][j].setEnabled(false); } } dispose(); } for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ if(e.getSource()==button[i][j]){//動物按鈕 System.out.println((i+1)+"行"+(j+1)+"列"); swapAnimal(i,j);//實現交換圖片 } } } } }
(四)添加計時器
1.在DuiDuiPeng構造函數裡添加計時器;
代碼如下所示:
timer=new Timer(1000,new TimerListener());
2.進度條的值從0開始每秒加一,直到進度條的值達到100,計時器停止,不能位置交換動物頭像,進度條開始加的時候,開始按鈕是不能點擊的,當進度條達到100的時候,我們設置開始按鈕可以點擊狀態。
代碼如下所示:
private class TimerListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jindu++; progress.setValue(jindu); if(jindu==100){ timer.stop(); for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ button[i][j].setEnabled(false); } } btn_start.setEnabled(true); } } }
(五)初始化動物矩陣
代碼如下所示:
public void initAllAnimals(){//初始化動物矩陣 for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ int temp=(int)(Math.random()*7);//0-6 button[i][j].setIcon(icon[temp]); animal[i][j]=temp; } } }
(六)查詢是否有三個或以上相同連接的圖形,是返回true,不是返回false,判斷水平方向上是否有三個或以上相同連接的圖形,判斷垂直方向上是否有三個或以上相同連接的圖形
代碼較多,在此就不一一呈現了,文末有獲取代碼的方式。
(七)把三個或以上相同連接圖形設為EMPTY,判斷水平方向上是否有三個或以上相同連接的圖形,把水平方向上有三個或以上相同連接的圖形設為EMPTY。判斷垂直方向上是否有三個或以上相同連接的圖形,把垂直方向上有三個或以上相同連接的圖形設為EMPTY。
代碼較多,在此就不一一呈現了,文末有獲取代碼的方式。
(八)查詢所有動物頭像(1為查詢連接 2為去除連接)
代碼如下所示:
public boolean searchAllAnimals(int flag){ //1為查詢連接 2為去除連接 for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ if(flag==1){ if(isThreeLinked(i,j)){//查詢是否有三個或以上連接 return true; } }else if(flag==2){ removeThreeLined(i,j); } } } return false; }
(九)動物往下移動
代碼如下所示:
public void downAnimal(){//動物往下移動 int temp; for(int y=7;y>=0;y for(int x=0;x<8;x++){ if(animal[y][x]==EMPTY){ //找到一個空的位置 for(int k=y-1;k>=0;k if(animal[k][x]!=EMPTY){//找到上面一個非空的 temp=animal[k][x]; animal[k][x]=animal[y][x]; animal[y][x]=temp; break; } } } } } }
(十)重新顯示所有圖形
代碼如下所示:
public void showAllAnimals(){//重新顯示所有圖形 for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ button[i][j].setIcon(icon[animal[i][j]]); } } }
(十一)為空的重新生成隨機圖形
代碼如下所示:
public void updateAnimal(){//為空的重新生成隨機圖形 for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ if(animal[i][j]==EMPTY){ animal[i][j]=(int)(Math.random()*7); } } } }
(十二)交換位置
代碼如下所示
public void swapAnimal(int y,int x){//y為行,x為列 if((x>=0 && x<8)&&(y>=0 && y<8)){ if(!isDoubleClicked){ //第一次單擊 x1=x; y1=y; isDoubleClicked=true; System.out.println("第一次單擊的坐標=("+(y1+1)+","+(x1+1)+")"); }else{ x2=x; y2=y; isDoubleClicked=false; System.out.println("第一次單擊的坐標=("+(y2+1)+","+(x2+1)+")"); if((Math.abs(x2-x1)==1 &&(y1==y2)) ||(x1==x2)&&(Math.abs(y2-y1)==1)){//相鄰兩個按鈕 int temp; temp=animal[y2][x2];//交換 animal[y2][x2]=animal[y1][x1]; animal[y1][x1]=temp; if(isThreeLinked(y1,x1)|| isThreeLinked(y2,x2)){//有三個或以上連接 if(isThreeLinked(y1,x1)){ removeThreeLined(y1,x1); } if(isThreeLinked(y2,x2)){ removeThreeLined(y2,x2); } downAnimal();//動物往下移動 updateAnimal();//為空的重新生成隨機圖形 showAllAnimals();//重新顯示所有圖形 while(searchAllAnimals(1)){ searchAllAnimals(2);//去除連接 downAnimal(); updateAnimal(); showAllAnimals(); } }else{//沒有三個相鄰的 temp=animal[y2][x2];//交換 animal[y2][x2]=animal[y1][x1]; animal[y1][x1]=temp; } } } } }
完成事件處理效果圖如下圖所示:
五、總結
1.本文主要介紹了JLabel、JButton、JPanel、ImageIcon、JTextField、JProgressBar、Timer等組件的基本使用,以及相應的事件處理。
2.講解事件處理函數的添加,難點是運用理解構造函數、內部類的創建。完成事件處理開始遊戲按鈕,退出功能、實現進度條計時、初始化動物矩陣、在水平方向或垂直方向是否有三個或三個以上的相同連接圖形在、動物往下移、重新顯示所有圖形、為空的重新生成隨機圖形,最後交換位置。
3.這些代碼看起來比較複雜,但其實不是很難,寫的事件處理比較多,希望通過這個對對碰的一個小遊戲對你有所幫助!
【編輯推薦】
【責任編輯:
姜華TEL:(010)68476606】