使用双向链表实现贪吃蛇程序
1. 链表节点定义:
Snake Package; classe pública snakenode {private int x; private int y; privado snakenode a seguir; privado snakenode adiante; 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 a seguir;} public void SetNext (snakenode a seguir) {this.Next = next;} public snakenode getAhead () {return adiante;} public void setahead (snakenode adiante) {this .Ahead = Antes;}}
主程序
Snake de pacote; importar java.awt.borderlayout; importar java.awt.gridlayout; importar java.awt.keyeventPostProcessor; importar java.awt.keyboardfocusmanager; importar java.awt.event.keyevent; import java.util.random; swing.imageicon; importar javax.swing.jframe; importar javax.swing.jlabel; importar javax.swing.JOptionPane; importar javax.swing.jpanel;/*** criado pelo hackcoder em 15-3-11. */Classe pública Snake estende JFrame {private estático final Int linhas = 60; colunas estáticas estáticas privadas Int = 80; // 方向 estática privada final int up = 1; private estático final int direito = 2; estática privada final int down = 3 ; private estático final int esquerd = 4; estática privada int driection_now = direita; private estático booleano iseat = false; privado estático int tailx; private estático intacer private static snakenode alimento = new snakenode (); private estático jlabel [] imagens = novo jlabel [linhas * colunas]; public static void main (string args []) {snakeheader.setx (new aleatom (). nextint (linhas - 1 )); SnakeHeader.Sety (new Random (). NextInt (colunas - 1)); cobra cobra = new Snake (); Food = getfood (); while (true) {try {next (); // 吃到了食物if (Food.getx () == snakeheader.getx () && Food.gety () == snakeheader.gety ()) {addtail (); iseat = true;} // 吃到食物 , 重新生成一个食物 if ( iseat) {food = getfood ();} // 判断是否结束游戏 if (juizEnd ()) {joptionpane.showMessagedialog (null, "游戏结束!", "游戏结束!", joptionpane.error_message); quebra;} snakenode pnow = snakeheader; while (pnow! = null) {imagens [colunas * pnow.getx () + pnow.gety ()]. Seticon (new imageicon ("image/preto.jpg", ""); pnow = pnow .getNext ();} imagens [colunas * Food.getx () + Food.gety ()]. Seticon (new Imageicon ("Image/Black.jpg", ""); Thread.sleep (100); //清理 pnow = SnakeHeader; while (pnow! = Null) {imagens [colunas * pnow.getx () + pnow.gety ()]. Seticon (new imageicon ("image/white.jpg", ""); pnow.getNext ();} imagens [colunas * 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 ); // 添加全局键盘监听 KeyboardFocusManager Manager = KeyboardFocusManager.getCurrentKeyBoardFocusManager (); gerente.adDeyEventPostProcessor ((KeyEventPostProcessor) this.getMykeyEventHandler ());}/** ** */public void init () {jpanel JPanel (New GridLayout (linhas, colunas, 1, 1)); setLayout (new BorderLayout ()); para (int x = 0; x <linhas; x ++) {for (int y = 0; y <colunas; y ++) {imageicon imageicon; if (x == 0 || x == linhas - 1 || y == 0 || y == colunas - 1) { imageicon = new imageicon ("image/red.jpg", "");} else {imageicon = new imageicon ("image/white.jpg", "");} imagens [colunas * x + y] = novo jlabel ( imageicon); {return new keyEventPostProcessor () {public boolean PostprocessKeyEvent (KeyEvent e) {if (e.getId ()! ) {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 = snakeheader.gety (); int x2 = snakeheader.getNext (). getX (); int y2 = snakeheader.getNext (). gety (); se (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 (). y2 == 1) {return true;}} driection_now = esquerda;} retornar true;}};}/** * 计算贪吃蛇的方向及位移 * * @param cabeçalho */public static void a seguir () {se (SnakeHeader == NULL) retornar; 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 ()); .gety () + 1);} else if (driection_now == esquerda) {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 Addatail () {snakenode cauda = novo snakenode (tailx, taily); snaketailer.setNext (cauda); cauda.SetaHead (snaketailer); snaketailer = snaketailer.getNext ();} public static snakenode getfood () {snakenode alimento = new snakenode (); bandeira booleana = true; while (true) {int x = novo aleatório aleatório () .NextInt (linhas); int y = new Random (). NextInt (colunas); if (x == 0 || x == linhas - 1 || y == 0 || y == colunas - 1) {continuação;} snakenode pnow = snakeheader; while (pnow! = null) {if (x == pnow.getx () && y == pnow.gety ()) {sinalizador = false;} pnow = pnow.getNext ();} if (flag) {Food = new Snakenode (x, y); break;}} retornar alimentos;} public static boolean juizEn () {// 碰墙判断 if (snakeheader.getx ( ) == 0 || SnakeHeader.getx () == linhas - 1 || pnow = snakeheader.getNext (); while (pnow! = null) {if (snakeheader.getx () == pnow.getx () && snakeheader.gety () == pnow.gety ()) {System.out.println "