亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? snake.java

?? 貪吃蛇JAVA源碼 以及相關的操作說明 希望大家能支持!
?? JAVA
字號:
package cn.itcast.snake.entities;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

import cn.itcast.snake.listener.SnakeListener;
import cn.itcast.snake.util.Global;

/**
 * 
 * 蛇<BR>
 * move()方法默認支持走到邊以后從另一邊出現<BR>
 * <BR>
 * 可以用setHeadColor(), 和 setBodyColor() 方法更改蛇頭或蛇身體的顏色<BR>
 * <BR>
 * 也可以通過覆蓋 drawHead(Graphics, int, int, int, int) 方法 改變蛇頭的顯示方式 和覆蓋
 * drawBody(Graphics, int, int, int, int) 方法 改變蛇身體的顯示方式<BR>
 * <BR>
 * 用內部類MoveDriver 驅動蛇定時移動<BR>
 * begin() 方法內部開啟一個新的線程驅動蛇定時移動, 調用這個方法的時候要注意<BR>
 * 
 * 蛇的身體的初始長度必須大于等于2
 * 
 * @version 1.0, 01/01/08
 * 
 * @author 湯陽光
 * 
 */
public class Snake {

	/**
	 * 方向上
	 */
	public static final int UP = 1;

	/**
	 * 方向下
	 */
	public static final int DOWN = -1;

	/**
	 * 方向左
	 */
	public static final int LEFT = 2;
	/**
	 * 方向右
	 */
	public static final int RIGHT = -2;

	/* 蛇(多個節點) */
	private LinkedList<Point> body = new LinkedList<Point>();

	/* 上一次的移動方向 */
	private int oldDirection;

	/* 下一步的方向(有效方向) */
	private int newDirection;

	/* 臨時存放蛇頭的坐標 */
	private Point head;

	/* 臨時存放蛇尾巴的坐標 */
	private Point tail;

	/* 移動速度 */
	private int speed;

	/* 生命, 是否活著 */
	private boolean live;

	/* 是否暫停 */
	private boolean pause;

	private Set<SnakeListener> listeners = new HashSet<SnakeListener>();

	public static final Color DEFAULT_HEAD_COLOR = new Color(0xcc0033);
	/* 蛇頭的顏色 */
	private Color headColor = DEFAULT_HEAD_COLOR;

	public static final Color DEFAULT_BODY_COLOR = new Color(0xcc0033);
	/* 蛇身體的顏色 */
	private Color bodyColor = DEFAULT_BODY_COLOR;

	/**
	 * 移動一步, 會忽略相反方向
	 */
	public void move() {
		/* 忽略相反方向 */
		if (oldDirection + newDirection != 0)
			oldDirection = newDirection;
		/* 把蛇尾巴拿出來重新設置坐標作為新蛇頭 */
		/* getLocation 將返回一個新的Point */
		/* tail把尾巴坐標保存下來, 吃到食物時再加上 */
		tail = (head = takeTail()).getLocation();
		/* 根據蛇頭的坐標再 上下左右 */
		head.setLocation(getHead());
		/* 根據方向讓蛇移動 */
		switch (oldDirection) {
		case UP:
			head.y--;
			/* 到邊上了可以從另一邊出現 */
			if (head.y < 0)
				head.y = Global.HEIGHT - 1;
			break;
		case DOWN:
			head.y++;
			/* 到邊上了可以從另一邊出現 */
			if (head.y == Global.HEIGHT)
				head.y = 0;
			break;
		case LEFT:
			head.x--;
			/* 到邊上了可以從另一邊出現 */
			if (head.x < 0)
				head.x = Global.WIDTH - 1;
			break;
		case RIGHT:
			head.x++;
			/* 到邊上了可以從另一邊出現 */
			if (head.x == Global.WIDTH)
				head.x = 0;
			break;
		}
		/* 添加到頭上去 */
		body.addFirst(head);
	}

	/**
	 * 一個內部類, 驅動蛇定時移動
	 * 
	 * @author 湯陽光
	 * 
	 */
	private class SnakeDriver implements Runnable {

