貪吃蛇系列之九——石頭

        在上一次的項目中,咱們的蛇已經能夠吃食物了,而且在吃到食物以後能夠變長,那麼在本次的項目中,咱們將向遊戲中添加一個新的對象——石頭。仍是照舊,咱們先建立一個Stone類,放在咱們的com.gulang.snake.entity的包中。接着咱們就直接來看Stone類的代碼:

package com.gulang.snake.entity;

import java.awt.Color;
import java.awt.Graphics;

import com.gulang.snake.view.GameView;

/**
 * 石頭
 * @author jiladeyouxiang@qq.com
 *
 */
public class Stone {
	
	/** 石頭的大小 */
	private final static int SIZE = Snake.BODY_SIZE;
	
	/** 石頭繪製的橫座標 */
	private int x;
	/** 石頭繪製的縱座標 */
	private int y;
	
	/**
	 * 構造一個石頭對象
	 */
	public Stone(){
		//咱們在遊戲窗口的左下角生成一塊石頭
		x = 0;
		y = GameView.WINDOW_HEIGHT - SIZE;
	}
	
	/**
	 * 繪製石塊
	 * @param g
	 */
	public void drawMe(Graphics g){
		Color c = g.getColor();
		g.setColor(Color.GRAY);
		g.fill3DRect(x, y, SIZE, SIZE, true);
		g.setColor(c);
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}
	
}
        可以學習到這裏的您,我想這個類的意思已經不用我多作解釋了,我也就再也不解釋了。接着,咱們在Snake類中照舊添加兩個方法,代碼以下:
        /**
	 * 判斷蛇是否吃到了石頭
	 * @return		若是蛇吃到了石頭則返回true,不然返回false
	 */
	public boolean isEatStone(){
		Body head = snakeBody.getFirst();
		Stone stone = gameView.getStone();
		if(head.x == stone.getX() && head.y == stone.getY()){
			return true;
		}
		return false;
	}
	
	/**
	 * 蛇死亡的方法
	 */
	public void die(){
		gameView.gameOver();
	}
        這兩個方法呢,若是你已經理解了食物的邏輯,那這兩個類對你來講已然不是什麼大的問題。這兩個方法咱們在哪裏去調用呢?答案仍是在蛇的move()方法中,因而,咱們在蛇的move()方法前添加下面的代碼:
        //判斷蛇是否吃到了石頭
	if(isEatStone()){
		die();
	}
        讓蛇在每一次移動以前都去檢查是否撞到了石頭,撞到了就讓遊戲結束。
        下面呢,咱們說一下die()方法,如你們所見,咱們在蛇的die()方法中,調用了遊戲窗口方法的gameOver()方法,所以,咱們天然要去實現這個方法,代碼以下:
        /**
	 * 遊戲結束的方法
	 */
	public void gameOver(){
		//咱們在這裏讓玩家死亡以後馬上從新開始遊戲
		initGameData();
	}
        咱們在這裏處理遊戲結束的方式呢是讓遊戲從新開始,固然,這是咱們進行簡單的處理。這裏呢,爲了能夠不中止遊戲的主線程,咱們須要對initGameData()作一點修改,你們看下面的代碼:
        /**
	 * 初始化和遊戲相關的數據
	 */
	private void initGameData() {
		//構造蛇的對象
		snake = new Snake(this);
		//初始化食物對象
		food = new Food(snake);
		//構造石頭對象
		stone = new Stone();
		//初始化遊戲的主線程
		if(gameThread == null){
			gameThread = new GameThread(true);
		}
		//讓遊戲的主線程開始運行
		if(!gameThread.isAlive()) {
			gameThread.start();
		}
	}
        咱們主要就是實現了再重置遊戲數據的時候不影響遊戲主線程,也是很簡單,你們一眼就明白了。那麼到這裏,咱們這個版本的貪吃蛇就基本上完成了,運行看看吧,當蛇吃到石頭以後咱們的遊戲就會被重置。在下一個版本中,咱們將實現遊戲地圖的繪製,你們也看到了,在咱們這個版本中咱們的石頭只有一個,顯然這是不合理的嘛。因此,下個版本再見吧。
        下面是這個版本和以前版本的源代碼地址: http://kuai.xunlei.com/d/Ae2cAyx1YfjeUAQAa6e
相關文章
相關標籤/搜索