/** * 判斷蛇有沒有吃到食物的方法 * @param food 食物對象 * @return 若是蛇吃到食物則返回true,不然返回false */ public boolean isEatFood(){ Body head = snakeBody.getFirst(); Food food = gameView.getFood(); if(head.x == food.getX() && head.y == food.getY()){ return true; } return false; } /** * 蛇吃掉食物的方法 */ public void eatFood(){ //讓原來的食物消失,而且產生一個新的食物 gameView.setFood(new Food(this)); }咱們爲了完成蛇吃掉食物的邏輯,因而就在Snake類中添加了兩個方法,就是上面的兩個方法。isEatFood呢咱們是用來判斷蛇是否是吃到了食物的方法,我想其中的邏輯你們看一眼應該就能懂。eatFood方法呢咱們是來處理蛇碰到了食物以後真正把食物吃下去的邏輯。在這裏呢,你們發現了,我引用了一個新的對象,gameView。其實這個對象不難理解,就是咱們運行遊戲的窗口,或者更廣泛一點,叫作遊戲的運行環境。由於在這裏,咱們須要處理的食物對象實際上是咱們遊戲環境中的,所以咱們須要引進這個對象。爲此呢,咱們在構造蛇對象的時候對這個對象進行賦值,所以,咱們把Snake的構造方法稍做修改,代碼以下:
/** 遊戲的運行環境對象 */ private GameView gameView; /** * 初始化一條蛇 */ public Snake(GameView gameView){ this.gameView = gameView; //初始化蛇最開始前進的方向爲向右 direction = DIR_RIGHT; //咱們將蛇的第一節身體初始化在遊戲窗口的中央 int cellsInRow = GameView.WINDOW_WIDTH / BODY_SIZE; int cellsInCol = GameView.WINDOW_HEIGHT / BODY_SIZE; int startX = cellsInRow / 2 * BODY_SIZE; int startY = cellsInCol / 2 * BODY_SIZE; //初始化蛇的身體,即向body鏈表中添加數據,咱們初始化蛇的初始節點爲3個 for(int i = 0; i < 3; i++){ //逐個的計算出蛇的每個節點的位置 Body body = new Body(startX - i * BODY_SIZE, startY); snakeBody.add(body); } }若是咱們的代碼只寫到這,你會發現蛇碰到食物後食物是消失了,可是咱們的蛇卻沒有長長,所以咱們還須要來處理這個東西。在哪裏處理呢,答案就是Snake的move方法,因而咱們修改Snake的move方法以下:
/** * 蛇移動的方法 */ public void move(){ //1.去尾。這個很簡單,意思就是說去掉咱們snakeList的最後一個元素 if(isEatFood()){ eatFood(); } else { snakeBody.removeLast(); } //......下面的代碼沒有變 }關鍵就是咱們在蛇的move方法中加入了一個判斷,要讓蛇變長咱們就在蛇吃到食物的時候不要去尾就是了。