使用双向链表实现贪吃蛇程序
1. 链表节点定义 :
Snake de paquete; public class Snakenkeode {private int x; private int y; private snakende next; private snakende por delante; public snakenode () {} public snakende (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 snakenkenOde getNext () {return next;} public void setNext (snakennoDode next) {this.next = next;} public snakenkakenode getAhead () {return avanzando;} public void setaHead (snakendee) {this .Ahead = adelante;}}
主程序 :
Snake de paquete; 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;/*** creado por Hackcoder el 15-3-11. */Public Class Snake extiende Jframe {private estático final int rows = 60; private static final int columna = 80; // 方向 private static final int up = 1; private static final int right = 2; private static final int down = 3 ; Private estático final int lefa = 4; private static int driection_now = right; private static boolean iseat = false; private static int tailx; private static int Taily; private static snakeheader = new SnakenEnde (); privado static snakeketailer = snakeheader; Private static snakenke food = new SnakenDe (); private static jlabel [] imágenes = new JLabel [filas * columnas]; public static void main (string args []) {snakeheader.setx (new Random (). Nextint (filas - 1 1 )); SnakeHeader.sety (new Random (). NextInt (columnas - 1)); Snake Snake = New Snake (); Food = GetFood (); While (True) {try {next (); // 吃到了食物if (food.getx () == SnakeHeader.getx () && food.gety () == SnakeHeader.gety ()) {addtail (); iseat = true;} // 吃到食物 吃到食物 重新生成一个食物 重新生成一个食物 重新生成一个食物 ( iSeat) {food = getFood ();} // 判断是否结束游戏 if (JudgeEnd ()) {jOptionPane.ShowMessEdialog (nulo, "游戏结束!", "游戏结束!", joptionpane.error_message; break;} snakenode pnow = snakeheader; while (pnow! = null) {imágenes [columnas * pnow.getx () + pnow.gety ()]. seticon (new imageiCon ("image/black.jpg", "")); .getNext ();} imágenes [columnas * food.getx () + food.gety ()]. seticon (new Imageicon ("Image/Black.jpg", "")); Thread.sleep (100); //清理 pnow = snakeheader; while (pnow! = Null) {imágenes [columnas * pnow.getx () + pnow.gety ()]. Seticon (new imageiCon ("image/white.jpg", "")); pnow.getNext ();} imágenes [columnas * food.getx () + food.gety ()]. seticon (nueva 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_close_close ); // 添加全局键盘监听 keyboardFocusManager administrador = keyboardfocusmanager.getCurrentKeyBoardFocUsManager (); gerente.addkeyeventPostProcessor ((keyEventPostProcessor) this.getMykeyEventHandler ());}/** * 初始化地图 */public void init () {jPanel p = new New Jpanel (nuevo GridLayout (filas, columnas, 1, 1)); setLayout (new BorderLayout ()); para (int x = 0; X <filas; x ++) {for (int y = 0; y <columnas; y ++) {imageiCon imageiCon; if (x == 0 || x == filas - 1 || y == 0 || y == columnas - 1) { imageiCon = new ImageCon ("Image/Red.jpg", "");} else {imageiCon = new imageCon ("image/white.jpg", "");} imágenes [columnas * x + y] = new jlabel ( imageiCon); p.add (imágenes [columnas * x + y]);}} getContentPane (). add (p, borderLayout.center);}/** * 键盘监听 * * @return */public keyEventPostProcessor getMyKeyEventhandler () {return New keyEventPostPossorsor () {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 (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 encabezado */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.getaAhead (). getx ()); pnow.sety (pnow.getAhead (). gety ()); pnow = pnow.getAhead ();} if (driection_now == correcto) {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 SnakenDe (TailX, Taily); Snaketailer.SetNext (cola); tail.setAhead (snaketailer); snaketailer = snaketailer.getNext ();} public static static snakenode getFood () {snakenode food = new Snakende (); Boolean Flag = True; while (True) {int x = nuevo al azar (nuevo aleatorio = nuevo aleatorio () .NextInt (filas); int y = new Random (). NextInt (columnas); if (x == 0 || x == Filas - 1 || y == 0 || y == columnas - 1) {continúa;} snakendedo pnow = snakeheader; while (pnow! = null) {if (x == pnow.getx () && y == pnow.gety ()) {flak = false;} pnow = pnow.getNext ();} if (flag) {food = new SnakenEnde (x, y); break;}} return food;} public static boolean Judgeend () {// 碰墙判断 if (SnakeHeader.getx ( ) == 0 || pnow = SnakeHeader.getNext (); while (pnow! = null) {if (SnakeHeader.getx () == pnow.getx () && snakeheader.gety () == pnow.gety ()) {system.println ("========= 碰到身体 ==========="); return true;} pnow = pnow.getNext ();} return false;}}