Este artigo recomenda um mini -jogo clássico implementado por Java: Snake, acredito que todo mundo jogou, como alcançá -lo?
Imagem de reprodução:
Sem mais delongas, basta apresentar o código:
1.
classe pública Greedsnake {public static void main (string [] args) {snakemodel Model = new snakemodel (20,30); Controle snakecontrol = novo snakecontrol (modelo); Snakeview View = new Snakeview (modelo, controle); // Adicione um observador e deixe a exibição se tornar o observador do modelo modelo.AddobServer (View); (novo thread (modelo)). start (); }}2.
pacote mvctest; // snakecontrol.javaimport java.awt.event.keyevent; importar java.awt.event.keyListener; classe pública snakecontrol implementa KeyListener {Snakemodel Model; public snakecontrol (modelo snakemodel) {this.model = modelo; } public void keyPressed (KeyEvent e) {int keyCode = e.getKeyCode (); if (Model.Running) {// o chave de chave processado (KeyCode) {case keyEvent.vk_up: model.changedirection (snakemodel.up); quebrar; case keyevent.vk_down: model.changedirection (snakemodel.down); quebrar; case keyevent.vk_left: model.changedirection (snakemodel.left); quebrar; case keyevent.vk_right: model.changedirection (snakemodel.right); quebrar; case keyevent.vk_add: case keyevent.vk_page_up: model.speedup (); quebrar; case keyevent.vk_subtract: case keyevent.vk_page_down: model.speeddown (); quebrar; case keyevent.vk_space: case keyevent.vk_p: model.changepaUSestate (); quebrar; padrão:}} // Uma chave é processada em qualquer caso, e a chave faz com que o jogo reinicie se (keycode == keyEvent.vk_r || keycode == keyEvent.vk_s || keycode == keyEvent.vk_enter) {model.reset (); }} public void keyreLeardeed (keyEvent e) {} public void keyped (keyEvent e) {}}3.
pacote mvctest; // snakemodel.javaimport javax.swing.*; importar java.util.arrays; importar java.util.LinkedList; importar java.util.Observable; importar java.util.observable; importação [rUnn.UlnEnNesn; matriz; // indica se existe um corpo de cobra ou comida na posição LinkedList NodeArray = new LinkedList (); // alimentos para nó corporal de cobra; int maxx; int maxy; int direção = 2; // a direção da corrida booleana em execução = falsa; // executar estado int timeInterval = 200; // intervalo de tempo, milissegundo duplo speedChangerate = 0,75; // Cada vez que a taxa de mudança de velocidade booleana fez uma pausa = false; // pausa sinalizador int escore = 0; // pontuação int contingMove = 0; // O número de vezes que você se move antes de comer alimentos // para cima e para baixo deve ser equilibrado // direita e esquerda devem ser ímpares da estática pública final Int up = 2; public static final int down = 4; public static final int esquerd = 1; public static final int direito = 3; public snakemodel (int maxx, int maxy) {this.maxx = maxx; this.maxy = maxy; reiniciar(); } public void reset () {direção = snakemodel.up; // Direção da cobra em execução TimeInterval = 200; // intervalo de tempo, milissegundo parado = false; // pausa de pontuação do sinalizador = 0; // score countMove = 0; // Número de vezes antes de comer alimentos // Matirx inicial, tudo claro 0 matriz = novo booleano [maxx] []; for (int i = 0; i <maxx; ++ i) {matrix [i] = new boolean [maxy]; Arrays.fill (matriz [i], false); } // inicial A cobra // inicial o corpo da cobra, se houver mais de 20 posições horizontais, o comprimento é 10, caso contrário, é metade da posição horizontal int initArrayLength = maxx> 20? 10: maxx / 2; NodeArray.clear (); for (int i = 0; i <initarrayLength; ++ i) {int x = maxx / 2 +i; // maxx é inicializado em 20 int y = maxy / 2; // maxy é inicializado para 30 // NodeArray [x, y]: [10,15]-[11,15]-[12,15] ~~ [20,15] // A direção de execução padrão está em cima, portanto, no início do jogo Nodearray. Nó (x, y)); matriz [x] [y] = true; } // Criar comida de alimento = createfood (); matriz [Food.x] [Food.Y] = true; } public void alternouCirection (int newDirection) {// A direção alterada não pode estar na mesma direção ou revertida para a direção original se (direção % 2! = newDirection % 2) {direção = newDirection; }} public boolean moveon () {node n = (node) nodeArray.getfirst (); int x = nx; int y = ny; // Aumentar e diminuir o valor da coordenada de acordo com a chave de direção (direção) {case up: y--; quebrar; Case para baixo: y ++; quebrar; Caso esquerdo: x--; quebrar; Caso direito: x ++; quebrar; } // Se a nova coordenada se enquadra no intervalo válido, processe se ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {if (matrix [x] [y]) {// se houver algo no ponto na nova coordenada (corpo snake ou alimento) se (x ==. NodeArray.addfirst (comida); // dando um comprimento da cabeça da cobra // A regra de pontuação está relacionada ao número e velocidade do movimento muda de direção int scoreget = (10000 - 200 * contagem)/ timeInterval; pontuação += scoreget> 0? Scoreget: 10; countMove = 0; comida = createfood (); // Crie uma nova matriz alimentar [Food.x] [Food.Y] = True; // Defina a localização da comida, retorne verdadeiro; } else // coma o próprio corpo da cobra, falha retornar falsa; } else {// Se não houver nada no ponto na nova coordenada (corpo de cobra), mova o corpo da cobra NodeArray.addfirst (novo nó (x, y)); matriz [x] [y] = true; n = (nó) NodeArray.Removelast (); matriz [nx] [ny] = false; CountMove ++; retornar true; }} retornar false; // Toque na borda, falha} public void run () {Running = true; enquanto (em execução) {tente {thread.sleep (timeInterval); } catch (Exceção e) {break; } if (! pausado) {if (moveon ()) {setChanged (); // modelo notifica os dados de exibição que foram atualizados notifyObservers (); } else {JoptionPane.showMessagedialog (null, "você falhou", "jogo over", joptionpane.information_message); quebrar; }}} em execução = false; } nó privado createfood () {int x = 0; int y = 0; // Random a posição em uma área válida que não se sobrepõe ao corpo da cobra e à comida {aleatória r = new Random (); x = r.nextint (maxx); y = r.nextint (maxy); } while (matriz [x] [y]); retornar novo nó (x, y); } public void Speedup () {timeInterval *= speedChangerate; } public void speeddown () {timeInterval /= speedChangerate; } public void changePaUSEstate () {pausou =! Parada; } public string tostring () {string result = ""; for (int i = 0; i <nodeArray.size (); ++ i) {nó n = (nó) nodearray.get (i); resultado + = "[" + nx + "," + ny + "]"; } resultado de retorno; }} classe nó {int x; int y; Nó (int x, int y) {this.x = x; this.y = y; }}4.
pacote mvctest; // snakeview.javaimport javax.swing.*; importar java.awt. java.util.observer; classe pública Snakeview implementa observador {snakecontrol Control = null; Modelo snakemodel = nulo; Jframe mainframe; 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; public Snakeview (modelo de Snakemodel, SnakEControl Control) {this.model = Model; this.Control = Control; mainframe = new jframe ("graedsnake"); Contêiner cp = mainframe.getContentPane (); // Crie a pontuação superior LabelsCore = new Jlabel ("Score:"); cp.add (Labelscore, borderlayout.north); // Crie a área de exibição do meio do jogo PaintCanvas = new Canvas (); PaintCanvas.SetSize (CanvasWidth + 1, CanvasHeight + 1); PaintCanvas.addkeyListener (Control); cp.add (PaintCanvas, borderlayout.center); // Crie a barra de ajuda abaixo do JPanel PanelButtom = new JPanel (); painelbuttom.setLayout (new BorderLayout ()); JLABEL LABELHELP; LABELHELP = new Jlabel ("PageUp, Paicown for Speed;", Jlabel.Center); painelbuttom.add (LabelHelp, borderlayout.north); LABELHELP = new jlabel ("Enter ou r ou s para start;", jlabel.center); painelbuttom.add (LabelHelp, borderlayout.center); LABELHELP = new Jlabel ("Espaço ou P para Pausa", Jlabel.Center); painelbuttom.add (LabelHelp, borderlayout.south); cp.add (painelbuttom, borderlayout.south); mainframe.addkeylistener (controle); mainframe.pack (); mainframe.setResizable (false); mainframe.setDefaultCloseoperation (jframe.exit_on_close); mainframe.setVisible (true); } void Repaint () {Graphics g = PaintCanvas.getGraphics (); // desenhe fundo g.setColor (color.white); G.FillRect (0, 0, CanvasWidth, CanvasHeight); // desenhe a cobra G.setColor (color.black); LinkedList Na = Model.NodeArray; Iterator it = na.iterator (); while (it.hasnext ()) {nó n = (nó) it.next (); DrawNode (G, N); } // desenhe o alimento G.SetColor (color.red); Nó n = modelo.Food; DrawNode (G, N); updateCore (); } private void desenhado (gráficos g, nó n) {g.fillRect (nx * nodewidth, node * nodeHeight, nodewidth - 1, nodeHeight - 1); } public void updateCore () {string s = "score:" + modelo.score; LabelsCore.settext (s); } public void update (observável o, objeto arg) {repen (); }}O objetivo deste artigo é levá -lo a relembrar os clássicos, mas o objetivo mais importante é ajudá -lo a aprender bem a programação Java.