In diesem Artikel wird ein klassisches Mini -Spiel empfohlen, das von Java: Snake implementiert ist, ich glaube, jeder hat es gespielt, wie man es erreicht?
Reproduktionsbild:
Stellen Sie ohne weiteres den Code vor:
1.
öffentliche Klasse Greedsnake {public static void main (String [] args) {snakemodel model = new Snakemodel (20,30); SnakeControl Control = New SnakeControl (Modell); Snakeview View = New SnakeView (Modell, Steuerung); // einen Beobachter hinzufügen und die Ansicht zum Beobachter des Modellmodells werden. (neuer Thread (Modell)). start (); }}2.
Paket mvctest; // snakecontrol.javaimport java.awt.event.keyevent; import Java.awt.event.KeyListener; Public Class SnakeControl Implementiert Keylistener {Snakemodel -Modell; public snakecontrol (Snakemodel -Modell) {this.model = Modell; } public void keypressed (keyEvent e) {int keyCode = e.getKeyCode (); if (model.running) {// Der verarbeitete Schlüsselschalter (KeyCode) {case keyEvent.vk_up: model.changedirection (snakemodel.up); brechen; case keyEvent.vk_down: model.changedirection (snakemodel.down); brechen; case keyEvent.vk_left: model.changedirection (snakemodel.left); brechen; case keyEvent.vk_right: model.changedirection (snakemodel.right); brechen; case keyEvent.vk_add: case keyEvent.vk_page_up: model.speedup (); brechen; case keyEvent.vk_subtract: case keyEvent.vk_page_down: model.speeddown (); brechen; case keyEvent.vk_space: case keyEvent.vk_p: model.changepausestate (); brechen; Standard:}} // Ein Schlüssel wird in jedem Fall verarbeitet, und der Schlüssel führt dazu, dass das Spiel if startet (KeyCode == KeyEvent.vk_r || keyCode == KeyEvent.vk_s || keyCode == KeyEvent.vk_enter) {modell.reset (); }} public void keyRepest (keyEvent e) {} public void keytyPed (keyEvent e) {}}3.
Paket mvctest; // snakemodel.javaimport javax.swing. // Geben Sie an, ob sich an der Position LinkedList LinkedList Nodearray = New LinkedList () eine Schlangenbehörde oder Lebensmittel befindet. // Schlangenkörperknotenfutter; int maxx; int maxy; int Richtung = 2; // die Richtung des laufenden Booleschen Running = False; // laufstatus int timeInterval = 200; // Zeitintervall, Millisekunden -Doppelspeedchangerate = 0,75; // Jedes Mal, wenn die Geschwindigkeitsänderungsrate Boolean pausierte = false; // Pause Flag Int Score = 0; // int countmove = 0 punkten; // Häufigkeit, mit der Sie sich bewegen, bevor Sie Lebensmittel essen // nach oben und unten sollten sogar rechts und links sein, sollte eine seltsame öffentliche statische endgültige int up = 2 sein; öffentliches statisches Finale int down = 4; öffentliche statische endgültige int links = 1; öffentliche statische endgültige int rechts = 3; public snakemodel (int maxx, int maxy) {this.maxx = maxx; this.maxy = maxy; zurücksetzen(); } public void reset () {Direction = snakemodel.up; // Richtung der Schlange Laufzeitinterval = 200; // Zeitintervall, Millisekunden pausierten = falsch; // Pause Flag Score = 0; // Punktzahl countmove = 0; // Anzahl der Male vor dem Essen von Nahrung // Initial Matirx, alle klare 0 matrix = new Boolean [maxx] []; für (int i = 0; i <maxx; ++ i) {matrix [i] = new boolean [maxy]; Arrays.fill (matrix [i], false); } // Initial die Schlange // Initial des Schlangenkörpers, wenn es mehr als 20 horizontale Positionen gibt, beträgt die Länge 10, andernfalls ist es die Hälfte der horizontalen Position initarrayLength = maxx> 20? 10: maxx / 2; nodearray.clear (); für (int i = 0; i <initarrayLength; ++ i) {int x = maxx / 2 +i; // maxx wird auf 20 int y = maxy / 2 initialisiert; //maxY is initialized to 30 //nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15] //The default running direction is up, so at the beginning of the game nodeArray becomes: // [10,14]-[10,15]-[11,15]-[12,15]~~[19,15] nodeArray.addLast(new Knoten (x, y)); matrix [x] [y] = true; } // Food Food = CreateFood () erstellen; matrix [food.x] [food.y] = true; } public void veränderte (int newDirection) {// Die geänderte Richtung kann nicht in die gleiche Richtung sein oder in die ursprüngliche Richtung umgekehrt werden, wenn (Richtung % 2! = NewDirection % 2) {Direction = NewDirection; }} public boolean moveon () {node n = (node) nodearray.getFirst (); int x = nx; int y = ny; // Erhöhen und verringern Sie den Koordinatenwert entsprechend dem Richtungsschalter (Richtung) {case up: y--; brechen; Fall Down: y ++; brechen; Fall links: x--; brechen; Fall Recht: x ++; brechen; } // Wenn die neue Koordinate in den gültigen Bereich fällt, verarbeiten Sie if ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {if (matrix [x] [y]) {// Wenn etwas auf dem Punkt in der neuen Koordinate (Snake Body oder Food) und Food (x == Food.x && y = y = y= y= y= y = y= y = y= y= y= y = y= y = y= y = y= y = y= {ita und adda und addes. nodearray.addfirst (Food); // eine Länge aus dem Schlangenkopf geben // Die Bewertungsregel bezieht sich auf die Anzahl und die Geschwindigkeit von Bewegungsänderungen int int vicget = (10000 - 200 * countmove)/ TimeInterval; Punktzahl += Score> 0? Score: 10; countmove = 0; food = createFood (); // Erstellen Sie eine neue Lebensmittelmatrix [food.x] [food.y] = true; // Setzen Sie den Lebensmittelstandort zurück. } else // Essen Sie den Schlangenkörper selbst, scheitern Sie falsch; } else {// Wenn in der neuen Koordinate (Schlangenkörper) nichts auf dem Punkt auf dem Punkt ist, bewegen Sie den Schlangenkörper Nicken.addfirst (neuer Knoten (x, y)); matrix [x] [y] = true; n = (Knoten) nodearray.removelast (); matrix [nx] [ny] = false; countmove ++; zurückkehren; }} return false; // Berühren Sie die Kante, fail} public void run () {running = true; while (lauf) {try {thread.sleep (timeInterval); } catch (Ausnahme e) {Break; } if (! pausiert) {if (moveon ()) {setChanged (); // modell benachrichtigt die Ansichtsdaten, die aktualisiert wurden. } else {joptionpane.showMessagedialog (null, "du fehlgeschlagen", "Game Over", joptionpane.information_message); brechen; }}} running = false; } privater Knoten createFood () {int x = 0; int y = 0; // zufällig die Position in einem gültigen Bereich erhalten, der sich nicht mit dem Schlangenkörper und der Lebensmittel überlappt {random r = new random (); x = R.Nextint (maxx); y = R.Nextint (maxy); } while (matrix [x] [y]); Neuen Knoten zurückgeben (x, y); } public void speedeup () {timeInterval *= speedchangerate; } public void speeddown () {timeInterval /= speedchangerate; } public void ChangePausSestate () {pault =! pault; } public String toString () {String result = ""; für (int i = 0; i <nodearray.size (); ++ i) {node n = (knoten) nodearray.get (i); Ergebnis + = "[" + nx + "," + ny + "]"; } Rückgabeergebnis; }} Klasse Node {int x; int y; Node (int x, int y) {this.x = x; this.y = y; }}4.
paket mvctest; // snakeview.javaimport javax.swing.*; import Java.awt. java.util.observer; öffentliche Klasse Snakeview implementiert Observer {snakecontrol control = null; Snakemodel modell = null; Jframe Mainframe; Canvas Paintcanvas; Jlabel LaBelsCore; öffentliche statische endgültige int canvaswidth = 200; öffentliche statische endgültige Int Canvasheight = 300; öffentliche statische endgültige int nodewidth = 10; public static final int nodeHeight = 10; public SNakeView (Snakemodel -Modell, SnakeControl Control) {this.model = Modell; this.control = Kontrolle; Mainframe = new JFrame ("Greedsnake"); Container cp = mainframe.getContentPane (); // Erstellen Sie die Top -Score -Anzeige labelscore = new JLabel ("Score:"); CP.ADD (LaBelsCore, BorderLayout.North); // Erstellen Sie den mittleren Spiel -Displaybereich Paintcanvas = new canvas (); PaintCanvas.SetSize (Leinwandbreite + 1, Canvasheight + 1); PaintCanvas.AddKeyListener (Kontrolle); CP.ADD (PaintCanvas, BorderLayout.Center); // Erstellen Sie die Hilfsleiste unter jpanel panelbuttom = new Jpanel (); panelbuttom.setLayout (neuer BorderLayout ()); JLabel LabelHelp; LabelHelp = new JLabel ("Pageup, pagedown für Geschwindigkeit;", Jlabel.Center); panelbuttom.add (LabelHelp, BorderLayout.North); labelHelp = new JLabel ("Enter oder R oder S für Start;", Jlabel.Center); panelbuttom.add (LabelHelp, BorderLayout.Center); labelHelp = new JLabel ("Space oder P for Pause", Jlabel.Center); panelbuttom.add (LabelHelp, BorderLayout.South); cp.add (panelbuttom, borderLayout.South); mainframe.addKeyListener (Kontrolle); mainframe.pack (); mainframe.setResizable (false); mainframe.setDefaultCloseOperation (jframe.exit_on_close); mainframe.setvisible (true); } void Repaint () {Graphics g = PaintCanvas.getGraphics (); // Hintergrund g.setcolor (color.white) zeichnen; G.FillRect (0, 0, Leinwandbreite, Leinwand); // Zeichnen Sie die Schlange G.SetColor (color.black); LinkedList na = model.nodearray; Iterator it = na.Iderator (); while (it.hasNext ()) {Knoten n = (Knoten) iT.Next (); gezeichnete (g, n); } // Zeichnen Sie das Food G.SetColor (color.red); Knoten n = Modell.food; gezeichnete (g, n); UpdatesCore (); } private void Drawnode (Graphics G, Knoten n) {G.FillRect (nx * nodewidth, ny * nodeHeight, nodewidth - 1, nodeHeight - 1); } public void updatesCore () {String s = "Score:" + model.score; LaBELSCORE.SetText (s); } public void update (beobachtbar O, Objekt arg) {repaint (); }}Der Zweck dieses Artikels ist es, Sie dazu zu bringen, sich an die Klassiker zu erinnern, aber der wichtigere Zweck ist es, Ihnen dabei zu helfen, die Java -Programmierung gut zu lernen.