使用双向链表实现贪吃蛇程序
1. 链表节点定义:
แพ็คเกจงู; คลาสสาธารณะ snakenode {ส่วนตัว int x; int ส่วนตัว y; snakenode ส่วนตัวถัดไป; snakenode ส่วนตัวข้างหน้า; snakenode สาธารณะ () {} snakenode สาธารณะ (int x, int y) {super (); this.x = x; .y = y;} public int getx () {return x;} โมฆะสาธารณะ setx (int x) {this.x = x;} public int getey () {return y;} โมฆะสาธารณะ sety (int y) {สิ่งนี้ .y = y;} public snakenode getNext () {return next;} โมฆะสาธารณะ setNext (snakenode ถัดไป) {this.next = ถัดไป;} snakenode สาธารณะ getAhead () {กลับไปข้างหน้า;} โมฆะสาธารณะ setahead (snakenode ข้างหน้า) .Ahead = ข้างหน้า;}}
主程序:
แพ็คเกจงู; นำเข้า java.awt.borderlayout; นำเข้า java.awt.gridlayout; นำเข้า java.awt.keyeventpostprocessor; นำเข้า java.awt.keyboardfocusmanager; นำเข้า java.awt.event.keyevent; Swing.imageicon; นำเข้า Javax.swing.jframe; นำเข้า Javax.swing.jlabel; นำเข้า Javax.swing.joptionpane; นำเข้า Javax.swing.jpanel;/*** สร้างโดย Hackcoder เมื่อวันที่ 15-3-11 */Snake คลาสสาธารณะขยาย JFrame {แถวสุดท้ายคงที่ INT แถวสุดท้าย = 60; คอลัมน์ int สุดท้ายคงที่ส่วนตัว = 80; // 方向ส่วนตัวคงที่ int up = 1; INT คงที่ส่วนตัว INT ขวา = 2; ; int สุดท้ายคงที่ส่วนตัว = 4; ส่วนตัวคงที่ int driection_now = ขวา; บูลีนคงที่ส่วนตัว iseat = false; tailx int คงที่ส่วนตัว; ส่วนตัวคงที่ taily; อาหารคงที่ส่วนตัว snakenode food = new snakenode (); private static jlabel [] images = new Jlabel [rows * คอลัมน์]; โมฆะคงที่สาธารณะหลัก (String args []) {Snakeheader.setx ); if (food.getx () == snakeheader.getx () && food.gety () == snakeheader.gety ()) {addtail (); iseat = true;} // 吃到食物, 重新生成一个食物重新生成一个食物重新生成一个食物重新生成一个食物重新生成一个食物重新生成一个食物,,, iseat) {food = getFood ();} // 判断是否结束游戏ถ้า (ผู้ตัดสิน ()) {joptionpane.showmessagedialog (null, "游戏结束!", "游戏结束!", joptionpane.error_message); break;} snakenode pnow = snakeheader; ในขณะที่ (pnow! = null) {images [คอลัมน์ * pnow.getx () + pnow.gety ()]. seticon (imageicon ใหม่ ("image/black.jpg", "")); pnow = pnow .getNext ();} ภาพ [คอลัมน์ * food.getx () + food.gety ()]. seticon (imageicon ใหม่ ("image/black.jpg", "")); thread.sleep (100); //清理 pnow = snakeheader; ในขณะที่ (pnow! = null) {images [คอลัมน์ * pnow.getx () + pnow.gety ()]. seticon (imageicon ใหม่ ("image/white.jpg", "")); pnow = pnow.getNext ();} ภาพ [คอลัมน์ * food.getx () + food.gety ()]. seticon (imageicon ใหม่ ("image/white.jpg", "")); iseat = false;} catch e) {e.printstacktrace ();}}} งูสาธารณะ () {init (); this.setbounds (80, 80, 400, 400); this.setVisible (จริง); setDefaultCloseoperation ); // 添加全局键盘监听 KeyboardFocusManager Manager = KeyBoardFocusManager.getCurrentKeyBoardFocusManager (); manager.addkeyEventPostProcessor ((KeyEventPostProcessor) this.getMyKeyEventHandler ());}/** * JPanel (ใหม่ gridlayout (แถว, คอลัมน์, 1, 1)); setLayout (ใหม่ BorderLayout ()); สำหรับ (int x = 0; x <แถว; x ++) {สำหรับ (int y = 0; y <คอลัมน์; imageicon = ใหม่ imageicon ("image/red.jpg", "");} else {imageicon = new imageicon ("image/white.jpg", "");} ภาพ [คอลัมน์ * x + y] = new Jlabel ( imageicon); p.add (รูปภาพ [คอลัมน์ * x + y]);}} getContentPane (). เพิ่ม (P, BorderLayout.Center);}/** * 键盘监听 * * @return */Public KeyEventProcessor GetMyKeyEventHandler () {ส่งคืน KeyEventPostProcessor ใหม่ () {Public Boolean PostprocessKeyEvent (KeyEvent E) {ถ้า (e.getId ()! = keyVent.key_pressed) {return false;} int keycode = e.getKeyCode (); ) {ถ้า (snakeheader.getNext ()! = null) {// 判断方向是否可转 int x1 = snakeheader.getx (); int y1 = snakeheader.gety (); int x2 = snakeheader.getNext (). getx ( ); int y2 = snakeheader.getNext (). gety (); ถ้า (y1 == y2 && x1 - x2 == 1) {return true;}} driection_now = up;} อื่นถ้า (keyevent.vk_right) {ถ้า (snakeheader.getNext ()! = null) {int x1 = snakeheader.getx (); int y1 = snakeheader.gety (); int x2 = snakeheader.getNext (). getx (); int y2 = snakeheader.getNext () .gety (); ถ้า (x1 == x2 && y2 - y1 == 1) {return true;}} driection_now = ขวา;} อื่นถ้า (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;}} driection_now = down;} else ถ้า (keycode == keyeVent.vk_left) {ถ้า (snakeheader.getNext ()! = null) {int x1 = snakeheader.getx (); int y1 = snakeheader.gety (); int x2 = snakeheader.getNext (). getx (); int y2 = snakeheader.getNext (). gety (); ถ้า (x1 == x2 && y1 - y1 - y1 - y1 - y1 - y1 - y1 - y1 - y1 - y1 - y1 y2 == 1) {return true;}} driection_now = left;} return true;}};}/** * 计算贪吃蛇的方向及位移 * * @param ส่วนหัว */โมฆะสาธารณะคงที่ถัดไป () {ถ้าถ้า (Snakeheader == null) return; tailx = snaketailer.getx (); taily = snaketailer.gety (); snakenode pnow = snaketailer; ในขณะที่ (pnow! = null) {ถ้า (pnow == snakeheader) {break;} pnow setx (pnow.getahead (). getx ()); pnow.sety (pnow.getahead (). gety ()); pnow = pnow.getahead ();} ถ้า (driection_now == ถูกต้อง) .gety () + 1);} อื่นถ้า (driection_now == ซ้าย) {snakeheader.sety (snakeheader.gety () - 1);} อื่นถ้า (driection_now == up) {snakeheader.setx (snakeheader.getx () - 1);} อื่นถ้า (driection_now == ลง) {snakeheader.setx (snakeheader.getx () + 1);}} โมฆะคงที่สาธารณะ addtail () {snakenode tail = new Snakenode (tailx, taily); (tail); tail.setahead (snaketailer); snaketailer = snaketailer.getNext ();} สาธารณะคงที่ snakenode getFood () {snakenode อาหาร = new Snakenode (); ธงบูลีน = true; () .nextint (แถว); int y = new random (). nextint (คอลัมน์); ถ้า (x == 0 || x == แถว - 1 || y == 0 || y == คอลัมน์ - 1) {ดำเนินการต่อ;} snakenode pnow = snakeheader; ในขณะที่ (pnow! = null) {ถ้า (x == pnow.getx () && y == pnow.gety ()) {flag = false;} pnow = pnow.getNext ();} ถ้า (ธง) {อาหาร = ใหม่ snakenode (x, y); break;}} คืนอาหาร;} ผู้ตัดสินบูลีนสแตติกสาธารณะ () {// 碰墙判断ถ้า (Snakeheader.getx ( ) == 0 || pnow = snakeheader.getNext (); ในขณะที่ (pnow! = null) {ถ้า (snakeheader.getx () == pnow.getx () && snakeheader.gety () == pnow.gety ()) {system.out.println ("========= 碰到身体 ============"); return true;} pnow = pnow.getNext ();} return false;}}}