Cet article recommande un mini-jeu classique mis en œuvre par Java: Snake, je crois que tout le monde l'a joué, comment y parvenir?
Image de reproduction:
Sans plus tarder, il suffit de présenter le code:
1 et 1
classe publique GreedSnake {public static void main (String [] args) {snakemodel modèle = new snaKemodel (20,30); SnaKEControl Control = new SnakeControl (modèle); SnakeView View = new SnakeView (modèle, contrôle); // Ajouter un observateur et laisser la vue devenir l'observateur du modèle modèle.addoBserver (vue); (nouveau thread (modèle)). start (); }}2
Package MvCTEST; // snakeControl.javaimport java.awt.event.keyevent; import java.awt.event.keyListener; classe publique SnakeControl implémente KeyListener {SnaKEModel modèle; public snakeControl (modèle SnaKEModel) {this.model = modèle; } public void keyPressed (keyEvent e) {int keyCode = e.getKeycode (); if (modèle.running) {// Le commutateur de clé traité (keycode) {case keyEvent.vk_up: Model.ChangeDirection (snaKEModel.up); casser; case keyevent.vk_down: modèle.changeDirection (snaKEModel.down); casser; case keyevent.vk_left: modèle.changeDirection (snaKEModel.left); casser; case keyevent.vk_right: modèle.changeDirection (snaKEModel.Right); casser; case keyevent.vk_add: case keyevent.vk_page_up: modèle.speedup (); casser; case keyevent.vk_substract: case keyevent.vk_page_down: modèle.speedDown (); casser; case keyevent.vk_space: case keyevent.vk_p: model.changepauseState (); casser; par défaut:}} // Une clé est traitée dans tous les cas, et la clé fait redémarrer le jeu if (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 et 3
Package MvCTest; // SnaKEMODEL.Javaimport Javax.swing. *; Importer java.util.arrays; import java.util.linkedlist; import java.util.observable; import java.util.observable; // indique s'il y a un corps ou une nourriture de serpent sur la position LinkedList NODEARRAY = new LinkedList (); // Nœud de nœud corporel de serpent; int maxx; int maxy; Int Direction = 2; // la direction du Snake's Running Boolean Running = FALSE; // Exécuter l'état int timeInterval = 200; // Intervalle de temps, milliseconde double speedchangerate = 0,75; // chaque fois que le taux de changement de vitesse booléen a pause = false; // pause inducteur int score = 0; // score int countmove = 0; // Nombre de fois que vous vous déplacez avant de manger de la nourriture // de haut en bas doit être même // à droite et à gauche devrait être étrange publique statique final int up = 2; Public statique final int down = 4; public statique final int Left = 1; public statique final int droit = 3; public snaKEMODEL (int maxx, int maxy) {this.maxx = maxx; this.maxy = maxy; réinitialiser(); } public void reset () {direction = snaKEModel.up; // Direction du serpent Running TimeInterval = 200; // Intervalle de temps, milliseconde pause = false; // Pause Score du drapeau = 0; // score countMove = 0; // Nombre de fois avant de manger de la nourriture // Matirx initial, tous matrice claire 0 = new Boolean [maxx] []; for (int i = 0; i <maxx; ++ i) {matrix [i] = new boolean [maxy]; Arrays.fill (matrix [i], false); } // initial le serpent // initial le corps de serpent, s'il y a plus de 20 positions horizontales, la longueur est de 10, sinon elle est la moitié de la position horizontale int initarrayLength = maxx> 20? 10: Maxx / 2; NODEARRAY.CLEAR (); for (int i = 0; i <initarrarayLength; ++ i) {int x = maxx / 2 + i; // maxx est initialisé à 20 int y = maxy / 2; // Maxy est initialisé à 30 // nodArray [x, y]: [10,15] - [11,15] - [12,15] ~~ [20,15] // La direction de fonctionnement par défaut est en hausse, donc au début du jeu nodray devient: // [10,14] - [10,15] - [11,15] - [12,15] ~~ [19,15] - [11,15] - [12,15] ~~ [19,15] NODEARRAY.ADDLAST (nouveau nœud (x, y)); matrice [x] [y] = true; } // Créer des aliments alimentaires = CreateFood (); matrice [aliments.x] [aliments.y] = true; } public void changé de modification (int newDirection) {// La direction modifiée ne peut pas être dans la même direction ou inversée dans la direction d'origine if (direction% 2! = newDirection% 2) {Direction = newDirection; }} public boolean moveNon () {nœud n = (node) nodArray.getFirst (); int x = nx; int y = ny; // augmenter et diminuer la valeur des coordonnées en fonction du commutateur de direction (direction) {case up: y--; casser; Cas vers le bas: y ++; casser; Case gauche: x--; casser; Cas à droite: x ++; casser; } // Si la nouvelle coordonnée se situe dans la plage valide, traitez si ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {if (matrice [x] [y]) {// s'il y a quelque chose sur le point dans le nouveau coordon NODEARRAY.AddFirst (nourriture); // donnant une longueur de la tête de serpent // La règle de score est liée au nombre et à la vitesse des changements de mouvement Direction INT ScoreGet = (10000 - 200 * countMove) / TimeInterval; Score + = ScoretGet> 0? Scoretget: 10; countMove = 0; nourriture = createfood (); // Créer une nouvelle matrice alimentaire [aliments.x] [aliments.y] = true; // Réglez l'emplacement des aliments Retour True; } else // Mangez le corps de serpent lui-même, échoue return false; } else {// S'il n'y a rien sur le point dans la nouvelle coordonnée (corps de serpent), déplacez le corps de serpent NODEARRAY.AddFirst (nouveau nœud (x, y)); matrice [x] [y] = true; n = (nœud) NODEARRAY.REMOVELAST (); matrice [nx] [NY] = false; countMove ++; Retour Vrai; }} return false; // touche le bord, échoue} public void run () {running = true; while (running) {try {thread.sleep (timeInterval); } catch (exception e) {break; } if (! pause) {if (moveLon ()) {setChanged (); // Modèle avertit les données de vue qui ont été mises à jour notifyObservers (); } else {joptionpane.showMessageDialog (null, "vous échouez", "jeu over", joptionpane.information_message); casser; }}} running = false; } nœud privé CreateFood () {int x = 0; int y = 0; // Random Obtenez la position dans une zone valide qui ne chevauche pas le corps de serpent et la nourriture do {aléatoire r = new random (); x = r.Nextint (maxx); y = r.Nextint (maxy); } while (matrice [x] [y]); retourner le nouveau nœud (x, y); } public void speedup () {timeInterval * = speedChangerate; } public void speeddown () {timeInterval / = speedChangerate; } public void ChangePauSeTate () {paused =! pause; } public String toString () {String result = ""; for (int i = 0; i <nodEarray.size (); ++ i) {node n = (node) nodArray.get (i); Résultat + = "[" + nx + "," + ny + "]"; } Retour Résultat; }} classe nœud {int x; int y; Node (int x, int y) {this.x = x; this.y = y; }}4
Package MvCTest; // SnakeView.Javaimport Javax.swing. *; Import Java.awt. *; Import Java.util.iterator; Importer Java.util.linkedList; Importer Java.util.Observable; import java.util.observable; import java.util.observable; import java.util.obsservable; java.util.observer; public class SnakeView implémente Observer {snakeControl Control = null; Modèle SnaKEModel = null; Jframe mainframe; Canvas Paintcanvas; JLabel LabelsCore; Public Static Final Int Canvaswidth = 200; Public statique final Int Canvasheight = 300; public static final int nowewidth = 10; public static final int nodeheight = 10; Public SnakeView (modèle SnaKEModel, Contrôle SnaKEControl) {this.model = modèle; this.Control = Control; mainframe = new JFrame ("GreedSnake"); Conteneur cp = mainframe.getContentPane (); // Créez l'écran de score supérieur LabelsCore = new JLabel ("Score:"); CP.ADD (LabelsCore, BorderLayout.North); // Créer la zone d'affichage du jeu du milieu PaintCanvas = new Canvas (); PaintCanvas.SetSize (canvaswidth + 1, toile-tivrah / 1); peintureCanvas.addkeyListener (contrôle); CP.ADD (PaintCanvas, BorderLayout.Center); // Créez la barre d'aide sous JPanel PanelButtom = new JPanel (); PanelButtom.SetLayout (new BorderLayout ()); JLabel LabelHelp; LabelHelp = new JLabel ("PageUp, Pagedown pour la vitesse;", JLabel.Center); PANNEBUTTOM.ADD (LabelHelp, BorderLayout.north); LabelHelp = new JLabel ("Entrée ou R ou S pour le démarrage;", JLabel.Center); PANNEBUTTOM.ADD (LabelHelp, BorderLayout.Center); LabelHelp = new JLabel ("Space ou P pour Pause", JLabel.Center); PANNEBUTTOM.ADD (LabelHelp, BorderLayout.South); CP.ADD (PanelButtom, BorderLayout.South); mainframe.addkeyListener (contrôle); mainframe.pack (); mainframe.setResiSable (false); mainframe.setDefaultCloseOperation (jframe.exit_on_close); mainframe.setVisible (true); } void repent () {graphics g = peintureCanvas.getGraphics (); // dessiner l'arrière-plan g.setColor (Color.white); G.Fillrect (0, 0, Canvaswidth, Canvasheight); // dessine le serpent g.setColor (Color.Black); LinkedList na = Model.NodeArray; Iterator it = na.iterator (); while (it.hasnext ()) {node n = (node) it.next (); DrawNode (g, n); } // dessiner la nourriture g.setColor (Color.red); Nœud n = modèle.food; DrawNode (g, n); updatesCore (); } private void DrawNode (Graphics g, nœud n) {g.fillrect (nx * noweWidth, ny * nodeHeight, nowewidth - 1, nodeHeight - 1); } public void updatesCore () {String S = "Score:" + Model.score; LabelsCore.setText (s); } public void Update (observable o, objet arg) {repent (); }}Le but de cet article est de vous emmener à vous remédier aux classiques, mais le but le plus important est de vous aider à bien apprendre la programmation Java.