使用双向链表实现贪吃蛇程序
1. 链表节点定义 :
Package Snake; öffentliche Klasse Snakakenode {private int x; private int y; private snakakenode als nächstes; private snakakenode voraus; public snakakenode () {} public snakenode (int x, int y) {Super (); this.x = x; this 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 this .y = y;} public snakakenode getNext () {return Next;} public void setNext (SnakaNode Next) {this.Next = next;} public snakenode getahead () {return voraus;} public void setaDead (Snakenode im Voraus) {this this .Head = voraus;}}
主程序 :
Paket Snake; Import Java.awt.BorderLayout; Import Java.awt.GridLayout; Import Java.awt.KeyeventPostProcessor; Import Java.awt.KeyboardfocusManager; Import Java.awt.Event.Elyevent; Import Java.util.Random; Javax. Swing.imageicon; Import Javax.swing.jframe; Import Javax.swing.jlabel; Import Javax.swing.JoptionPane; Import Javax.swing.jpanel;/*** Erstellt von Hackcoder am 15.11.11. */öffentliche Klasse Snake erweitert JFrame {private statische endgültige int Zeilen = 60; Private statische endgültige int -Spalten = 80; // 方向 Private statische endgültige int up = 1; Private statische endgültige int rechts = 2; ; Private statische endgültige int links = 4; private static snakenode food = new Snakenode (); private statische jlabel [] Images = new JLabel [Zeilen * Spalten]; Public static void main (String args []) {SnakeHeader.setx (new randal (). Nextint (Zeilen - 1 )); SnakeHeader. if (food.getX () == SnakeHeader.getX () && food.gety () == SNAKEHEHER.gety ()) {addTail (); iseat = true;} // 吃到食物 , 重新生成一个食物 if (if ( Isat) {food = getfood ();} // 判断是否结束游戏 if (judgeend ()) {joptionpane.showmessagedialog (null, "游戏结束!", "游戏结束!", joptionpane.error_message); Break;} Snakade Pnow = SnakeHeader; while (pnow! = null) {Bilder [Spalten * pnow.getX () + pnow.gety ()]. .GetNext ();} Images [Spalten * food.getX () + food.gety ()]. seticon (neues ImageCon ("Image/Black.jpg", ""); Thread.Sleep (100); //清理 pnow = snakeHeader; while (pnow! pnow.getNext ();} Bilder [Spalten * food.getX () + food.gety ()]. seticon (neues ImageCon ("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_on_closeOpe ); // 添加全局键盘监听 KeyboarFocusManager Manager = keyboarFocusManager.getCurrentKeyboardFocusManager (); Jpanel (neuer GridLayout (Zeilen, Spalten, 1, 1)); setLayout (new BorderLayout ()); für (int x = 0; x <Zeilen; x ++) {for (int y = 0; y <spalten; y ++) {imageCon imageCon; if (x == 0 || x == Zeilen - 1 || y == 0 || y == Spalten - 1) { ImageCon = new ImageCon ("Bild/rot.jpg", "");} else {imageCon = new ImageCon ("Bild/White.jpg", "");} Bilder [Spalten * x + y] = new Jlabel ( ImageCon); P.Add (Bilder [Spalten * x + y]);}} getContentPane (). add (p, borderLayout.Center);}/** * 键盘监听 * * @return */public keyEventPostPostProcessor getMykeyEventHandler () {return new KeyEventPostPROCESSOR () {public boolean postProcessKeyEvent (keyEvent e) {if (e.getId ()! ) {if (SnakeHeader.getNext ()! ); 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 ()! () .gety (); if (x1 == x2 && y2 - y1 == 1) {return true;}} drisection_now = rechts;} else if (KeyCode == KeyEvent.vk_down) {if (Snakeheader.getNext () ! (y1 == y2 && x2 - x1 == 1) {return true;}} driection_now = down;} else if (keyCode == KeyEvent.vk_left) {if (snakheader.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 = links;} return true;}};}/** * 计算贪吃蛇的方向及位移 * * @param Header */public static void next () {wenn . setx (pnow.getahead (). getX ()); pnow.sety (pnow.getahead (). gety ()); .Gety () + 1);} else if (drisection_now == links) {SnakeHeader.sety (SnakeHeader.gety () - 1);} else if (driection_now == up) {Snakeheader.setx (Snakheader.getX ()) - 1);} else if (driection_now == Down) {SnakeHeader.setX (SnakeHeader.getX () + 1);}} public static void addtail () {snakakenode schwanz = new Snakaken (Tailx, Taily); (Schwanz); schwanz.setahead (snaketailer); snaketailer = snaketailer.getNext ();} public static snakaNode getfood () {snakenode food = new Snakakenode (); boolean flag = true; while (true) {int x = new random () .Nextint (Zeilen); int y = new random (). NextInt (Spalten); if (x == 0 || x == Zeilen - 1 || y == 0 || y == Spalten - 1) {Fortsetzung;} snakakenode pnow = snakeheader; while (pnow! pnow = pnow.getNext ();} if (flag) {food = new SnakaNode (x, y); break;}} return food;} public static boolean Judge () {// 碰墙判断 if (Snakeheader.getX (Snakeheader.getX ) == 0 || pnow = snakeHeader.getNext (); while (pnow! ("========== 碰到身体 ==========="); return;} pnow = pnow.getNext ();} return false;}}