貪吃蛇系列之八——我是吃貨我自豪

        在上一個項目中,咱們已經把食物繪製在咱們的遊戲界面上了,那麼在此次的項目中,咱們就來把這個食物吃掉。好了,仍是先來看代碼:


        /**
	 * 判斷蛇有沒有吃到食物的方法
	 * @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
相關文章
相關標籤/搜索