使用双向链表实现贪吃蛇程序
1. : :
Package Snake; Public Class Snakenode {private int x; private int y; private snakenode next; private snakenode () 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 next;} public void setnext (snakenode next) {this.next = next;} public snakenode getahead () {return;} public void setahead (snakenode peare) {this .ahead = present;}}
主程序 :
패키지 뱀; import java.awt.borderlayout; import java.awt.gridlayout; import java.awt.keyeventpostprocessor; import java.awt.keyboardfocusmanager; import java.awt.event.event.keyevent; import java.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 up = 1; private static final int right = 2; private static final int down = 3 ; 개인 정적 최종 int 왼쪽 = 4; 개인 정적 int driesection_now = 오른쪽; 개인 정적 부울 iseat = false; private static int tailx; private static snakenode snakeHeader = new snakenode (); 개인 정적 snaketailer = snakeHeader; 개인 정적 snakenode food = new snakenode (); private static jlabel [] images = new jlabel [rows * columns]; public static void main (String args []) {snakeheader.setx (new random (). nextint (행 -1) )); snakeHeader.sety (new random (). nextInt (열 -1)); 뱀 뱀 = new Snake (); food = getfood (); if (food.getx () == snakeHeader.getx () && food.gety () == snakeHeader.gety ()) {addtail (); iseat = true;} // 吃到食物 吃到食物, 重新生成一个食物 if (if) iseat) {food = getfood ();} // 判断是否结束游戏 if (judgeend ()) {joptionpane.showmessagedialog (null, "游戏结束!", "游戏结束!", joptionpane.error_message); break;} snakenode pnow = snakeheader; while (pnow! = null) {images [columns * pnow.getx () + pnow.gety ()]. seticon (new imageicon ( "image/black.jpg", ""); pnow = pnow .getNext ();} 이미지 [columns * 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/white.jpg", ""); pnow = pnow.getnext ();} 이미지 [columns * food.getx () + food.gety ()]. seticon (new imageicon ( "image/white.jpg", ""); iseat = false;} catch (InterpruptedException e) {e.printstacktrace ();}}} public snake () {init (); this.setbounds (80, 80, 400, 400); this.set -visible (true); setDefaultCloseOperation (javax.swing.windowConstants.exit_on_close ); // 添加全局键盘监听 keyboardfocusmanager manager = keyboardfocusmanager.getCurrentKeyboardFocusManager (); Manager.AddKeyEventPostProcessor ((keyEventPostProcessor) this.getMyEeventhandler ()); JPANEL (New GridLayout (행, 열, 1, 1)); setLayout (new BorderLayout ()); for (int x = 0; x <행; x ++) {for (int y = 0; y <열; y ++) {imageicon imageicon; if (x == 0 || x == 행 -1 || y == 0 || y == 열 - 1) { imageicon = new ImageIcon ( "image/red.jpg", "");} else {imageicon = new ImageIcon ( "im imageicon); p.add (이미지 [열 * x + y]);}} getContentPane (). add (p, borderlayout.center);}/** * * @return */public keyeventPostProcessor getmyeventhandler () {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 )) {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;}} driesection_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;}} dripection_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 (); (y1 == y2 && x2 -x1 == 1) {return true;}}}}}} driace_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;}} driesection_now = 왼쪽;} return true;}};}/** * * * @param header */public static void next () {if (snakeHeader == null) return; 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 ()); pnow = pnow.getahead ();} if (dripection_now == right) {snakeHeader.sety (snakeHeader .gety () + 1);} else if (driesection_now == left) {snakeHeader.sety (snakeHeader.gety () -1);} else if (driesection_now == UP) {snakeHeader.setx (snakeHeader.getx () -1);} else if (driesection_now == down) {snakeheader.setx (snakeheader.getx () + 1);}} public static void addtail () {snakenode tail = new snakenode (tailx, taily); snaketailer.setnext (tail); tail.setahead (snaketailer); snaketailer = snaketailer.getnext ();} public static snakenode getfood () {snakenode food = new snakenode (); 부울 플래그 = true; () .nextInt (행); 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;}} food;} public static boolean judgeend () {// 碰墙判断 if (snakeHeader.getx (snakeHeader.getX) ) == 0 || pnow = snakeHeader.getNext (); while (pnow! = null) {if (snakeHeader.getx () == pnow.getx () && snakeHeader.gety () == pnow.gety ()) {system.out.println ( "========== 碰到身体 =========="); return true;} pnow = pnow.getNext ();} return false;}}