使用双向链表实现贪吃蛇程序
1. : :
حزمة الأفعى ؛ الفئة العامة snakenode {private int x ؛ private int y ؛ snakenode private ؛ snakenode private ؛ .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 ؛} snakenode getNext () {return next ؛} public void setNext (snakenode التالي) {this.next = next ؛} .head = ostl ؛}}
: :
حزمة الأفعى ؛ استيراد java.awt.borderlayout ؛ استيراد java.awt.gridlayout ؛ import java.awt.keyeventpostprocessor ؛ import swing.imageicon ؛ import javax.swing.jframe ؛ import javax.swing.jlabel ؛ import javax.swing.joptionpane ؛ import javax.swing.jpanel ؛/*** تم إنشاؤه بواسطة hackcoder في 15-3-11. */Snake من الفئة العامة يمتد JFrame {صفوف int Final Static الخاصة = 60 ؛ أعمدة int النهائية الثابتة الخاصة = 80 ؛ // 方向 Final Final int up = 1 ؛ Final Final Final static at = 2 ؛ Private Static Final Down = 3 ؛ int static int static private int = 4 ؛ int static int int driection_now = اليمين ؛ iseat الثابتة الخاصة = false ؛ private static int tailx ؛ private static int taily ؛ private static snakenode snakehheader = جديد snakenode () snakenode snakenode الخاص = جديد snakenode () ؛ jlabel الثابت الخاص [] الصور = new Jlabel [صفوف * أعمدة] ؛ الفراغ الثابت العام (سلسلة args []) {SnakeHeader.setx (New Random (). )) ؛ SnakeHeader.sety (new Random (). NextIns (أعمدة - 1)) ؛ ثعبان الأفعى = Snake جديد () ؛ Food = getFood () ؛ بينما (صحيح) {try {next () ؛ // 吃到了食物if (food.getx () == SnakeHeader.getx () && food.gety () == SnakeHeader.gety ()) {addtail () ؛ iseat = true ؛} // 吃到食物 重新生成一个食物 重新生成一个食物 if ( iseAt) {food = getFood () ؛} // 判断是否结束游戏 if (judgeend ()) {joptionpane.showmessagedialog (null ، "游戏结束!" ، "游戏结束!" ، joptionpane.error_message) ؛ break ؛} snakenode pnow = snakeHeader ؛ بينما (pnow! = null) {صور [أعمدة * pnow.getx () + pnow.gety ()]. .getnext () ؛} الصور [الأعمدة * food.getx () + food.gety ()].清理 pnow = SnakeHeader ؛ بينما (pnow! = null) {صور [أعمدة * pnow.getx () + pnow.gety ()]. pnow.getnext () ؛} الصور [أعمدة * food.getx () + food.gety ()]. seticon (صورة جديدة ("image/white.jpg" ، "")) ه) { ). JPanel (GridLayout جديد (صفوف ، أعمدة ، 1 ، 1)) ؛ setLayout (new BorderLayout ()) ؛ for (int x = 0 ؛ x <الصفوف ؛ x ++) {for (int y = 0 ؛ y <أعمدة ؛ 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" ، "") ؛} الصور [أعمدة * x + y] = new jlabel ( ImageIcon) ؛ P.Add (صور [أعمدة * x + y]) ؛}} getContentPane (). add (p ، borderlayout.center) ؛}/** * 键盘监听 * * regurn */public keyeventpostprocessor getMyKeyeventHandler () {return new KeyEventPostProcessor () {public boolean postprocesskeyevent (keyevent e) {if ( ) {if (SnakeHeader.getNext ()!! = null) {// 判断方向是否可转 int x1 = snakeHeader.getx () ؛ int y1 = snakeheader.gety () ؛ int x2 = snakeader.getNext (). getx ( )) {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 ؛} آخر إذا (keycode == keyevent.vk_down) {if (snakeader.getNext () ! = null) {int x1 = snakeheader.getx () ؛ int y1 = snakeHeader.gety () ؛ int x2 = snakeHeader.getNext (). (y1 == y2 && x2 - x1 == 1) {return true ؛}} driection_now = down ؛} آخر إذا (keycode == keyevent.vk_left) {if (snakeader.getNext ()! = 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 ؛} إرجاع true ؛}} ؛}/** * 计算贪吃蛇的方向及位移 * * param header */public static void next () {if (SnakeHeader == null) return ؛ tailx = snaketailer.getx () ؛ taily = snaketailer.gety () ؛ snakenode pnow = snaketailer ؛ بينما (pnow! = null) {if (pnow == snakeader) {break ؛} pnow. setx (pnow.getahead (). getx ()) ؛ pnow.sety (pnow.getahead (). .gety () + 1) ؛} آخر إذا (driection_now == يسار) {snakeHeader.sety (snakeHeader.gety () - 1) ؛} آخر if (driection_now == up) {snakeader.setx (snakeader.getx () - 1) ، (tail) ؛ tail.setahead (snaketailer) ؛ snaketailer = snaketailer.getNext () ؛} snakenode static public getFood () {snakenode food = new snakenode () ؛ boolean flag = true ؛ () .NextInt (صفوف) ؛ int y = new Random (). nextInt (أعمدة) ؛ if (x == 0 || x == صفوف - 1 || y == 0 || y == أعمدة - 1) {متابعة ؛} snakenode pnow = snakeHeader ؛ بينما (pnow! = null) {if (x == pnow.getx () && y == pnow.gety ()) {flag = false ؛} pnow = pnow.getNext () ؛} if (flag) {food = new snakenode (x ، y) ؛ break ؛}} إرجاع الطعام ؛} القاضي المنطقي الثابت العام () {// 碰墙判断 if (snakeader.getx ( ) == 0 || pnow = snakeHeader.getNext () ؛ بينما (pnow! = null) {if (snakeHeader.getx () == pnow.getx () && snakeheader.gety () == pnow.gety ()) ("========== 碰到身体 =============")