贪吃蛇系列之八——我是吃货我自豪

        在上一个项目中,我们已经把食物绘制在我们的游戏界面上了,那么在这次的项目中,我们就来把这个食物吃掉。好了,还是先来看代码:


        /**
	 * 判断蛇有没有吃到食物的方法
	 * @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

猜你喜欢

转载自my.oschina.net/u/554627/blog/99116
今日推荐