Artikel ini merekomendasikan game mini klasik yang diimplementasikan oleh Java: Snake, saya percaya semua orang telah memainkannya, bagaimana mencapainya?
Gambar reproduksi:
Tanpa basa -basi lebih lanjut, cukup sajikan kode:
1.
Public Class Greedsnake {public static void main (string [] args) {snakemodel model = snakemodel baru (20,30); Kontrol snakecontrol = snakecontrol baru (model); Snakeview view = snakeview baru (model, kontrol); // Tambahkan pengamat dan biarkan tampilan menjadi pengamat model model.addobserver (view); (utas baru (model)). start (); }}2.
Paket mvctest; // snakecontrol.javaimport java.awt.event.keyevent; import java.awt.event.keylistener; kelas publik snakecontrol mengimplementasikan keylistener {model snakemodel; snakecontrol publik (model snakemodel) {this.model = model; } public void keypressed (keyevent e) {int keycode = e.getKeyCode (); if (model.running) {// sakelar kunci yang diproses (keycode) {case keyevent.vk_up: model.changedirection (snakemodel.up); merusak; case keyevent.vk_down: model.changedirection (snakemodel.down); merusak; case keyevent.vk_left: model.changedirection (snakemodel.left); merusak; case keyevent.vk_right: model.changedirection (snakemodel.right); merusak; case keyevent.vk_add: case keyevent.vk_page_up: model.speedup (); merusak; case keyevent.vk_subtract: case keyevent.vk_page_down: model.speeddown (); merusak; case keyevent.vk_space: case keyevent.vk_p: model.changePausesTate (); merusak; Default:}} // Kunci diproses dalam kasus apa pun, dan kunci menyebabkan permainan restart jika (keycode == keyevent.vk_r || keycode == keyevent.vk_s || keycode == keyevent.vk_enter) {model.reset (); }} public void keyreleased (keyevent e) {} public void keyTyped (keyevent e) {}}3.
Paket mvctest; // snakemodel.javaimport javax.swing.*; impor java.util.arrays; impor java.util.linkedlist; java.util.observable; impor java.util. // Tunjukkan apakah ada badan ular atau makanan pada posisi LinkedList noTeArray = new LinkedList (); // Makanan Node Tubuh Ular; int maxx; int maxy; arah int = 2; // arah boolean lari ular itu berjalan = false; // Jalankan state int timeInterval = 200; // interval waktu, milidetik ganda speedchangerate = 0,75; // setiap kali laju perubahan kecepatan boolean berhenti = false; // jeda flag int skor = 0; // skor int countmove = 0; // berapa kali Anda pindah sebelum makan makanan // ke atas dan ke bawah harus bahkan // kanan dan kiri harus aneh final statis publik int up = 2; Int final statis publik = 4; Int final statis publik kiri = 1; Hak Int Final Statis Publik = 3; snakemodel publik (int maxx, int maxy) {this.maxx = maxx; this.maxy = maxy; mengatur ulang(); } public void reset () {Direction = snakemodel.up; // arah ular menjalankan waktu interval = 200; // interval waktu, milidetik berhenti = false; // jeda skor flag = 0; // skor countmove = 0; // berapa kali sebelum makan makanan // matirx awal, semua matriks 0 jelas = boolean baru [maxx] []; untuk (int i = 0; i <maxx; ++ i) {matriks [i] = boolean baru [maxy]; Arrays.fill (matriks [i], false); } // Awal ular // Awal badan ular, jika ada lebih dari 20 posisi horizontal, panjangnya 10, jika tidak, itu adalah setengah dari posisi horizontal int initArraylength = maxx> 20? 10: maxx / 2; nodearray.clear (); untuk (int i = 0; i <initArraylength; ++ i) {int x = maxx / 2 +i; // maxx diinisialisasi ke 20 int y = maxy / 2; // Maxy diinisialisasi menjadi 30 // nodearray [x, y]: [10,15]-[11,15]-[12,15] ~~ [20,15] // arah lari default naik, jadi pada awal permainan nodearray menjadi: // [10,14]-[10,15]-[11.15]-[12.14]-[10.15]-[11.15]-[12.14]-[10.15]-[11.15]-[12.14]-[10.15]-[11.15]-[12.14]-[10.15]-[11.15]-[12.14]-[12.15]-[11.15]-[12.14]-[10.15]-[11.15]-[12.14]-[12.15]-[11.15]-[12.14]-[10.15]-[11.15] menjadi: // [12.14]-[10.15]-[11.15] nodearray.addlast (node baru (x, y)); matriks [x] [y] = true; } // Buat makanan makanan = createFood (); matriks [food.x] [food.y] = true; } public void Changedirection (int newDirection) {// arah yang diubah tidak dapat berada di arah yang sama atau dibalik ke arah asli jika (arah % 2! = newDirection % 2) {direction = newDirection; }} public boolean moveon () {node n = (node) nodearray.getFirst (); int x = nx; int y = NY; // Tingkatkan dan kurangi nilai koordinat sesuai dengan sakelar arah (arah) {case up: y--; merusak; Kasus Down: Y ++; merusak; Case Left: x--; merusak; Kasus kanan: x ++; merusak; } // Jika koordinat baru berada dalam kisaran yang valid, proses if ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {if (matriks [x] [y]) {// Jika ada sesuatu pada poin dalam koordinat baru (tubuh ular atau makanan) if (x == food.x & y == nodearray.addfirst (makanan); // Memberikan panjang dari kepala ular // Aturan skor terkait dengan angka dan kecepatan pergerakan mengubah arah int skorget = (10000 - 200 * countmove)/ timeInterval; skor += skorget> 0? Scorget: 10; CountMove = 0; makanan = createFood (); // Buat matriks makanan baru [food.x] [food.y] = true; // Atur Lokasi Makanan Kembali Benar; } else // makan tubuh ular itu sendiri, gagal kembali false; } else {// Jika tidak ada titik di koordinat baru (bodi ular), gerakkan bodi ular nodearray.addfirst (node baru (x, y)); matriks [x] [y] = true; n = (node) nodearray.removelast (); matriks [nx] [ny] = false; Countmove ++; Kembali Benar; }} return false; // sentuh tepi, gagal} public void run () {running = true; while (running) {coba {thread.sleep (timeInterval); } catch (Exception e) {break; } if (! berhenti) {if (moveon ()) {setchanged (); // Model memberi tahu data tampilan yang telah diperbarui notifyoBserver (); } else {joptionpane.showmessagealog (null, "you fail", "game over", joptionpane.information_message); merusak; }}} running = false; } private node createFood () {int x = 0; int y = 0; // Random dapatkan posisi di area yang valid yang tidak tumpang tindih dengan badan ular dan makanan do {acak r = acak baru (); x = r.nextint (maxx); y = r.nextint (maxy); } while (matriks [x] [y]); mengembalikan node baru (x, y); } public void speedup () {TimeInterval *= SpeedChangerate; } public void speedDown () {TimeInterval /= SpeedChangerate; } public void changePausesTate () {PUSEUSE =! PUTUSE; } public string toString () {string result = ""; untuk (int i = 0; i <nodearray.size (); ++ i) {node n = (node) nodearray.get (i); hasil + = "[" + nx + "," + ny + "]"; } hasil pengembalian; }} class node {int x; int y; Node (int x, int y) {this.x = x; this.y = y; }}4.
Paket mvctest; // snakeview.javaimport javax.swing.*; impor java.awt.*; impor java.util.iterator; impor java.util.linkedlist; import java.util.observable; import java.util.observable; impor java.util. java.util.observer; kelas publik snakeview mengimplementasikan pengamat {snakecontrol control = null; Snakemodel Model = NULL; JFrame Mainframe; Canvas PaintCanvas; Jlabel Labelscore; Canvaswidth int statis publik = 200; Publik statis int int canvasheight = 300; public static final int nodewidth = 10; public static final int nodeheight = 10; snakeview publik (model snakemodel, kontrol snakecontrol) {this.model = model; this.control = kontrol; mainframe = JFrame baru ("Greedsnake"); Container cp = mainframe.getContentPane (); // Buat label layar skor teratas = jLabel baru ("skor:"); cp.add (labelscore, borderlayout.north); // Buat Area Tampilan Game Tengah PaintCanvas = New Canvas (); PaintCanvas.setsize (Canvaswidth + 1, Canvasheight + 1); PaintCanvas.addkeyListener (kontrol); cp.add (catcanvas, borderlayout.center); // Buat bilah bantuan di bawah jpanel panelbuttom = new jpanel (); PanelButtom.setLayout (BorderLayout baru ()); Jlabel Labelhelp; labelHelp = jLabel baru ("pageup, pagedown for speed;", jlabel.center); panelbuttom.add (labelhelp, borderlayout.north); labelHelp = new jlabel ("enter atau r atau s untuk awal;", jlabel.center); panelbuttom.add (labelhelp, borderlayout.center); labelHelp = JLabel baru ("Ruang atau P untuk Jeda", Jlabel.Center); panelbuttom.add (labelhelp, borderlayout.south); cp.add (panelbuttom, borderlayout.south); mainframe.addeylistener (kontrol); mainframe.pack (); mainframe.setriSizable (false); mainframe.setDefaultCloseOperation (jframe.exit_on_close); mainframe.setVisible (true); } void repaint () {grafik g = catcanvas.getGraphics (); // gambar latar belakang g.setColor (color.white); G.Fillrect (0, 0, Canvaswidth, Canvasheight); // gambar ular g.setColor (color.black); LinkedList na = model.nodeArray; Iterator it = na.iterator (); while (it.hasnext ()) {node n = (node) it.next (); Drawnode (g, n); } // gambar makanan g.setColor (color.red); Node n = model.food; Drawnode (g, n); updateScore (); } private void drawNode (grafik g, node n) {g.fillrect (nx * nodewidth, NY * nodeheight, nodewidth - 1, nodeheight - 1); } public void updateScore () {string s = "skor:" + model.score; labelscore.setText (s); } pembaruan public void (Observable O, objek arg) {revaint (); }}Tujuan artikel ini adalah untuk membawa Anda untuk mengenang tentang klasik, tetapi tujuan yang lebih penting adalah untuk membantu Anda mempelajari pemrograman Java dengan baik.