		public void run() {
			// TODO Auto-generated method stub
			while (live) {
				if (!pause) {
					move();
					/* 觸發 ControllerListener 的狀態改變事件 */
					for (SnakeListener l : listeners)
						l.snakeMoved();
				}
				try {
					Thread.sleep(speed);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 在尾巴上增加一個節點
	 */
	public void eatFood() {
		/* 把上一次移動拿掉的節點再加上 */
		body.addLast(tail.getLocation());
		/* 觸發SnakeListener 的 snakeEatFood 事件 */
		for (SnakeListener l : listeners)
			l.snakeEatFood();
	}

	/**
	 * 改變方向
	 * 
	 * @param direction
	 */
	public void changeDirection(int direction) {
		this.newDirection = direction;
	}

	/**
	 * 得到蛇頭節點
	 * 
	 * @return
	 */
	public Point getHead() {
		/* 自己約定哪個是蛇頭 */
		return body.getFirst();
	}

	/**
	 * 拿掉蛇尾巴節點
	 * 
	 * @return
	 */
	public Point takeTail() {
		/* 去掉蛇尾巴 */
		return body.removeLast();
	}

	/**
	 * 得到蛇的長度
	 * 
	 * @return
	 */
	public int getLength() {
		return body.size();
	}

	/**
	 * 讓蛇開始運動<BR>
	 * 開啟一個新的線程
	 */
	public void begin() {
		new Thread(new SnakeDriver()).start();
	}

	/**
	 * 讓蛇復活, 并開始運動<BR>
	 * 將調用 begin() 方法
	 */
	public void reNew() {
		init();
		begin();
	}

	/**
	 * 初始化蛇的信息<BR>
	 * 長度, 位置, 方向, 速度, 生命和暫停狀態
	 */
	public void init() {
		body.clear();
		/* 初始化位置在中間 */
		int x = Global.WIDTH / 2 - Global.INIT_LENGTH / 2;
		int y = Global.HEIGHT / 2;
		for (int i = 0; i < Global.INIT_LENGTH; i++)
			this.body.addFirst(new Point(x++, y));
		/* 設置默認方向為向右 */
		oldDirection = newDirection = RIGHT;
		/* 初始化速度 */
		speed = Global.SPEED;
		/* 初始化生命和暫停狀態 */
		live = true;
		pause = false;
	}

	/**
	 * 是否吃到自己的身體<BR>
	 * 
	 * @return 蛇頭的坐標是否和自己的身體的某一個坐標重合
	 */
	public boolean isEatBody() {
		/* 要把蛇頭排除, body.get(0) 是蛇頭 */
		for (int i = 1; i < body.size(); i++)
			if (getHead().equals(body.get(i)))
				return true;
		return false;
	}

	/**
	 * 畫自己<BR>
	 * 將調用 drawHead(Graphics, int, int, int, int) 方法 和 drawBody(Graphics, int,
	 * int, int, int) 方法
	 * 
	 * @param g
	 */
	public void drawMe(Graphics g) {
		for (Point p : body) {
			/* 畫蛇身體 */
			g.setColor(bodyColor);
			drawBody(g, p.x * Global.CELL_WIDTH, p.y * Global.CELL_HEIGHT,
					Global.CELL_WIDTH, Global.CELL_HEIGHT);
		}
		/* 畫蛇頭 */
		g.setColor(headColor);
		drawHead(g, getHead().x * Global.CELL_WIDTH, getHead().y
				* Global.CELL_HEIGHT, Global.CELL_WIDTH, Global.CELL_HEIGHT);
	}

	/**
	 * 畫蛇頭, 可以覆蓋這個方法改變蛇頭的顯示
	 * 
	 * @param g
	 * @param x
	 *            像素坐標 x
	 * @param y
	 *            像素坐標 y
	 * @param width
	 *            寬度(單位:像素)
	 * @param height
	 *            高度(單位:像素)
	 */
	public void drawHead(Graphics g, int x, int y, int width, int height) {
		g.fill3DRect(x, y, width, height, true);
	}

	/**
	 * 畫蛇的一節身體, 可以覆蓋這個方法改變蛇的身體節點的顯示
	 * 
	 * @param g
	 * @param x
	 *            像素坐標 x
	 * @param y
	 *            像素坐標 y
	 * @param width
	 *            寬度(單位:像素)
	 * @param height
	 *            高度(單位:像素)
	 */
	public void drawBody(Graphics g, int x, int y, int width, int height) {
		g.fill3DRect(x, y, width, height, true);
	}

	/**
	 * 得到蛇頭的顏色
	 * 
	 * @return
	 */
	public Color getHeadColor() {
		return headColor;
	}

	/**
	 * 設置蛇頭的顏色
	 * 
	 * @param headColor
	 */
	public void setHeadColor(Color headColor) {
		this.headColor = headColor;
	}

	/**
	 * 得到蛇身體的顏色
	 * 
	 * @return
	 */
	public Color getBodyColor() {
		return bodyColor;
	}

	/**
	 * 設置蛇身體的顏色
	 * 
	 * @param bodyColor
	 */
	public void setBodyColor(Color bodyColor) {
		this.bodyColor = bodyColor;
	}

	/**
	 * 添加監聽器
	 * 
	 * @param l
	 */
	public synchronized void addSnakeListener(SnakeListener l) {
		if (l == null)
			return;
		this.listeners.add(l);
	}

	/**
	 * 移除監聽器
	 * 
	 * @param l
	 */
	public synchronized void removeSnakeListener(SnakeListener l) {
		if (l == null)
			return;
		this.listeners.remove(l);
	}

	/**
	 * 加速, 幅度為 Global 中設置的 SPEED_STEP <BR>
	 * 在有效的速度范圍之內(增加后速度大于 0毫秒/格)
	 */
	public void speedUp() {
		if (speed > Global.SPEED_STEP)
			speed -= Global.SPEED_STEP;
	}

	/**
	 * 減速, 幅度為 Global 中設置的 SPEED_STEP
	 */
	public void speedDown() {
		speed += Global.SPEED_STEP;
	}

	/**
	 * 得到蛇的移動速度
	 * 
	 * @return
	 */
	public int getSpeed() {
		return speed;
	}

	/**
	 * 設置蛇的移動速度
	 * 
	 * @param speed
	 */
	public void setSpeed(int speed) {
		this.speed = speed;
	}

	/**
	 * 蛇是否死掉了
	 * 
	 * @return
	 */
	public boolean isLive() {
		return live;
	}

	/**
	 * 設置蛇是否死掉
	 * 
	 * @param live
	 */
	public void setLive(boolean live) {
		this.live = live;
	}

	/**
	 * 設置蛇死掉
	 */
	public void dead() {
		this.live = false;
	}

	/**
	 * 是否是暫停狀態
	 * 
	 * @return
	 */
	public boolean isPause() {
		return pause;
	}

	/**
	 * 設置暫停狀態
	 * 
	 * @param pause
	 */
	public void setPause(boolean pause) {
		this.pause = pause;
	}

	/**
	 * 更改暫停狀態<BR>
	 * 若是暫停狀態, 則繼續移動<BR>
	 * 若正在移動, 則暫停
	 */
	public void changePause() {
		pause = !pause;
	}

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲另类春色国产| 欧美一区午夜精品| 欧美国产97人人爽人人喊| 精彩视频一区二区| 欧美激情一区在线| 久久九九久精品国产免费直播| 国产99一区视频免费| 欧美国产日韩一二三区| 久久综合久久综合久久综合| 不卡av电影在线播放| 亚洲精品成人悠悠色影视| 最新日韩av在线| 制服丝袜av成人在线看| 成人理论电影网| 蜜臀a∨国产成人精品| 国产三级精品视频| 欧美日韩国产另类不卡| 国产精品白丝jk黑袜喷水| 亚洲精品高清视频在线观看| 亚洲一区二区三区在线播放| www精品美女久久久tv| 日本一区二区久久| 亚洲欧美一区二区三区极速播放| 欧美综合亚洲图片综合区| 久久av中文字幕片| 亚洲午夜成aⅴ人片| 日本一区二区不卡视频| 综合久久久久综合| 国产精品欧美一区二区三区| 日韩一级视频免费观看在线| 在线观看视频91| 欧美一区二区三区视频| 久久精品免费在线观看| 一区二区三区四区在线免费观看 | 日韩精品在线一区| 色综合久久综合中文综合网| 国产又黄又大久久| 精品一区二区精品| 91在线码无精品| 成人一级片在线观看| 欧洲精品一区二区| 久久精品亚洲一区二区三区浴池| 日韩一区在线看| 美腿丝袜亚洲色图| 99精品久久久久久| 日韩欧美一区二区视频| 中文字幕综合网| 国产一区二区在线影院| 欧美午夜在线一二页| 欧美乱妇20p| 欧美一区二区三区四区久久| 国产精品亲子伦对白| 蜜桃av一区二区三区电影| 91网站在线播放| 色综合天天综合狠狠| 91小视频免费观看| 国产日韩精品久久久| 国产一区二区不卡在线| 欧美色视频一区| 欧美亚日韩国产aⅴ精品中极品| 日韩精品一区在线| 爽好久久久欧美精品| 日本va欧美va精品发布| 国产曰批免费观看久久久| 欧美性猛交xxxx黑人交| 亚洲少妇最新在线视频| 成人永久aaa| 久久久久久99久久久精品网站| 国产精品久久久久久久久免费相片 | 成人久久视频在线观看| 欧美mv日韩mv亚洲| 国产欧美日韩综合| 精品一区二区免费看| 欧美tickling挠脚心丨vk| 日韩精品乱码免费| 欧美电影在线免费观看| 亚洲成人av中文| 精彩视频一区二区| 久久综合久久鬼色中文字| 蜜桃一区二区三区在线| 欧美一区二区三区在线视频| 日韩中文字幕一区二区三区| 欧美美女bb生活片| 视频一区二区三区中文字幕| 欧美高清你懂得| 日本欧美久久久久免费播放网| 国产aⅴ综合色| 国产精品天美传媒| 91精选在线观看| 久久99热这里只有精品| 亚洲精品一区二区精华| 一区二区三区欧美亚洲| 欧美三级视频在线播放| 免费看日韩精品| 欧美精品一区二区高清在线观看 | 亚洲欧洲av一区二区三区久久| 成人午夜视频网站| 亚洲激情图片一区| 日韩欧美一区电影| 国产福利91精品一区二区三区| 欧美性猛片xxxx免费看久爱| 亚洲午夜激情网站| 欧美精品一区二区三区在线播放| 国产精品白丝av| 亚洲伦理在线免费看| 91精品国产综合久久精品| 国产美女视频一区| 亚洲欧美激情插 | 欧美国产日本视频| 色狠狠av一区二区三区| 国产精品久久久久久亚洲毛片| 日本精品视频一区二区三区| 免费欧美日韩国产三级电影| 久久久噜噜噜久久人人看 | 亚洲精品一区二区三区99| 成人免费视频播放| 日韩精品1区2区3区| 国产欧美一区二区精品仙草咪| 欧美三级视频在线| 成人黄色片在线观看| 喷水一区二区三区| 一区二区三区免费看视频| 精品国产乱码久久久久久图片| 色琪琪一区二区三区亚洲区| 久久成人羞羞网站| 一区二区成人在线视频| 久久先锋资源网| 欧美高清视频www夜色资源网| 成人高清视频在线观看| 日韩精品电影一区亚洲| 国产精品久久看| www一区二区| 日韩一级欧美一级| 欧美日韩一本到| 一本久道久久综合中文字幕| 国产成人av资源| 久久精品国产一区二区三 | 成人ar影院免费观看视频| 欧美a一区二区| 亚洲亚洲人成综合网络| 综合激情成人伊人| 国产精品私人自拍| 国产日本一区二区| 久久久精品2019中文字幕之3| 欧美一区二区三区在线电影| 欧美日韩一卡二卡| 欧美最猛性xxxxx直播| 91视频免费观看| 99久久99久久精品国产片果冻| 国产精品一区不卡| 国产成人免费av在线| 国内精品伊人久久久久av一坑| 国产精品少妇自拍| 国产日韩欧美一区二区三区乱码 | 亚洲三级电影全部在线观看高清| 国产欧美日韩不卡| 欧美激情在线一区二区三区| 国产亚洲精品福利| 国产精品私人自拍| 国产精品不卡在线| 亚洲女性喷水在线观看一区| 亚洲日本欧美天堂| 亚洲国产成人高清精品| 亚洲123区在线观看| 日韩成人精品在线| 精品一区二区三区影院在线午夜| 久久不见久久见免费视频7| 黑人精品欧美一区二区蜜桃| 国产一区二区三区在线看麻豆| 国产原创一区二区| 成人不卡免费av| 欧美午夜影院一区| 欧美一级夜夜爽| 国产喷白浆一区二区三区| 中文字幕色av一区二区三区| 一区二区三区加勒比av| 亚洲不卡在线观看| 九九**精品视频免费播放| 处破女av一区二区| 欧日韩精品视频| 日韩精品一区二区三区四区 | 欧美日韩精品一区二区三区蜜桃 | 美女视频黄频大全不卡视频在线播放| 奇米精品一区二区三区在线观看| 黑人巨大精品欧美一区| aaa欧美大片| 成人小视频在线观看| 欧美在线观看视频一区二区| 4438成人网| 国产精品久久久久久福利一牛影视 | av不卡一区二区三区| 911国产精品| 国产精品美女久久久久久久久久久 | 91福利资源站| 久久一夜天堂av一区二区三区| 亚洲精品综合在线| 国产在线看一区| 欧美视频在线不卡| 国产人成一区二区三区影院| 亚洲大片在线观看|