package com.gulang.snake.entity; import java.awt.Color; import java.awt.Graphics; import com.gulang.snake.view.GameView; /** * 石頭 * @author jiladeyouxiang@qq.com * */ public class Stone { /** 石頭的大小 */ private final static int SIZE = Snake.BODY_SIZE; /** 石頭繪製的橫座標 */ private int x; /** 石頭繪製的縱座標 */ private int y; /** * 構造一個石頭對象 */ public Stone(){ //咱們在遊戲窗口的左下角生成一塊石頭 x = 0; y = GameView.WINDOW_HEIGHT - SIZE; } /** * 繪製石塊 * @param g */ public void drawMe(Graphics g){ Color c = g.getColor(); g.setColor(Color.GRAY); g.fill3DRect(x, y, SIZE, SIZE, true); g.setColor(c); } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }可以學習到這裏的您,我想這個類的意思已經不用我多作解釋了,我也就再也不解釋了。接着,咱們在Snake類中照舊添加兩個方法,代碼以下:
/** * 判斷蛇是否吃到了石頭 * @return 若是蛇吃到了石頭則返回true,不然返回false */ public boolean isEatStone(){ Body head = snakeBody.getFirst(); Stone stone = gameView.getStone(); if(head.x == stone.getX() && head.y == stone.getY()){ return true; } return false; } /** * 蛇死亡的方法 */ public void die(){ gameView.gameOver(); }這兩個方法呢,若是你已經理解了食物的邏輯,那這兩個類對你來講已然不是什麼大的問題。這兩個方法咱們在哪裏去調用呢?答案仍是在蛇的move()方法中,因而,咱們在蛇的move()方法前添加下面的代碼:
//判斷蛇是否吃到了石頭 if(isEatStone()){ die(); }讓蛇在每一次移動以前都去檢查是否撞到了石頭,撞到了就讓遊戲結束。
/** * 遊戲結束的方法 */ public void gameOver(){ //咱們在這裏讓玩家死亡以後馬上從新開始遊戲 initGameData(); }咱們在這裏處理遊戲結束的方式呢是讓遊戲從新開始,固然,這是咱們進行簡單的處理。這裏呢,爲了能夠不中止遊戲的主線程,咱們須要對initGameData()作一點修改,你們看下面的代碼:
/** * 初始化和遊戲相關的數據 */ private void initGameData() { //構造蛇的對象 snake = new Snake(this); //初始化食物對象 food = new Food(snake); //構造石頭對象 stone = new Stone(); //初始化遊戲的主線程 if(gameThread == null){ gameThread = new GameThread(true); } //讓遊戲的主線程開始運行 if(!gameThread.isAlive()) { gameThread.start(); } }咱們主要就是實現了再重置遊戲數據的時候不影響遊戲主線程,也是很簡單,你們一眼就明白了。那麼到這裏,咱們這個版本的貪吃蛇就基本上完成了,運行看看吧,當蛇吃到石頭以後咱們的遊戲就會被重置。在下一個版本中,咱們將實現遊戲地圖的繪製,你們也看到了,在咱們這個版本中咱們的石頭只有一個,顯然這是不合理的嘛。因此,下個版本再見吧。