使用双向链表实现贪吃蛇程序
1.链表节点定义:
パッケージスネーク;パブリッククラスSnakeNode {private int x; private int y; private snakenode next; private snakenode fore; public snakenode(){} 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 .y = y;} public snakenode getNext(){return next;} public void setnext(snakenode next){this.next = next;} public snakenode getahead(){return fore;} public void setahead(snakenode fore){this this this .ahead = afver;}}
主程序:
パッケージヘビ; java.awt.borderlayout;インポートjava.awt.gridlayout; Import java.awt.keyeventpostprocessor; Import java.awt.keyboardfocusmanager; Import java.awt.awt.event.keyevent; Import Java.util.util.random; Import Javax; swing.imageicon; Import javax.swing.jframe; Import javax.swing.jlabel; Import javax.swing.joptionpane; Import javax.swing.jpanel;/*** HackCoderが15-3-11に作成しました。 */public class Snake拡張jframe {private static final int rows = 60; private static final int columns = 80; // ; private static final int left = 4; private static int driection_now = right; private static boolean iseat = false; private static int taily; private static snakenode snakeNode(); private static snakenode snakeTailer = snakeHeader; private static snakenode food = new Snakenode(); private static jlabel [] images = new jlabel [rows * columns]; public static void main(string args []){snakeheader.setx(new random()。nextint(rows -1 -1 1 ); snakeheader.sety(new random()。nextint(columns -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();} // pnow = snakeheader; while(pnow!= null){images [columns * pnow.getx() + pnow.gety()]。 .getNext();} images [columns * food.getx() + food.gety()]。seticon(new ImageIcon( "image/black.jpg"、 ""); swree.sleep(100); // pnow = snakeheader; while(pnow!= null){images [columns * pnow.getx() + pnow.gety()]。 pnow.getNext();}画像[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); this.setVisible(true); setDefaultCloseoperation(javax.swing.windowconstants.exit_on_close ; // 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 ==列-1){ ImageIcon = new ImageIcon( "Image/Red.jpg"、 "");} else {ImageIcon = new ImageIcon( "image/white.jpg"、 "");} images [columns * x + y] = new Jlabel( ImageIcon); p.add(images [columns * x + y]);}} getContentPane()。add(P、borderlayout.center);}/** *键盘监听 * * @return */publy keyeventpostprocess {return new KeyEventPostProcessor(){public boolean postprocesskeyevent(keyevent e){if(e.getid()!= keyevent.key_pressed){return false;} int keycode = e.getkeycode(); if(keycode == keyevent.vk_up_up_up ){if(snakeheader.getNext()!= null){// ); int y2 = snakeheader.getNext()。gety(); if(y1 == y2 && x1 -x2 == 1){return true;}} driection_now = up;} {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()。 (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 = left;} return true;} (snakeheader == null)return; tailx = snaketailer.getx(); taily = snaketailer.gety(); snakenode pnow = snaketailer; setx(pnow.getahead()。getx()); pnow.sety(pnow.getahead()。gety()); pnow = pnow.getahead();} if(driection_now == right){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 snakenode(taily、taily); snaketailer.setnextnextnext (テール); 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){続行;} snakenode pnow = snakeheader; while(pnow!= null){if(x == pnow.getx()&& y == pnow.gety()){flag = false;} pnow = pnow.getnext();} if(flag){food = new snakenode(x、y); break;}} return food;} public static boolean juderend(){//碰墙判断if(snakeheader.getx( )== 0 || snakeheder.gether.gety()== 0 || pnow = snakeheader.getnext(); while(pnow!= null){if(snakeheader.getx()== pnow.getx()&& snakeheader.gety()== pnow.gety(){system.out.printlnnnn ( "=========碰到身体============="); return true;} pnow = pnow.getNext();} return false;}}}