最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中使用雙向鏈表實現(xiàn)貪吃蛇程序源碼分享

 更新時間:2015年03月20日 11:25:41   投稿:junjie  
這篇文章主要介紹了java中使用雙向鏈表實現(xiàn)貪吃蛇程序源碼分享,本文直接給出了實現(xiàn)代碼,需要的朋友可以參考下

使用雙向鏈表實現(xiàn)貪吃蛇程序

1.鏈表節(jié)點定義:

package snake;

public class SnakeNode {
	private int x;
	private int y;
	private SnakeNode next;
	private SnakeNode ahead;

	public SnakeNode() {
	}

	public SnakeNode(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}

	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;
	}

	public SnakeNode getNext() {
		return next;
	}

	public void setNext(SnakeNode next) {
		this.next = next;
	}

	public SnakeNode getAhead() {
		return ahead;
	}

	public void setAhead(SnakeNode ahead) {
		this.ahead = ahead;
	}

}

主程序:

package snake;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.KeyEventPostProcessor;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * Created by hackcoder on 15-3-11.
 */
public class Snake extends JFrame {
	private static final int rows = 60;
	private static final int columns = 80;

	// 方向
	private static final int UP = 1;
	private static final int RIGHT = 2;
	private static final int DOWN = 3;
	private static final int LEFT = 4;

	private static int DRIECTION_NOW = RIGHT;
	private static boolean isEat = false;

	private static int TAILX;
	private static int TAILY;

	private static SnakeNode snakeHeader = new SnakeNode();
	private static SnakeNode snakeTailer = snakeHeader;
	private static SnakeNode food = new SnakeNode();
	private static JLabel[] images = new JLabel[rows * columns];

