使用雙向鍊錶實現貪吃蛇程序
1.鍊錶節點定義:
軟件包snake; public class snakenode {private int x; private int y; private snakenode next; private snakenode; prublic snakenode(){} public snakenode(int x,int x,int y){super(super(super(); this.x = x; this; this; this; this; this; this; this; this; 。 。 .ahead =前面;}}}
主程序:
軟件包snake; import java.awt.borderlayout; import java.awt.gridlayout; import java.awt.keyeventpostprocessor; import java.ava.awt.keyboard.keyboardfocusmanager; impt swing.imageicon; import javax.swing.jframe; import javax .swing.jlabel; import javax.swing.joptionpane; import javax.swing.jpanel;/***由HackCoder創建的。 */公共類蛇擴展jframe {私有靜態最終int行= 60;私有靜態最終int列= 80; // private static final int = 1; private static final int int = 2; private static final = 2; private static final final int int = 3 ;私有靜態最終int左= 4; private static int driection_now =右;私有靜態boolean iseat = false; private static int tailx; private static int taily;私人靜態snakenode snakeheader = new snakeDer = new snakenode() ;私人靜態snakenode snaketaDe snaketailer snaketailer = snakeheader; snakeheader;私有靜態snakode food = new snakenode();私有靜態jlabel [] images = new Jlabel [rows * columns]; public static void main(string args []){snakeheader. setx(new andar andyx。 ); snakeheader.sety(new Random()。nextInt(列-1)); snake snake = new Snake(); food = getfood(); while(true){try {next {next( ); // if(food.getx()== snakeheader.getx()&& food.gety()== snakeheader.gety()){addtail(); iseat = true;} // iseat){food = getfood ();} // if(judreend()){joptionpane.showmessagedialog(null,“ null,“”,“ 遊戲結束!”,joptionpane.error_message); pnow = snakeheader; while(pnow!= null){images [ columns * pnow.getx() + pnow.gety()]。seticon(new Imageicon(“ image/image/black.jpg”,“”); pnow = pnow = pnow = pnow .getNext();}圖像[列* food.getx() + food.gety()]。seticon(new Imageicon(“ image/black.jpg”,“”)); thread.sleep(100); //清理pnow = snakeheader; while(pnow! = null){images [columns * pnow.getx() + pnow.gety()]。seticon(new Imageicon(“ image/primags/white.jpg”,“”)); pnow = pnow = pnow = pnow.getNext ();} images [columns * 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,400); this.set.setvisible(true); setDefaultCloseOperation(javax.swing.window. window.window.exit_on_close.exit_close.exit_close.exit_close.exit_close.exit_close. ); //添加全局鍵盤監聽鍵beyboardfocusmanager = keyboardfocusmanager.getCurrentKeyboardFocusManager(); Manager.AddKeyEventPostProcessor((((keyeventPostProcessor)this.getMyKeyKeyKeyekekeyeventLer(keyeventPostProcessor)this. getMyKeyKeyekeyeventler() jpanel(new gridlayout(行,列,1,1)); setLayout(new BorderLayout()); for(int x = 0; x <rows; 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”,“”);} images [columns * x + y] = new jlabel(new jlabel( imageicon); p.Add(圖像[列* x + y]);}} getContentPane()。add(p,borderlayout.center);}/** *鍵盤監聽* * * * @return */public keyeventPostProcessor getMyKeyKeyKeyKeyekeyEventHandler() {返回new KeyEventPostProcessor(){public boolean tostprocesskeyevent(keyevent e){if(e.getId()!= keyevent.key_presse) ){if(snakeheader.getNext()!= null) {//判斷方向是否可轉int x1 = snakeheader.getx(); int y1 = snakeheader.gety(); int x2 = snakeheader.getNext()。 ); int y2 = snakeheader.getNext()。gety(); if(y1 == y2 && x1 -x2 == 1){return true;}} driection_now = up;} else;} else if(keyCode == keyevent.vk_right) {if(snakeheader.getNext()!= null) {int x1 = snakeheader.getx(); int y1 = snakeheader.gety(); int x2 = 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()。 (y1 == y2 && x2 -x1 == 1){return true;}} driection_now = down;} else if( keyCode == keyevent.vk_left){if(snakeheader.getNext()!= null){int x1 = null){int x1 = snakeheader.getx(); int y1 = snakeheader.gety(); int x2 = snakeheader.getNext ()。getx(); int y2 = snakeheader.getNext()。 y2 == 1){return true;}} driection_now = left;} return true;}};}/** * * * * @param header * /public static void next(){如果(SnakeHeader == null)返回; tailx = snaketailer.getx(); taily = snaketailer.gety(); snakenode pnow = snaketailer; while while(pnow!= null){if(pnow === snakeheader) setX(pnow.getAhead()。getx()); pnow.sety(pnow.getahead()。gety()); pnow = pnow = pnow.getahead();} if(driection_now == right ) 。 -1);} else if(driection_now == down){snakeheader.setx(snakeheader.getx() + 1);}} public static void addtail(){snakenode tail = new snakenode = new snakenode(pailx,taily ) (尾巴); tail.setahead(snaketailer); snaketailer = snaketailer.getNext();} public static snakenode getfood(){snakenode food = new snakenode(); boolean flag = true; ().nextint(rows); int y = new Random()。nextint(列); if(x == 0 || x ==行-1 || y == 0 || y ==列-1){contine;} snakenode pnow = snakeheader; while(pnow!= null){if(x == pnow.getx()&& y == pnow.gety()){flag = falle;} pnow = pnow.getNext();} if(flag){fag = new snakenode(x,y); break;}}返回食物;} public static boolean judgrean judgreand judgeend(){//碰牆判斷(snakeheader.getx ( )== 0 || pnow = snakeheader.getNext(); while(pnow!= null){if(snakeheader.getx()== pnow.getx()&& snakeheader.gety()== pnow.gety() (“ =======================”);返回true;} pnow = pnow = pnow.getNext();} return false;}}}}