使用双向链表实现贪吃蛇程序
1. : :
Пакет Snake; открытый класс Snakenode {private int x; private int y; private snakenode Далее; private snakenode впереди; 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) {это .y = y;} public snakenode getNext () {return next;} public void setNext (snakenode nex .ahead = впереди;}}
主程序 :
Пакет Snake; импорт java.awt.borderlayout; import java.awt.gridlayout; import java.awt.keyeventpostprocessor; import java.awt.keyboardfocusmanager; импорт java.awt.event.keyevent; импорт java.util.random; import javax. swing.imageicon; import javax.swing.jframe; import javax.swing.jlabel; импорт javax.swing.joptionpane; импорт javax.swing.jpanel;/*** Создан Hackcoder 15-3-11. */public Class Snake Extens jframe {private static final int rows = 60; частные статические конечные столбцы int = 80; // 方向 Частный статический окончательный окончательный окончательный int int = 1; частный статический конечный int right = 2; частный статический окончательный окончательный пункт = 3 ; Private Static Final int Left = 4; Private Static int driection_now = справа; частное статическое логическое iSeat = false; частное статическое int tailx; частный статический int int; частный статический змеиный змеиный голод = new snakenode (); private static snaketode snaketailer = snakeheader; Частный статический snakenode food = new snakenode (); private static jlabel [] images = new jlabel [rows * columns]; )); SnakeHeader.Sethy (new Random (). NextInt (Columns - 1)); Snake Snake = new Snake (); Food = getFood (); while (true) {try {Next (); // 吃到了食物if (food.getx () == smakeheader.getx () && food.gety () == smakeheader.gety ()) {addtail (); iseat = true;} // 吃到食物 , 重新生成一个食物 if ( iseat) {food = getFood ();} // 判断是否结束游戏 if (judgeend ()) {joptionpane.showmessageDialog (null, "游戏结束!", "游戏结束!", 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) {image [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 (прерывание e) {e.printstacktrace ();}}} public smake () {init (); this.setBounds (80, 80, 400, 400); this.setVisible (true); setDefaultCloseoperation (javax.swing.windowConstants.exit_close ); // 添加全局键盘监听 KeyboardFocusManager Manager = keyboardfocusManager.getCurrentKeboardFocusManager (); Manager.AddKeyEventPostProcessor (((KeyEventPostProcessor) this.getMyKeyEventhandler ());}/** * 初始化地图 */public void init () {Jpanel p = new Jpanel (new Gridlayout (Rows, столбцы, 1, 1)); setlayout (new Borderlayout ()); for (int x = 0; x <ряды; 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", "");} Image [Columns * x + y] = new jlabel ( ImageICon); P.Add (Image [Columns * x + y]);}} getContentPane (). Add (p, borderlayout.center);}/** * 键盘监听 * * @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) {// 判断方向是否可转 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 = smakeheader.gety (); int x2 = snakeheader.getnext (). getx (); int y2 = snakeheader.getnext (). gety (); ifx (); int y2 = snakeheader.getnext (). gety (); (y1 == y2 && x2 - x1 == 1) {return true;}} driection_now = down;} else if (keycode == keyevent.vk_left) {if (snakeheader.getnext ()! = null) {int x1 = smakeheader.getx (); int y1 = snakeheader.gety (); int x2 = snakeheader.getnext (). getx (); int y2 = snakeheader.getnext (). getey (); if (x1 == x2 && y1 - y2 == 1) {return true;}} driection_now = left;} return true;}};}/** * 计算贪吃蛇的方向及位移 * * * @param Header */public static void Next () {если (Snakeheader == null) return; tailx = snaketailer.getx (); taily = snaketailer.gety (); snakenode pnow = snaketailer; while (pnow! = null) {if (pnow == smakeheader) {break;} pnow. setx (pnow.getahead (). getx ()); .gety () + 1);} else if (driection_now == Left) {smakeHeader.Sethy (snakeHeader.gety () - 1);} else if (driection_now == up) {snakeHeader.setx (snakeHeader.getx () - 1);} else if (driection_now == down) {smakeheader.setx (snakeheader.getx () + 1);}} public static void addtail () {snakenode tail = new snakenode (tailx, хвост); snaketailer.setnext (хвост); 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 == ряды - 1 || y == 0 || y == Столбцы - 1) {продолжение;} 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 || pnow = snakeheader.getnext (); while (pnow! = null) {if (snakeheader.getx () == pnow.getx () && smakeheader.gety () == pnow.gety ()) {System.out.println ("========= 碰到身体 ============="); вернуть true;} pnow = pnow.getNext ();} return false;}}