/** * 判断蛇有没有吃到食物的方法 * @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方法中加入了一个判断,要让蛇变长咱们就在蛇吃到食物的时候不要去尾就是了。