手把手帶你用Java打造一款對對碰遊戲(下篇)

2021-01-15 51CTO

上篇文章介紹了對對碰遊戲的理論部分和介紹了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】

點讚 0

相關焦點

  • 手把手帶你用Java打造一款對對碰遊戲之一
    一、項目背景隨著移動網際網路技術的快速發展,智慧型手機、智能平板的興起和不斷的普及,我國移動遊戲行業迅速發展,在遊戲產業中佔據舉足輕重的地位。對對碰遊戲是一款經典的消除類遊戲,玩家只要點擊圖案來使圖案之間互換位置,連成3個或3個以上圖案來消除,得到相應的分數。二、項目目標設計一款基於JAVA的遊戲,顯示64 (8*8 )個動物圖片,遊戲開始時,進入100s倒數,用戶點擊相應的動物圖片,如果有三個或以上相同,則成功消除,並每個得10分。
  • 手把手教你用Java打造一款簡單故事書(下篇)
    一、項目背景隨著移動網際網路的發展,電子版的書成為現在主流,針對用戶的需求,有的放矢地呈現給用戶,閱讀電子版書,提高他們的學習效率。二、項目目標1.實現美觀的界面。3.java讀取txt文件,簡化代碼。三、項目實施首先回顧上一節的手把手教你用Java打造一款簡單故事書(上篇),完成界面的窗口、菜單欄、上下頁的按鈕,效果如下圖所示。接下來,小編帶大家完成剩下的功能,具體的實現步驟如下。
  • 【對對碰】全職獵人 VS 海賊王
    兩款「粉絲遊戲」實際表現究竟如何,本期對對碰將展現他們之間的巔峰較量。關於原作《全職獵人》的作者雖然在連載的16年間歷經各種起伏,獲得了一個「休刊王」的稱號,但不影響其每次復刊,都會在都動漫和娛樂業掀起一股新的熱潮,究其原因,獨特的風格是他強大的號召力。注重還原度的精細打造
  • 最好用的5款雲遊戲平臺匯總 5款好用免費的雲遊戲平臺推薦
    ,依靠基本的視頻解壓能力就可以玩啦,十分方便快捷,那有什麼好用的雲遊戲平臺可以使用呢?九遊小編帶你來... 雲遊戲平臺現在越來越受到小夥伴們的喜愛了,因為它可以讓我們的手機即使沒有任何高端處理器和顯卡的情況下,依靠基本的視頻解壓能力就可以玩啦,十分方便快捷,那有什麼好用的雲遊戲平臺可以使用呢?
  • 推薦幾款可以直接在手機上編程的app(包含Java、C、Python等)
    app,分別是:1.java和Android:AIDE集成開發環境。大部分都不需要root,可以直接編寫程序並運行,下面我簡單介紹一下這3個app的安裝和簡單使用,主要內容如下:一.AIDE集成開發環境:這個主要是用來寫java代碼(創建工程、寫小遊戲等),當然也可以寫c++代碼,只不過需要安裝對應的插件才行,自帶自動補全的功能,界面乾淨、整潔,使用起來不錯,下面我介紹一下這個app的安裝和簡單使用:
  • 盤點60 款最讓人望眼欲穿的遊戲(下篇)
    《生化變異》起,這款遊戲就已經奪取了我的注意 —— 起初是因為它那奇特的題材設定:一款末世後主題,帶有功夫元素的動物寓言?總之,對於這款第三人稱(或者說地第三「動物」稱)視角的動作遊戲,我已經等不及要上「爪」一試了。
  • FC經典遊戲《松鼠大作戰》,一款轉坑隊友的遊戲
    遊戲延用動畫片中兩隻可愛的花慄鼠Chip and Dale(奇奇和蒂蒂),遊戲劇情是從尋找小貓咪的委託任務開始,到擺脫肥貓陷阱與其一決高下為故事內容。既可單人玩又可雙人對戰,可互助又可互攻,流暢度,創造力與可玩性均為同類遊戲中的領軍者。
  • 玩遊戲怎麼能賺錢 手把手教你在家打遊戲賺錢
    玩遊戲怎麼能賺錢 手把手教你在家打遊戲賺錢 來源:www.18183.com作者:小蝦時間:2020-12-17 新出的紅包版遊戲,下面這些遊戲都是真實可以到賺錢的,打怪升級就能爆紅包
  • 韓國最會化妝的妹紙樸惠敏 手把手教你打造"派對女王"妝
    韓國最會化妝的妹紙——樸惠敏 (Pony) ,手把手教你打造這款十足「女王範」的大氣場妝容,一起來學學吧!樸惠敏 (Pony) 手把手教你化彩妝眉妝:先用眉刷將修理好的美貌梳理整齊樸惠敏 (Pony) 手把手教你化彩妝眼妝:步驟一:
  • 這款消消樂遊戲有點特別,夏日解壓必備
    今天向大家介紹的是寶可夢正版手遊《寶可夢咖啡店》,《寶可夢咖啡店》是一款休閒益智類手遊,玩家化身咖啡店店長,與寶可夢一起製作料理和飲品,來款待到店的寶可夢顧客,遊戲畫風治癒,音樂休閒解壓,不論是誰都能輕鬆愉悅地享受這款遊戲的樂趣,在工作繁忙的盛夏,你也一定需要這樣一款遊戲讓你在下班之餘充分放鬆自己
  • 北京中天浩峰科技有限公司:播刻傳媒手把手帶你做網紅直播!
    北京中天浩峰科技有限公司:播刻傳媒手把手帶你做網紅直播!現在,打開快手或者抖音這樣的短視頻平臺,都會有很多網紅直播帶貨,真人直播,接地氣,非常吸引人,對於很少網購的人都難以把控住錢包。換句話說,直播帶貨真的很賺錢,一天的收入是普通工薪階層的幾倍甚至更多,想做直播帶貨嗎?播刻傳媒專業平臺,手把手打造帶貨達人,讓你快速成為網紅直播。
  • Game Informer 盤點:60 款最讓人望眼欲穿的遊戲(下篇)
    《生化變異》起,這款遊戲就已經奪取了我的注意 —— 起初是因為它那奇特的題材設定:一款末世後主題,帶有功夫元素的動物寓言?而這也會改變你角色所能使用的特異功能。畢竟,這款遊戲一如其名,其核心的玩法閉環就在於你如何改變自己的基因構造與相應能力。被困在一個場景解謎中了嗎?興許重組下自己的 DNA 結構就能柳暗花明。總之,對於這款第三人稱(或者說地第三「動物」稱)視角的動作遊戲,我已經等不及要上「爪」一試了。—— Jeff Cork
  • 手把手教你10分鐘做出潛水艇大挑戰
    最近某應用上的潛水艇遊戲超級火,各路美女明星們玩得不亦樂乎!儘管這款遊戲畫面很簡單、玩法很單一,依然無法阻擋大家的熱情,不斷挑戰更高的記錄。隨著遊戲的爆火,相信它的開發者也會得到滿意的收入。如果我說,就算你從來沒有接觸過遊戲開發,不懂編程、也不懂美工,但是10分鐘就能做出潛水艇這樣的遊戲,你一定不會相信吧?今天,7夜就帶你手把手做一個這樣的小遊戲。
  • PS4玩家都有哪些遊戲值得一玩?這款遊戲的劇情絕對讓你滿意
    如龍0如龍系列的遊戲一直都深受玩家們的好評,在PS4上有很多部作品老狼也都有玩過,這款遊戲系列有的人喜歡,有的人不喜歡,對於老狼而言,還是一款非常值得推薦的遊戲,如龍,臺灣的翻譯叫做人中之龍,而老狼最喜歡的一部作品,就是如龍0。
  • 手把手教你用 KODI tMM 打造家庭觀影系統
    期間也利用 docker 安裝了 Jellyfin 打造影音伺服器的部分,不過在電視上使用 Jellyfin 的體驗還是不太理想,Jellyfin 自帶的刮削效果也不是特別滿意。這次就分享下自己用 KODI+ tMM(tinyMediaManager),為了方便我用電腦版的 KODI 進行截圖/演示,實際電視/盒子/平板等設備與 Win 版本差別不大,不過需要注意的是由於國內很多智能電視系統是基於老版本 Android 開發的,新版本 Kodi 可能存在不兼容現象,大家可以嘗試換用老版本 KODI 來解決這個問題。
  • 爆火的《APEX英雄》你還沒玩? 手把手教你遊戲註冊與下載
    遊久電競2月12日訊,相信大家對最近爆火的一款遊戲《APEX英雄》都有所耳聞了。
  • 碧藍航線:手把手打造皇家新寵SSR黛朵 用這幾個裝備最合適
    碧藍航線:手把手打造皇家新寵SSR黛朵 用這幾個裝備最合適 碧藍航線近期新實裝的SSR艦娘黛朵,
  • GitHub 上那些值得一試的 Java 開源庫
    我一直使用JAVA來寫後端應用,平時也會關注一些國外技術大牛的博客(來自Tapki、DZone、Google Developer等技術博客),從而注意到了一些新的而且很有意思Java開源庫,它們有些能給你的項目帶來幫助,有些是以遊戲的形式幫你提高Java的編程水平,而另一些則能夠幫助你識別JAVA程序中的常見問題 。
  • 學會MC的指令感覺就能做遊戲?別天真了,想做遊戲認真學編程
    因此MC的指令說起來也就那麼一回事,在遊戲裡面玩起來絕對可以,但是想要拿來製作一款獨立遊戲,就顯得有些乏力了。如果你想要去製作MC的mod模組啥的,考慮 forge (嚴禁拼成 forget)。這些都是圍繞MC進行的周邊開發,但如果你想要涉及獨立遊戲的製作的話,那麼你就要先去了解一款遊戲製作的根本,也就是遊戲引擎。遊戲引擎是已經已編寫好的可編輯電腦遊戲系統或者一些交互式實時圖像應用程式的核心組件,提供各種編寫遊戲所需的各種工具,任何一款遊戲都有著屬於自己的遊戲引擎,也是以此為基礎進行開發的。
  • 手把手教你買Switch遊戲,換區和多帳號竟有這麼大區別
    手把手教你買Switch遊戲,換區和多帳號竟有這麼大區別 自從任天堂宣布由騰訊代理國行版Switch之後,這款任天堂本時代最引以為傲的主機