教你用Java實現貪吃蛇小遊戲(附完整源碼)

java那些事2018-12-15 12:44:56


今天就帶大家從零開始來完成這個小遊戲,完成的方式也是一步一步的添加功能這樣的方式來實現。


第一步完成的功能:寫一個界面

大家見到的貪吃蛇小遊戲,界面肯定是少不了的。因此,第一步就是寫一個小界面。

實現代碼如下:

第二步完成的功能:在界面上畫成一格一格的

我們見過的,是有一個格子一個格子構成,然後蛇在這個裡面運動。

重寫paint,單元格就是橫著畫幾條線豎著畫幾條線即可。

代碼如下:

效果如下:

第三步完成的功能:建立另外的線程來控制重畫

由於,蛇的運動就是改變蛇所在的位置,然後進行重畫,就是我們所看到的運動。因此,在這裡,我們單獨用一個線程來控制重畫。

1、MyPaintThread類,實現了Runnable接口

2、在SnakeFrame的launchFrame方法中添加代碼:new Thread(new MyPaintThread()).start();即可。

完成功能:利用雙緩衝來解決閃爍的問題

第四步完成的功能:在界面上畫一個蛇出來

貪吃蛇遊戲中的蛇就是用一系列的點來表示,這裡我們來模擬一個鏈表。鏈表上的每個元素代表一個節點。

首先,我們先新建一個Node類來表示構成蛇的節點,用面向對象的思想,發現,這個類應該有如下的屬性和方法:

1、位置

2、大小,即長度、寬度

3、方向

4、構造方法

5、draw方法

Node類的代碼如下:

Direction是一個enum,具體如下:

而在Snake類中,用面向對象的思維,可以發現,Snake類中應該有如下的屬性和方法

1、頭結點

2、尾結點

3、構造函數

3、draw方法

具體代碼如下:

在SnakeFrame類中new一個Snake對象,然後調用Snake對象的draw方法即可。

效果如下:

第五步完成的功能:通過鍵盤控制蛇的上下左右移動

首先想到的是這樣:在Snake類中添加一個keyPressed方法,然後在SnakeFrame的鍵盤事件中調用Snake對象的keyPressed方法。

注意:蛇的移動是通過在單元格,在尾部刪除一個單元格這樣的思想來實現。

具體如下:

Snake類中添加一個keyPressed方法,主要是根據鍵盤的上下左右鍵來確定蛇的頭結點的方向,然後move方法再根據頭結點的方向來在頭部添加一個單元格。

這樣就實現了通過鍵盤來實現蛇的移動。

完成的功能:蛇吃蛋

首先我們新建一個蛋Egg的類。

類的屬性和方法有:

1、位置、大小

2、構造方法

3、draw方法

4、getRect方法:用於碰撞檢測

5、reAppear方法:用於重新產生蛋的方法

代碼如下:

蛇吃蛋,怎麼樣才能判斷蛇吃到蛋了呢,這就需要用到碰撞檢測了。

這裡我們在Snake類中添加一個eatEgg方法。當蛇吃到蛋之後,就需要將蛇的長度+1,這裡處理的是在蛇的頭部添加一個節點,當蛋被吃掉之後,就需要再重新隨機產生一個蛋。

代碼如下:

public Rectangle getRect(){      
   return new Rectangle(head.col*BLOCK_WIDTH, head.row*BLOCK_HEIGHT, BLOCK_WIDTH, BLOCK_HEIGHT);
    }
    public boolean eatEgg(Egg egg){
          if(this.getRect().intersects(egg.getRect())){
            addNodeInHead();
            egg.reAppear();        
            return true;
        }      
        else{            
         return false;
        }
    }

以上就完成了蛇吃蛋的功能。

完成的功能:添加邊界處理

在我們熟悉的貪吃蛇遊戲中,我們一般都知道,當蛇撞到牆或者是撞到自己身體的某一部分,則遊戲就結束。下面我們就來實現這一功能。

在Snake類中,添加checkDead方法

如果蛇撞牆或是撞到自己本身的某一個部分。則調用SnakeFrame類中的gameOver()方法來進行一定的處理。

本遊戲的處理方法為:通過設置一個boolean 變量,來停止遊戲並提示相關信息。

具體代碼如下:

以上就完成了蛇是否撞牆或是撞到自身一部分的功能。

小結

以上基本上實現了貪吃蛇的基本功能。剩下的一些功能不再介紹,例如:添加得分記錄、通過鍵盤某按鍵來控制遊戲的停止、重新開始、再來一局等。

以上的功能雖然沒有介紹,但是在代碼中,我有實現這些相應的功能。

推薦程序員必備微信號 


程序員內參
微信號:

programmer0001



推薦理由:
在這裡,我們分享程序員相關技術,職場生活,行業熱點資訊。不定期還會分享IT趣文和趣圖。這裡屬於我們程序員自己的生活,工作和娛樂空間。


 ▼長按下方↓↓↓二維碼識別關注

完整代碼點閱讀原文獲取

閱讀原文

TAGS: