Este artículo recomienda un mini juego clásico implementado por Java: Snake, creo que todos lo han jugado, ¿cómo lograrlo?
Imagen de reproducción:
Sin más ADO, solo presente el código:
1.
public class GreedSnake {public static void main (String [] args) {snakemodel modelo = new Snakemodel (20,30); Snakecontrol Control = new Snakecontrol (modelo); SnakeView View = new SnakeView (modelo, control); // Agregue un observador y deje que la vista se convierta en el observador del modelo modelo. (nuevo hilo (modelo)). start (); }}2.
paquete mvctest; // snakecontrol.javaimport java.awt.event.keyevent; import java.awt.event.keylistener; public class Snakecontrol implementa Keylistener {modelo Snakemodel; Public Snakecontrol (modelo Snakemodel) {this.model = modelo; } public void keyPressed (keyEvent e) {int keyCode = e.getKeyCode (); if (model.running) {// El conmutador de teclas procesado (clave de teclas) {case keyEvent.vk_up: model.changedirection (snakemodel.up); romper; caso KeyEvent.vk_down: Model.ChangedIrection (Snakemodel.down); romper; Case KeyEvent.vk_left: Model.ChangedIrection (Snakemodel.left); romper; Case KeyEvent.vk_right: Model.ChangedIrection (Snakemodel.right); romper; Case KeyEvent.vk_add: Case KeyEvent.vk_page_up: model.speedup (); romper; Case KeyEvent.vk_subtract: Case KeyEvent.Vk_Page_Down: Model.speddown (); romper; Case KeyEvent.vk_space: Case KeyEvent.vk_p: Model.ChangePaUseState (); romper; predeterminado:}} // se procesa una clave en cualquier caso, y la clave hace que el juego se reinicie if (keyCode == keyEvent.vk_r || keycode == keyEvent.vk_s || keyCode == keyEvent.vk_enter) {model.reset (); }} public void KeyReleaded (KeyEvent E) {} public void KeyTyped (KeyEvent E) {}}3.
paquete mvctest; // snakemodel.javaimport javax.swing.*; import java.util.arrays; import java.util.linkedList; import java.util.observable; import java.observable; import java.util.random; // indica si hay un cuerpo de serpiente o comida en la posición LinkedList nodearray = new LinkedList (); // comida del nodo del cuerpo de serpiente; int maxx; int maxy; dir dirección = 2; // La dirección del running de la serpiente corriendo = falso; // Ejecutar el estado int timeInterval = 200; // Intervalo de tiempo, Millisegundo Double Speedcharterere = 0.75; // Cada vez que la tasa de cambio de velocidad booleana se detiene = falso; // Pausa Flag Int Score = 0; // puntaje int countmove = 0; // El número de veces que se mueve antes de comer alimentos // hacia arriba y hacia abajo debe ser uniforme // derecha e izquierda debe ser impar público estático final int up = 2; Public estática final int down = 4; Public Static Final Int Left = 1; Público estático final int derecho = 3; public snakemodel (int maxx, int maxy) {this.maxx = maxx; this.maxy = maxy; reiniciar(); } public void reset () {direction = snakemodel.up; // dirección del tiempo de ejecución de la serpiente Interval = 200; // intervalo de tiempo, milisegundo pausado = falso; // PAUSE Puntuación de bandera = 0; // puntaje de puntaje = 0; // Número de veces antes de comer alimentos // Matirx inicial, todos transparentes 0 matriz = new Boolean [maxx] []; for (int i = 0; i <maxx; ++ i) {matrix [i] = new Boolean [maxy]; Arrays.fill (matriz [i], falso); } // Inicialmente la serpiente // Inicialmente el cuerpo de serpiente, si hay más de 20 posiciones horizontales, la longitud es 10, de lo contrario es la mitad de la posición horizontal int initArrayLength = maxx> 20? 10: maxx / 2; nodearray.clear (); for (int i = 0; i <initArrayLength; ++ i) {int x = maxx / 2 +i; // maxx se inicializa a 20 int y = maxy / 2; // maxy se inicializa a 30 // nodearray [x, y]: [10,15]-[11,15]-[12,15] ~~ [20,15] // La dirección de ejecución predeterminada está activa, por lo que al comienzo del juego nodearray se convierte en: // [10,14]-[10,15]-[11,15]-[12,15] ~~ [19,15] NeaT. Nodo (x, y)); matriz [x] [y] = true; } // Crear comida alimenticia = createfood (); matriz [food.x] [food.y] = true; } public void cambiadirection (int newDirection) {// La dirección cambiada no puede estar en la misma dirección o revertirse en la dirección original si (dirección % 2! = newDirection % 2) {direction = newDirection; }} public boolean MoveOn () {nodo n = (nodo) nodearray.getFirst (); int x = nx; int y = ny; // Aumentar y disminuir el valor de coordenadas de acuerdo con el interruptor de dirección (dirección) {Caso arriba: y--; romper; Caso hacia abajo: y ++; romper; Caso izquierdo: x--; romper; Caso derecho: x ++; romper; } // Si la nueva coordenada se encuentra dentro del rango válido, proceso if ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {if (matriz [x] [y]) {// Si hay algo en el punto en la nueva coordenada (el cuerpo de serpente o los alimentos) nodearray.addfirst (comida); // Dar una longitud de la cabeza de la serpiente // La regla de puntuación está relacionada con el número y la velocidad del movimiento cambia la dirección int storeTet = (10000 - 200 * Countmove)/ TimeInterval; puntaje += scatterget> 0? Scoreget: 10; Countmove = 0; comida = createFood (); // Crear una nueva matriz de alimentos [Food.x] [Food.y] = True; // Establecer el retorno de la ubicación de la comida verdadera; } else // Come el cuerpo de serpiente en sí, falla return false; } else {// Si no hay nada en el punto en la nueva coordenada (cuerpo de serpiente), mueva el cuerpo de serpiente nodearray.addfirst (nuevo nodo (x, y)); matriz [x] [y] = true; n = (nodo) nodearray.removelast (); matriz [nx] [ny] = false; CondMove ++; devolver verdadero; }} return false; // tocar el borde, fail} public void run () {running = true; while (en ejecución) {try {thread.sleep (TimeInterval); } catch (Exception e) {break; } if (! pause) {if (mudon ()) {setchanged (); // El modelo notifica los datos de vista que se han actualizado notifyObServers (); } else {joptionPane.ShowMessEdialog (nulo, "Fallaste", "Juego Over", JoptionPane.Information_Message); romper; }}} running = false; } private nodo createFood () {int x = 0; int y = 0; // Obtener la posición al azar en un área válida que no se superpone con el cuerpo de serpiente y los alimentos do {Random r = new Random (); x = R.NextInt (maxx); y = R.NextInt (Maxy); } while (matriz [x] [y]); devolver nuevo nodo (x, y); } public void speedup () {TimeInterval *= SpeedChaverer; } public void Speeddown () {TimeInterval /= SpeedChaverer; } public void ChangePauseSestate () {pause =! Paused; } public String toString () {String dultin = ""; for (int i = 0; i <nodearray.size (); ++ i) {nodo n = (nodo) nodearray.get (i); resultado + = "[" + nx + "," + ny + "]"; } resultado de retorno; }} nodo de clase {int x; int y; Nodo (int x, int y) {this.x = x; this.y = y; }}4.
paquete mvctest; // snakeView.javaimport javax.swing.*; import java.awt.*; import java.util.iterator; import java.util.linkedList; import java.util.observable; import java.util.observable; import java.observable; import.util.utilable; importable; importable; java.util.observer; public class SnakView implementa observador {snakeControl control = null; Modelo de snakemodel = nulo; Jframe mainframe; Canvas Paintcanvas; Jlabel Labelscore; Public static final int CanvasWidth = 200; Public estática final int Canvasheight = 300; Public Static Final Int Nodewidth = 10; Public static final int nodeHeight = 10; Public SnakView (modelo Snakemodel, control de snakecontrol) {this.model = modelo; this.control = control; mainframe = new Jframe ("GreedSnake"); Contenedor cp = mainframe.getContentPane (); // Cree la pantalla superior de la pantalla LabelsCore = new JLabel ("Score:"); cp.add (Labelscore, BorderLayout.north); // Crear el área de visualización del juego intermedio PaintCanvas = new Canvas (); pintarcanvas.setsize (Canvaswidth + 1, Canvasheight + 1); pintarcanvas.addkeylistener (control); cp.add (pintarcanvas, borderLayout.center); // Cree la barra de ayuda debajo de JPanel PanelButtom = new JPanel (); panelButtom.setLayout (nuevo BorderLayout ()); JLabel LabelHelp; LabelHelp = new JLabel ("PageUp, Paggown para la velocidad", jlabel.center); panelButtom.add (LabelHelp, BorderLayout.north); LabelHelp = new JLabel ("Ingrese o R o S para Start;", jlabel.center); panelButtom.add (LabelHelp, BorderLayout.Center); LabelHelp = new JLabel ("Space o P para Pausa", JLabel.Center); panelButtom.add (LabelHelp, BorderLayout.South); cp.add (panelButtom, BorderLayout.South); mainframe.addkeylistener (control); mainframe.pack (); mainframe.setResizable (falso); mainframe.setDefaultCloseOperation (jframe.exit_on_close); mainframe.setVisible (verdadero); } void repint () {gráficos g = pintarcanvas.getgraphics (); // dibujar fondo G.SetColor (color.white); G.Fillrect (0, 0, CanvasWidth, Canvasheight); // dibujar la serpiente G.SetColor (color.black); LinkedList na = model.nodearray; Iterador it = na.iterator (); while (it.hasnext ()) {nodo n = (nodo) it.next (); DrawNode (g, n); } // dibujar la comida g.setColor (color.red); Nodo n = model.food; DrawNode (g, n); actualizateCore (); } private void DrawNode (Graphics g, nodo n) {g.fillrect (nx * nowidth, ny * nodeHeight, notewidth - 1, nodeheight - 1); } public void UpdateScore () {String S = "Score:" + Model.score; Labelscore.settext (s); } Update public void (observable o, objeto arg) {repint (); }}El propósito de este artículo es llevarlo a recordar los clásicos, pero el propósito más importante es ayudarlo a aprender bien la programación de Java.