	public static void main(String args[]) {
		snakeHeader.setX(new Random().nextInt(rows - 1));
		snakeHeader.setY(new Random().nextInt(columns - 1));
		Snake snake = new Snake();
		food = getFood();
		while (true) {
			try {
				next();
				// 吃到了食物
				if (food.getX() == snakeHeader.getX()
						&& food.getY() == snakeHeader.getY()) {
					addTail();
					isEat = true;
				}
				//吃到食物,重新生成一個食物
				if (isEat) {
					food = getFood();
				}
				// 判斷是否結(jié)束游戲
				if (judgeEND()) {
					JOptionPane.showMessageDialog(null, "游戲結(jié)束!", "游戲結(jié)束!",
							JOptionPane.ERROR_MESSAGE);
					break;
				}
				SnakeNode pNow = snakeHeader;
				while (pNow != null) {
					images[columns * pNow.getX() + pNow.getY()]
							.setIcon(new ImageIcon("image/black.jpg", ""));
					pNow = pNow.getNext();
				}
				images[columns * food.getX() + food.getY()]
						.setIcon(new ImageIcon("image/black.jpg", ""));
				Thread.sleep(100);
				// 清理
				pNow = snakeHeader;
				while (pNow != null) {
					images[columns * pNow.getX() + pNow.getY()]
							.setIcon(new ImageIcon("image/white.jpg", ""));
					pNow = pNow.getNext();
				}
				images[columns * food.getX() + food.getY()]
						.setIcon(new ImageIcon("image/white.jpg", ""));

				isEat = false;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	public Snake() {
		init();
		this.setBounds(80, 80, 400, 400);
		this.setVisible(true);
		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		// 添加全局鍵盤監(jiān)聽
		KeyboardFocusManager manager = KeyboardFocusManager
				.getCurrentKeyboardFocusManager();
		manager.addKeyEventPostProcessor((KeyEventPostProcessor) this
				.getMyKeyEventHandler());
	}

	/**
	 * 初始化地圖
	 */
	public void init() {
		JPanel p = new JPanel(new GridLayout(rows, columns, 1, 1));
		setLayout(new BorderLayout());
		for (int x = 0; x < rows; x++) {
			for (int y = 0; y < columns; y++) {
				ImageIcon imageIcon;
				if (x == 0 || x == rows - 1 || y == 0 || y == columns - 1) {
					imageIcon = new ImageIcon("image/red.jpg", "");
				} else {
					imageIcon = new ImageIcon("image/white.jpg", "");
				}
				images[columns * x + y] = new JLabel(imageIcon);
				p.add(images[columns * x + y]);
			}
		}
		getContentPane().add(p, BorderLayout.CENTER);

	}

	/**
	 * 鍵盤監(jiān)聽
	 * 
	 * @return
	 */
	public KeyEventPostProcessor getMyKeyEventHandler() {
		return new KeyEventPostProcessor() {
			public boolean postProcessKeyEvent(KeyEvent e) {
				if (e.getID() != KeyEvent.KEY_PRESSED) {
					return false;
				}
				int keycode = e.getKeyCode();
				if (keycode == KeyEvent.VK_UP) {

					if (snakeHeader.getNext() != null) {
						// 判斷方向是否可轉(zhuǎn)
						int x1 = snakeHeader.getX();
						int y1 = snakeHeader.getY();
						int x2 = snakeHeader.getNext().getX();
						int y2 = snakeHeader.getNext().getY();
						if (y1 == y2 && x1 - x2 == 1) {
							return true;
						}
					}
					DRIECTION_NOW = UP;
				} else if (keycode == KeyEvent.VK_RIGHT) {
					if (snakeHeader.getNext() != null) {
						int x1 = snakeHeader.getX();
						int y1 = snakeHeader.getY();
						int x2 = snakeHeader.getNext().getX();
						int y2 = snakeHeader.getNext().getY();
						if (x1 == x2 && y2 - y1 == 1) {
							return true;
						}
					}
					DRIECTION_NOW = RIGHT;
				} else if (keycode == KeyEvent.VK_DOWN) {
					if (snakeHeader.getNext() != null) {
						int x1 = snakeHeader.getX();
						int y1 = snakeHeader.getY();
						int x2 = snakeHeader.getNext().getX();
						int y2 = snakeHeader.getNext().getY();
						if (y1 == y2 && x2 - x1 == 1) {
							return true;
						}
					}
					DRIECTION_NOW = DOWN;
				} else if (keycode == KeyEvent.VK_LEFT) {
					if (snakeHeader.getNext() != null) {
						int x1 = snakeHeader.getX();
						int y1 = snakeHeader.getY();
						int x2 = snakeHeader.getNext().getX();
						int y2 = snakeHeader.getNext().getY();
						if (x1 == x2 && y1 - y2 == 1) {
							return true;
						}
					}
					DRIECTION_NOW = LEFT;
				}
				return true;
			}
		};
	}

	/**
	 * 計算貪吃蛇的方向及位移
	 * 
	 * @param header
	 */
	public static void next() {
		if (snakeHeader == null)
			return;
		TAILX = snakeTailer.getX();
		TAILY = snakeTailer.getY();
		SnakeNode pNow = snakeTailer;
		while (pNow != null) {
			if (pNow == snakeHeader) {
				break;
			}
			pNow.setX(pNow.getAhead().getX());
			pNow.setY(pNow.getAhead().getY());
			pNow = pNow.getAhead();
		}

		if (DRIECTION_NOW == RIGHT) {
			snakeHeader.setY(snakeHeader.getY() + 1);
		} else if (DRIECTION_NOW == LEFT) {
			snakeHeader.setY(snakeHeader.getY() - 1);
		} else if (DRIECTION_NOW == UP) {
			snakeHeader.setX(snakeHeader.getX() - 1);
		} else if (DRIECTION_NOW == DOWN) {
			snakeHeader.setX(snakeHeader.getX() + 1);
		}
	}

	public static void addTail() {
		SnakeNode tail = new SnakeNode(TAILX, TAILY);
		snakeTailer.setNext(tail);
		tail.setAhead(snakeTailer);
		snakeTailer = snakeTailer.getNext();

	}

	public static SnakeNode getFood() {
		SnakeNode food = new SnakeNode();
		boolean flag = true;
		while (true) {
			int x = new Random().nextInt(rows);
			int y = new Random().nextInt(columns);
			if (x == 0 || x == rows - 1 || y == 0 || y == columns - 1) {
				continue;
			}
			SnakeNode pNow = snakeHeader;
			while (pNow != null) {
				if (x == pNow.getX() && y == pNow.getY()) {
					flag = false;
				}
				pNow = pNow.getNext();
			}
			if (flag) {
				food = new SnakeNode(x, y);
				break;
			}
		}
		return food;
	}

	public static boolean judgeEND() {
		//碰墻判斷
		if (snakeHeader.getX() == 0 || snakeHeader.getX() == rows - 1
				|| snakeHeader.getY() == 0 || snakeHeader.getY() == columns - 1) {
			return true;
		}
		//碰身體判斷
		SnakeNode pNow = snakeHeader.getNext();
		while (pNow != null) {
			if (snakeHeader.getX() == pNow.getX()
					&& snakeHeader.getY() == pNow.getY()) {
				System.out.println("=========碰到身體===========");
				return true;
			}
			pNow = pNow.getNext();
		}
		return false;
	}

}

相關(guān)文章

  • java web將數(shù)據(jù)導出為Excel格式文件代碼片段

    java web將數(shù)據(jù)導出為Excel格式文件代碼片段

    這篇文章主要為大家詳細介紹了java web將數(shù)據(jù)導出為Excel格式文件代碼片段,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java實現(xiàn)簡單GUI登錄和注冊界面

    Java實現(xiàn)簡單GUI登錄和注冊界面

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單GUI登錄和注冊界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot詳解如何進行整合Druid數(shù)據(jù)源

    SpringBoot詳解如何進行整合Druid數(shù)據(jù)源

    Druid是阿里開發(fā)的一款開源的數(shù)據(jù)源,被很多人認為是Java語言中最好的數(shù)據(jù)庫連接池,本文主要介紹了SpringBoot整合Druid數(shù)據(jù)源的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Java 8 Stream操作類型及peek示例解析

    Java 8 Stream操作類型及peek示例解析

    這篇文章主要介紹了Java 8 Stream操作類型及peek示例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • SpringCloud HystrixDashboard服務監(jiān)控詳解

    SpringCloud HystrixDashboard服務監(jiān)控詳解

    Hystrix Dashboard 是Spring Cloud中查看Hystrix實例執(zhí)行情況的一種儀表盤組件,支持查看單個實例和查看集群實例,本文將對其服務監(jiān)控學習
    2022-11-11
  • hibernate屬性級別注解實例代碼

    hibernate屬性級別注解實例代碼

    這篇文章主要介紹了hibernate屬性級別注解實例代碼,涉及屬性級別注釋添加方式及種類,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • 23種設計模式(11)java策略模式

    23種設計模式(11)java策略模式

    這篇文章主要為大家詳細介紹了23種設計模式之java策略模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • struts2.2.3+spring3.1.0+mybatis3.1.0框架整合集成簡單demo

    struts2.2.3+spring3.1.0+mybatis3.1.0框架整合集成簡單demo

    本篇文章主要介紹了struts2.2.3+spring3.1.0 + mybatis3.1.0框架整合,結(jié)合在一起實現(xiàn)用戶的增刪改查功能,有需要的可以了解一下。
    2016-11-11
  • 解析Mybatis判斷表達式源碼分析

    解析Mybatis判斷表達式源碼分析

    這篇文章主要介紹了Mybatis判斷表達式源碼分析,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • java awt生成簽名圖片如何消除鋸齒化

    java awt生成簽名圖片如何消除鋸齒化

    這篇文章主要介紹了java awt生成簽名圖片如何消除鋸齒化,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

东莞市| 资中县| 本溪| 施甸县| 定襄县| 沙湾县| 阿克陶县| 临桂县| 历史| 灵丘县| 申扎县| 南木林县| 林口县| 禄丰县| 平乡县| 资溪县| 东莞市| 乐东| 青川县| 乌兰察布市| 西乡县| 福鼎市| 年辖:市辖区| 维西| 和静县| 延川县| 恩施市| 扎鲁特旗| 翼城县| 安宁市| 周口市| 乌兰察布市| 武夷山市| 望江县| 五常市| 宁海县| 榆林市| 山丹县| 安泽县| 新宁县| 方正县|