บทความนี้แนะนำมินิเกมคลาสสิกที่ใช้โดย Java: Snake ฉันเชื่อว่าทุกคนได้เล่นมันจะทำอย่างไรให้สำเร็จ?
ภาพการทำซ้ำ:
โดยไม่ต้องกังวลใจเพิ่มเติมเพียงแสดงรหัส:
1.
Public Class Greedsnake {โมฆะคงที่สาธารณะหลัก (String [] args) {snakemodel model = ใหม่ snakemodel (20,30); Snakecontrol Control = ใหม่ snakecontrol (รุ่น); SNAKEVIEW VIEW = ใหม่ SNAKEVIEW (รุ่นควบคุม); // เพิ่มผู้สังเกตการณ์และให้มุมมองกลายเป็นผู้สังเกตการณ์ของโมเดลโมเดล AdDoBserver (ดู); (เธรดใหม่ (รุ่น)). start (); -2.
แพ็คเกจ mvctest; // snakecontrol.javaimport java.awt.event.keyevent; นำเข้า java.awt.event.keyListener; คลาสสาธารณะ Snakecontrol ใช้ keyListener {โมเดล Snakemodel; สาธารณะ snakecontrol (โมเดล Snakemodel) {this.model = model; } void public keypressed (keyevent e) {int keycode = e.getKeyCode (); if (model.running) {// สวิตช์คีย์ที่ประมวลผล (keycode) {case keyevent.vk_up: model.changedirection (snakemodel.up); หยุดพัก; Case KeyEvent.vk_down: model.changedirection (snakemodel.down); หยุดพัก; Case KeyeVent.vk_left: model.changedirection (snakemodel.left); หยุดพัก; Case KeyEvent.vk_right: model.changedirection (snakemodel.right); หยุดพัก; Case KeyEvent.vk_add: Case KeyEvent.vk_page_up: model.speedup (); หยุดพัก; Case KeyEvent.vk_subtract: Case KeyEvent.vk_page_down: model.speeddown (); หยุดพัก; Case KeyEvent.vk_space: Case KeyEvent.vk_p: model.changePausEstate (); หยุดพัก; ค่าเริ่มต้น:}} // คีย์ถูกประมวลผลในทุกกรณีและคีย์ทำให้เกมรีสตาร์ทถ้า (keycode == keyeVent.vk_r || keycode == keyeVent.vk_s || keycode == keyEvent.vk_enter) {model.reset (); }} เป็นโมฆะสาธารณะ Keylelease (KeyEvent E) {} โมฆะสาธารณะ keyTyped (KeyEvent E) {}}3.
แพ็คเกจ mvctest; // snakemodel.javaimport javax.swing.*; นำเข้า java.util.arrays; นำเข้า java.util.linkedlist; นำเข้า java.util.observable; นำเข้า java.util.observable; // ระบุว่ามีตัวงูหรืออาหารที่ตำแหน่ง LinkedList Nodearray = new LinkedList (); // งูร่างกายโหนดอาหาร; int maxx; int maxy; ทิศทาง int = 2; // ทิศทางของบูลีนที่ทำงานของงูทำงาน = เท็จ; // เรียกใช้สถานะ int timinterval = 200; // ช่วงเวลา, มิลลิวินาทีสอง speedChangerate = 0.75; // ทุกครั้งที่บูลีนอัตราการเปลี่ยนแปลงความเร็วหยุดชั่วคราว = เท็จ; // หยุดการตั้งค่าสถานะ int คะแนน = 0; // คะแนน int countmove = 0; // จำนวนครั้งที่คุณย้ายก่อนที่จะกินอาหาร // ขึ้นและลงควรเป็นคู่ // ขวาและซ้ายควรเป็นสิ่งสุดท้ายที่ไม่คงที่สาธารณะคงที่ int up = 2; สาธารณะคงที่สุดท้าย int ลง = 4; สาธารณะคงที่สาธารณะคงสุดท้ายซ้าย = 1; สาธารณะคงที่สาธารณะสุดท้ายขวา = 3; สาธารณะ snakemodel (int maxx, int maxy) {this.maxx = maxx; this.maxy = maxy; รีเซ็ต (); } การรีเซ็ตโมฆะสาธารณะ () {direction = snakemodel.up; // ทิศทางของงูที่ใช้เวลา TimeLinval = 200; // ช่วงเวลาเวลามิลลิวินาทีหยุดชั่วคราว = เท็จ; // pause flag score = 0; // คะแนน CountMove = 0; // จำนวนครั้งก่อนที่จะกินอาหาร // matirx เริ่มต้นทั้งหมดที่ชัดเจน 0 เมทริกซ์ = บูลีนใหม่ [maxx] []; สำหรับ (int i = 0; i <maxx; ++ i) {matrix [i] = boolean ใหม่ [maxy]; array.fill (matrix [i], false); } // เริ่มต้นงู // เริ่มต้นตัวงูถ้ามีตำแหน่งแนวนอนมากกว่า 20 ตำแหน่งความยาวคือ 10 มิฉะนั้นจะเป็นครึ่งหนึ่งของตำแหน่งแนวนอน int initarrayLength = Maxx> 20? 10: Maxx / 2; NodeArray.Clear (); สำหรับ (int i = 0; i <initarrayLength; ++ i) {int x = maxx / 2 +i; // maxx เริ่มต้นเป็น 20 int y = maxy / 2; // maxy เริ่มต้นเป็น 30 // nodearray [x, y]: [10,15]-[11,15]-[12,15] ~~ [20,15] // ทิศทางการวิ่งเริ่มต้นขึ้นดังนั้นในตอนต้นของเกม Notearray กลายเป็น: // [10,14]-[10,15]-[11,15] โหนด (x, y)); เมทริกซ์ [x] [y] = true; } // สร้างอาหารอาหาร = createFood (); เมทริกซ์ [food.x] [food.y] = true; } โมฆะสาธารณะเปลี่ยนทิศทาง (int newDirection) {// ทิศทางที่เปลี่ยนแปลงไม่สามารถอยู่ในทิศทางเดียวกันหรือกลับไปสู่ทิศทางดั้งเดิมถ้า (ทิศทาง % 2! = newDirection % 2) {ทิศทาง = newDirection; }} บูลีนสาธารณะ moveOn () {node n = (node) nodearray.getFirst (); int x = nx; int y = ny; // เพิ่มและลดค่าพิกัดตามสวิตช์ทิศทาง (ทิศทาง) {case up: y--; หยุดพัก; กรณีลง: y ++; หยุดพัก; กรณีซ้าย: x--; หยุดพัก; กรณีขวา: x ++; หยุดพัก; } // ถ้าพิกัดใหม่อยู่ในช่วงที่ถูกต้องให้ประมวลผลถ้า ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {ถ้า (เมทริกซ์ [x] [y]) {// ถ้ามีบางสิ่งบางอย่างอยู่ในจุดใหม่ Nodearray.addfirst (อาหาร); // ให้ความยาวจากหัวงู // กฎคะแนนเกี่ยวข้องกับจำนวนและความเร็วของการเคลื่อนไหวเปลี่ยนทิศทาง int scoreget = (10,000 - 200 * countmove)/ timeLinterval; คะแนน += คะแนน> 0? คะแนน: 10; CountMove = 0; อาหาร = createFood (); // สร้างเมทริกซ์อาหารใหม่ [food.x] [food.y] = true; // ตั้งค่าตำแหน่งอาหารกลับมาเป็นจริง } อื่น // กินตัวงูตัวเองล้มเหลวกลับเท็จ; } else {// หากไม่มีอะไรอยู่ในจุดในพิกัดใหม่ (ตัวงู) ให้เลื่อนตัวงูงูงู Notearray.addfirst (โหนดใหม่ (x, y)); เมทริกซ์ [x] [y] = true; n = (โหนด) NodeArray.remoVelast (); เมทริกซ์ [nx] [ny] = false; Countmove ++; กลับมาจริง; }} return false; // แตะขอบ, ล้มเหลว} โมฆะสาธารณะเรียกใช้ () {running = true; ในขณะที่ (รัน) {ลอง {thread.sleep (timeinterval); } catch (exception e) {break; } if (! หยุดชั่วคราว) {ถ้า (moveOn ()) {setChanged (); // โมเดลแจ้งข้อมูลมุมมองที่ได้รับการปรับปรุง NotifyObServers (); } else {joptionpane.showMessageDialog (null, "คุณล้มเหลว", "Game Over", Joptionpane.information_message); หยุดพัก; }}} running = false; } โหนดส่วนตัว createFood () {int x = 0; int y = 0; // สุ่มรับตำแหน่งในพื้นที่ที่ถูกต้องซึ่งไม่ทับซ้อนกับตัวงูและอาหารทำ {สุ่ม r = new random (); x = r.nextint (maxx); y = r.nextint (maxy); } ในขณะที่ (เมทริกซ์ [x] [y]); ส่งคืนโหนดใหม่ (x, y); } public void speedup () {timeinterval *= speedChangerate; } โมฆะสาธารณะ Speeddown () {timeLinterval /= speedChangerate; } โมฆะสาธารณะ ChangePausEstate () {หยุดชั่วคราว =! หยุดชั่วคราว; } สตริงสาธารณะ toString () {string result = ""; สำหรับ (int i = 0; i <nodearray.size (); ++ i) {node n = (node) nodearray.get (i); ผลลัพธ์ + = "[" + nx + "," + ny + "]"; } ผลตอบแทนผลลัพธ์; }} คลาสโหนด {int x; int y; โหนด (int x, int y) {this.x = x; this.y = y; -4.
แพ็คเกจ mvctest; // snakeview.javaimport javax.swing.*; นำเข้า java.awt.*; นำเข้า java.util.iterator; นำเข้า java.util.linkedlist; นำเข้า java.util.observable; java.util.observer; คลาสสาธารณะ Snakeview ใช้ผู้สังเกตการณ์ {snakecontrol control = null; SNAKEMODEL MODEL = NULL; JFrame เมนเฟรม; Canvas Paintcanvas; jlabel labelscore; Public Static Final Int Canvaswidth = 200; Public Static Final Int Canvasheight = 300; public Static Final Int NodeWidth = 10; public Static Final int nodeheight = 10; SNAKEVIEW สาธารณะ (SNAKEMODEL MODEL, SNAKECONTROL CONTROL) {this.model = model; this.control = การควบคุม; mainFrame = new JFrame ("GreedSnake"); คอนเทนเนอร์ cp = mainframe.getContentPane (); // สร้างคะแนนสูงสุดแสดง labelscore = new JLabel ("คะแนน:"); cp.add (labelscore, borderlayout.north); // สร้างพื้นที่แสดงเกมกลาง PaintCanvas = new Canvas (); PaintCanvas.setsize (Canvaswidth + 1, Canvasheight + 1); PaintCanvas.addkeyListener (ควบคุม); cp.add (Paintcanvas, Borderlayout.center); // สร้างแถบช่วยเหลือด้านล่าง JPanel PanelButTom = new JPanel (); PanelButtom.SetLayout (New BorderLayout ()); Jlabel LaBelHelp; LABELHELP = ใหม่ JLabel ("PageUp, Pagedown for Speed;", Jlabel.Center); PanelButtom.add (LaBelHelp, BorderLayout.north); laBelHelp = new JLabel ("Enter หรือ R หรือ S สำหรับการเริ่มต้น;", Jlabel.Center); PanelButtom.add (LaBelHelp, BorderLayout.Center); labelhelp = new Jlabel ("Space หรือ P สำหรับการหยุดชั่วคราว", jlabel.center); PanelButtom.add (LaBelHelp, BorderLayout.South); cp.add (PanelButtom, BorderLayout.South); mainframe.addkeyListener (ควบคุม); mainframe.pack (); mainframe.setResizable (เท็จ); mainframe.setDefaultCloseOperation (jframe.exit_on_close); mainframe.setVisible (จริง); } void repaint () {กราฟิก g = paintcanvas.getGraphics (); // วาดพื้นหลัง g.setColor (color.white); G.FillRect (0, 0, Canvaswidth, Canvasheight); // วาดงู g.setColor (color.black); linkedList na = model.nodearray; ตัววนซ้ำมัน = na.iterator (); ในขณะที่ (it.hasnext ()) {node n = (node) it.next (); Drawnode (G, N); } // วาดอาหาร G.SetColor (color.Red); โหนด n = model.food; Drawnode (G, N); UPDATESSCORE (); } โมฆะส่วนตัว DrawNode (กราฟิก g, โหนด n) {g.fillrect (nx * nodeWidth, ny * nodeheight, nodeWidth - 1, nodeheight - 1); } โมฆะสาธารณะ updateScore () {string s = "คะแนน:" + model.score; labelscore.settext (s); } การอัปเดตโมฆะสาธารณะ (สังเกต o, Object arg) {repaint (); -จุดประสงค์ของบทความนี้คือการพาคุณไปที่ระลึกถึงคลาสสิก แต่จุดประสงค์ที่สำคัญกว่าคือช่วยให้คุณเรียนรู้การเขียนโปรแกรม Java ได้ดี