使用双向链表实现贪吃蛇程序
1. : :
Paket Snake; Public Class Snakenode {private int x; private int y; private snakenode next; snakenode pribadi ke depan; public snakenode () {} public snakenode (int x, int y) {super (); this.x = x; ini; ini .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 ke depan;} public void setahead (snakenode ke depan) {ini .ahead = ke depan;}}
主程序 :
Paket Snake; Impor Java.awt.borderlayout; impor java.awt.gridlayout; impor java.awt.keyeventpostprocessor; import java.awt.keyboardfocManager; impor java.awt.event.keyevent; impor java.util.random; impor; swing.imageicon; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.joptionpane; import javax.swing.jpanel;/*** dibuat oleh hackcoder pada 15-3-11. */Snake kelas publik memperluas 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 = kanan; boolean static private iSeat = false; private static int tailx; private static int taily; snakeHeader snakeheader private static = snakode baru (); snaketailer snaketailer statis private = snakeheader; Private Static Snakenode Food = New Snakenode (); Private Static Jlabel [] gambar = JLabel baru [baris * kolom]; public static void main (string args []) {snakeheader.setx (acak baru (). NextIn (baris - baris - 1 )); snakeheader.sety (acak baru (). nextInt (kolom - 1)); ular ular = ular baru (); makanan = getFood (); while (true) {coba {next (); // 吃到了食物if (food.getx () == snakeheader.getx () && food.gety () == snakeheader.gety ()) {addtail (); iseat = true;} // 吃到食物 , 重新生成一个食物 if (if (); iseat) {food = getFood ();} // 判断是否结束游戏 if (judgeend ()) {joptionpane.showmessagealog (null, "游戏结束!", "游戏结束!", joptionpane.error_message); break;} snakenode power = snakeheader; while (pNow! = null) {gambar [kolom * pnow.getx () + pnow.gety ()]. seticon (gambar baru ("gambar/hitam. .getNext ();} gambar [kolom * food.getx () + food.gety ()]. seticon (gambar baru ("gambar/black.jpg", "")); thread.sleep (100); //清理 power = snakeheader; while (pnow! = Null) {gambar [kolom * pnow.getx () + pnow.gety ()]. Seticon (gambar baru ("gambar/white.jpg", ""); power = pow.getNext ();} gambar [kolom * food.getx () + food.gety ()]. seticon (gambar baru ("gambar/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_closeScloseOperation (javax.swing.windowconstants.exit_on_closeSloseOperation ( ); // 添加全局键盘监听 Manajer KeyboardFocusManager = keyboardFocusManager.getCurrentKeyboardFocusManager (); Manager.AddKeyEventPostProcessor ((KeyEventPostProcessor) this.getMyKeyEventHandler ());}/** * 初始化地图 */public void init () {jpanel ()); Jpanel (gridlayout baru (baris, kolom, 1, 1)); setLayout (borderlayout baru ()); untuk (int x = 0; x <baris; x ++) {for (int y = 0; y <kolom; y ++) {ImageIcon ImageIcon; if (x == 0 || x == baris - 1 || y == 0 || y == kolom - 1) { ImageIcon = new ImageIcon ("Image/Red.jpg", "");} else {ImageIcon = new ImageIcon ("Image/White.jpg", "");} gambar [kolom * x + y] = Jlabel baru ( Imageicon); p.add (gambar [kolom * x + y]);}} getContentPane (). Tambah (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_upode ) {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;} lain jika (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 (); jika (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 (); snakode pnow = snaketailer; while (pnow! = null) {if (pnow == snakeheader) {break;} pnow. setx (pnow.Gesaread (). getx ()); pnow.sety (pnow.Gesaread (). gety ()); power = pnow.Gesaread ();} if (driection_now == kanan) {snakeheader.sety (snakeheader .gety () + 1);} lain jika (driection_now == kiri) {snakeheader.sety (snakeheader.gety () - 1);} lain jika (driection_now == atas) {snakeheader.setx (snakeheader.getx () - 1);} lain jika (driection_now == turun) {snakeheader.setx (snakeheader.getx () + 1);}} public static void addtail () {snakenode tail = snakenode baru (tailx, taily); snaketailer.setNext (tail); tail.setahead (snaketailer); snaketailer = snaketailer.getNext ();} public static snakenode getFood () {snakenode food = new snakenode (); boolean bendera = true; while (true) {int x = acak baru (acak baru (); boolean bendera = true; while (true) {int x = random baru (acak baru (); boolean bendera = true; while (true) {int x = new random baru () .nextInt (baris); int y = acak baru (). NextInt (kolom); if (x == 0 || x == baris - 1 || y == 0 || y == Kolom - 1) {lanjutan;} snakenode pNow = snakeheader; while (pnow! = null) {if (x == pnow.getx () && y == pNow.gety ()) {flag = false;} power = pNow.getNext ();} if (flag) {food = new snakenode (x, y); break;}} return food;} public static boolean judgeend () {// 碰墙判断 if (snakeheader.getx ( ) == 0 || power = snakeheader.getNext (); while (pNow! = null) {if (snakeheader.getx () == pNow.getx () && snakeheader.gety () == pNWOW.gety ()) {System.out.println ("========= 碰到身体 ==========="); return true;} pnow = pnow.getNext ();} return false;}}