亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲亚洲人成综合网络| 中文字幕日韩一区| 国产人久久人人人人爽| 依依成人综合视频| 国产成人av在线影院| 91精品国产麻豆| 亚洲卡通欧美制服中文| 国产精品自拍av| 欧美日韩mp4| 亚洲综合精品久久| 成人av电影免费在线播放| 日韩免费一区二区三区在线播放| 一区二区三区在线免费观看| 国产成人自拍在线| 欧美电影免费观看高清完整版| 一区二区三区欧美激情| 不卡视频一二三四| 2023国产精品自拍| 久久成人综合网| 7777精品伊人久久久大香线蕉| 亚洲欧美中日韩| 不卡一区二区中文字幕| 国产欧美一区二区三区在线看蜜臀 | 日韩va亚洲va欧美va久久| av不卡免费在线观看| 久久午夜电影网| 久久疯狂做爰流白浆xx| 欧美大片顶级少妇| 免费看欧美女人艹b| 欧美精品三级在线观看| 一区二区高清在线| 日韩女同互慰一区二区| 亚洲成人免费视| 欧美唯美清纯偷拍| 亚洲成人激情自拍| 欧美日韩三级在线| 污片在线观看一区二区| 欧美日韩高清一区| 日韩高清不卡在线| 日韩区在线观看| 久久99国产精品久久99| 精品国产91乱码一区二区三区 | 亚洲国产精品一区二区www| 色网站国产精品| 亚洲一区二区三区视频在线| 色菇凉天天综合网| 天堂成人国产精品一区| 欧美猛男gaygay网站| 日韩国产欧美三级| 欧美精品一区二区三区很污很色的| 免费成人美女在线观看| 久久久噜噜噜久久人人看| 国产精品1区2区| 国产精品久久久久久久久免费相片 | 精品国产3级a| 成人综合婷婷国产精品久久蜜臀 | 美腿丝袜亚洲色图| 久久久久久久电影| 91小宝寻花一区二区三区| 亚洲一区二区三区四区在线免费观看| 欧美精品777| 国产自产2019最新不卡| 综合分类小说区另类春色亚洲小说欧美| 亚洲成人高清在线| 欧美军同video69gay| 国产精品系列在线观看| 欧美挠脚心视频网站| 精品国产乱码久久久久久老虎| 国产美女主播视频一区| 亚洲免费观看高清完整版在线观看熊 | 日韩在线一二三区| 久久久精品中文字幕麻豆发布| 国产成人精品免费视频网站| 一区二区三区久久久| 精品女同一区二区| 91论坛在线播放| 美日韩一区二区| 亚洲最新视频在线观看| 久久综合给合久久狠狠狠97色69| 色综合久久综合网| 国产精品资源网站| 五月综合激情日本mⅴ| 亚洲国产成人一区二区三区| 69堂亚洲精品首页| 91在线观看下载| 激情亚洲综合在线| 成人免费在线视频观看| 国产视频一区在线播放| wwww国产精品欧美| 欧美日韩国产在线播放网站| 国产91高潮流白浆在线麻豆| 日韩成人一区二区三区在线观看| 最新日韩在线视频| 久久久久久日产精品| 91.com视频| 欧美三级日本三级少妇99| 不卡大黄网站免费看| 国产久卡久卡久卡久卡视频精品| 亚洲成人精品一区二区| 一区二区在线观看免费| 国产精品久久久久久久岛一牛影视 | 国产精品女上位| 欧美精品一区二区久久久| 在线综合+亚洲+欧美中文字幕| 91免费看`日韩一区二区| 国产91精品露脸国语对白| 久久99精品久久久久| 日本伊人精品一区二区三区观看方式| 亚洲美女电影在线| 成人欧美一区二区三区白人| 国产精品女主播av| 国产精品久久看| 国产精品久久久久精k8 | 福利一区在线观看| 国产成人综合自拍| 国产精品中文字幕一区二区三区| 老司机一区二区| 日本欧美一区二区三区乱码| 日韩在线观看一区二区| 日韩激情中文字幕| 美女视频黄频大全不卡视频在线播放 | 久久青草国产手机看片福利盒子| 日韩欧美精品在线| 欧美成人a视频| 精品1区2区在线观看| 久久中文字幕电影| 国产日韩精品一区二区三区在线| 久久看人人爽人人| 国产精品五月天| 亚洲麻豆国产自偷在线| 亚洲国产视频直播| 日本大胆欧美人术艺术动态 | 一区二区在线观看免费| 亚洲在线成人精品| 人人狠狠综合久久亚洲| 精品一区二区三区在线播放视频| 久久99精品久久久久久久久久久久 | 久久先锋影音av鲁色资源 | 91精品福利在线一区二区三区| 欧美一卡2卡三卡4卡5免费| 久久午夜羞羞影院免费观看| 国产精品视频免费看| 亚洲国产中文字幕在线视频综合 | 亚洲国产精品黑人久久久| 亚洲欧美日韩国产综合在线| 午夜国产不卡在线观看视频| 蜜桃视频第一区免费观看| 国产69精品久久久久毛片| 色先锋久久av资源部| 欧美电视剧在线观看完整版| 亚洲国产经典视频| 香蕉成人啪国产精品视频综合网| 麻豆91免费观看| 99久久精品国产网站| 69堂成人精品免费视频| 日本一区二区三区dvd视频在线| 一区二区三区在线视频播放| 久草热8精品视频在线观看| 91在线一区二区三区| 91麻豆精品国产自产在线| 国产精品对白交换视频| 日韩va亚洲va欧美va久久| 99久久99久久精品国产片果冻| 91精品国产综合久久婷婷香蕉 | 欧美精品亚洲一区二区在线播放| 久久久久久电影| 婷婷开心激情综合| av在线这里只有精品| 精品国产一区二区三区忘忧草 | 欧美亚洲动漫另类| 久久色成人在线| 日韩高清电影一区| 91蝌蚪porny成人天涯| 久久精品一级爱片| 免费的成人av| 欧洲精品中文字幕| 中文字幕中文字幕在线一区| 精油按摩中文字幕久久| 欧美日韩一区二区三区四区| 日韩一区欧美一区| 国产丶欧美丶日本不卡视频| 91精品中文字幕一区二区三区| 亚洲日本一区二区| 国产成人无遮挡在线视频| 日韩一区国产二区欧美三区| 亚洲综合无码一区二区| 不卡电影一区二区三区| 国产视频一区二区在线| 蜜桃免费网站一区二区三区| 欧美日韩国产大片| 亚洲国产一区二区三区| 在线免费一区三区| 亚洲精品视频在线| 一本大道久久a久久综合| 国产精品美女久久久久av爽李琼| 国产成人免费视频网站高清观看视频| 精品国精品国产尤物美女| 日本不卡一区二区| 欧美一级欧美三级在线观看| 日韩国产精品91|