【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
在上一个项目中,我们已经把食物绘制在我们的游戏界面上了,那么在这次的项目中,我们就来把这个食物吃掉。好了,还是先来看代码:
/**
* 判断蛇有没有吃到食物的方法
* @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方法中加入了一个判断,要让蛇变长我们就在蛇吃到食物的时候不要去尾就是了。
至此呢我们的这个版本就算大功告成了,运行试试看吧,我们的蛇已经可以吃掉食物了。在下一个版本中,我们就开始对游戏中的石头进行编码。好了,就到这吧,下个项目再见啦。
下面呢是从第一次项目到本次项目的源码: http://kuai.xunlei.com/d/Ae2cA3pyNczeUAQA93a
来源:oschina
链接:https://my.oschina.net/u/554627/blog/99116