Cet article décrit le jeu de balayage de mines et la version améliorée implémentée par Java Swing. Partagez-le pour votre référence, comme suit:
Version 1:
Package awtdemo; import java.awt.event.actionEvent; import java.awt.event.actionListener; import java.awt.event.mouseevent; import java.awt.event.mouseListener; import javax.swing.jbutton; import javax.swing.jfrrame; import javax.swing.jlabel; Exemple de balayage des mines, écrit par swing, adapté aux débutants pour pratiquer * Ce programme utilise Setbounds (x, y, w, h) pour mettre en place la méthode de contrôle * fait référence à la balance mine intégrée dans Win XP. Bien sûr, la fonction d'écriture n'a pas été faite, * Certaines des fonctions faites ont des bogues * * @author ping_qc * / Le test de classe publique étend JFrame implémente ActionListener, Runnable, MouseListener {private static final SerialVersionUID = -2417758397965039613l; Final privé int vide = 0; Mine int privée finale = 1; private final int checked = 2; private final int mine_count = 10; // le nombre de Thunder Private Final Int Button_Border = 50; // taille de chaque point privé final int mine_size = 10; // Spécification d'interface, 20x20 private final int start_x = 20; // Position de démarrage x private final int start_y = 50; // Position de démarrage y Flag booléen privé; Jbutton privé [] [] JB; JLABEL PRIVÉE JL; JLABEL PRIVÉE JLABEL SHOWTIME; Map privé int [] []; / ** * détecter s'il y a une foudre autour d'un point. Les coordonnées des points environnants peuvent être calculés à partir de ce tableau * / private int [] [] mv = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {-1, -1}}; / ** * génère au hasard un nombre défini de tonnerre * / public void makemine () {int i = 0, tx, ty; for (; i <mine_count;) {tx = (int) (math.random () * mine_size); ty = (int) (math.random () * mine_size); if (map [tx] [ty] == vide) {map [tx] [ty] = mien; i ++; // Je ne me souviens pas de l'éclair répété}}}} / ** * Mettez le tableau des boutones sur le cadre et correspondez à la carte [] [] Array * / public void makebutton () {for (int i = 0; i <mine_size; i ++) {for (int j = 0; j <mine_size; j ++) {jb [i] [j] = new jbutton (); // if (map [i] [j] == mien) // jb [i] [j] .setText (i + "," + j); // Écouteur Ajouter JB [i] [J] .AdDactionListener (this); JB [i] [J] .AddMouseListener (this); jb [i] [j] .setName (i + "_" + j); // Click pratique est de déterminer quel bouton a été cliqué // FONT FONT = NOUVEAU FONT (FONT.SERIF, FONT.BOLD, 10); // jb [i] [j] .setfont (font); // jb [i] [j] .setText (i + "," + j); jb [i] [j] .setbounds (j * Button_border + start_x, i * Button_border + start_y, Button_Border, Button_Border); this.add (jb [i] [j]); }}} public void init () {flag = false; jl.setText ("Bienvenue à tester, il y a un total de" + mine_count + "Thunder"); jl.setVisible (true); Jl.SetBounds (20, 20, 500, 30); this.add (jl); showtime.setText ("Elapsed: 0 secondes"); showtime.setbounds (400, 20, 100, 30); this.add (showtime); makemine (); Makebutton (); this.setSize (550, 600); this.setLocation (700, 100); this.setResiSable (false); this.setDefaultCloseOperation (exit_on_close); this.setVisible (true); } test public (title de la chaîne) {super (title); this.setLayout (null); // n'utilisant pas le gestionnaire de mise en page, définissez la position de chaque contrôle avec SetBounds jb = new JButton [mine_size] [mine_size]; jl = new JLabel (); showtime = new JLabel (); map = new int [mine_size] [mine_size]; // Map des boutons dans un tableau} public static void main (String [] args) {test test = new test ("wulin.com Mine Sweeping Game Test 1"); test.init (); test.run (); } @Override public void ActionPerformed (actionEvent e) {objet obj = e.getSource (); int x, y; if ((obj instanceof jbutton) == false) {showMessage ("erreur", "erreur interne"); retour; } String [] tmp_str = ((jbutton) obj) .getName (). Split ("_"); x = Integer.ParseInt (tmp_str [0]); y = Integer.ParseInt (tmp_str [1]); if (map [x] [y] == mien) {showMessage ("Death", "Vous avez marché sur une mine ~~~"); Flag = true; showmin (); retour; } dfs (x, y, 0); Checksuccess (); } / ** * Après chaque clic, déterminez si tous les éclairs ont été trouvés en calculant le nombre de boutons avec un statut activé * / private void checkSuccess () {int cnt = 0; for (int i = 0; i <mine_size; i ++) {for (int j = 0; j <mine_size; j ++) {if (jb [i] [j] .isenabled ()) {cnt ++; }}} if (cnt == mine_count) {string tmp_str = showtime.getText (); tmp_str = tmp_str.replaceAll ("[^ 0-9]", ""); ShowMessage ("Victory", "Lorsque ce mines est partagé:" + TMP_STR + "secondes"); Flag = true; showmin (); }} private int dfs (int x, int y, int d) {map [x] [y] = checked; int i, tx, ty, cnt = 0; pour (i = 0; i <8; i ++) {tx = x + mv [i] [0]; ty = y + mv [i] [1]; if (tx> = 0 && tx <mine_size && ty> = 0 && ty <mine_size) {if (map [tx] [ty] == mien) {cnt ++; // statistiques du nombre de tonnerre près de ce point} else if (map [tx] [ty] == vide) {; } else if (map [tx] [ty] == vérifié) {; }}} if (cnt == 0) {for (i = 0; i <8; i ++) {tx = x + mv [i] [0]; ty = y + mv [i] [1]; if (tx> = 0 && tx <mine_size && ty> = 0 && ty <mine_size && map [tx] [ty]! = vérifié) {dfs (tx, ty, d + 1); }}} else {jb [x] [y] .setText (cnt + ""); } jb [x] [y] .setEnabled (false); retour cnt; } / ** * Affichez quelques informations sur la balise JL * * @param titre * @param info * / private void showMessage (title de chaîne, chaîne info) {jl.setText (info); System.out.println ("dans Functino ShowMessage ():" + info); } public void run () {int t = 0; while (true) {if (flag) {break; } essayez {Thread.Sleep (1000); } catch (InterruptedException e) {e.printStackTrace (); } t ++; showtime.setText ("Elapsed:" + t + "secondes"); } // showMine (); } private void showmin () {// icon iconMine = new ImageIcon ("e: /mine.jpg"); for (int i = 0; i <mine_size; i ++) {for (int j = 0; j <mine_size; j ++) {if (map [i] [j] == mien) {jb [i] [j] .setText ("#"); // jb [i] [j] .seticon (iconMine); }}}} @Override public void Mouseclicked (MouseEvent e) {if (e.getButton () == 3) {objet obj = e.getsource (); if ((obj instanceof jbutton) == false) {showMessage ("erreur", "erreur interne"); retour; } String [] tmp_str = ((jbutton) obj) .getName (). Split ("_"); int x = Integer.ParseInt (tmp_str [0]); int y = Integer.ParseInt (tmp_str [1]); if ("{1}". Equals (jb [x] [y] .getText ()))) {jb [x] [y] .seTTeXt (""); } else {jb [x] [y] .setText ("{1}"); } / * if (jb [x] [y] .geticon () == null) {jb [x] [y] .seTICon (new ImageIcon ("e: /flag.jpg")); } else {jb [x] [y] .seTICon (null); } * /}} @Override public void Mousdressressed (Mouseevent e) {// Todo Méthode générée automatiquement Stub} @Override public void MouseLelelent (Mouseevent E) {// Todo Auto-généré par Stub} @Override Public Void Mouseentered (Mouseevent E) {// TODO GETO-généré par la méthode Auto-générée MouseExited (Mouseevent E) {// TODO Méthode générée automatiquement Stub}}Effet de course:
La version 2 est une amélioration du programme de version 1 ci-dessus, et la fonction de marquage avec le bouton droit et la fonction de difficulté de sélection indépendante sont ajoutées sur la base de la base inchangée.
Package awtdemo; import java.awt.event.actionEvent; import java.awt.event.actionListener; import java.awt.event.mouseevent; import java.awt.event.mouseListener; import javax.swing.jbutton; import javax.swing.jfram; javax.swing.jLabel; @SuppressWarnings ("Serial") Classe publique Saolei étend JFrame implémente ActionListener, Runnable, MouseListener {private final int loEmpty = 0; Int lomine final privé = 1; private final int lochecked = 2; Final privé int lomimine_count = 10; private final int lobutton_border = 50; Final privé int lomimine_size = 10; private final int lostart_x = 20; private final int lostart_y = 50; drapeau booléen privé; Jbutton privé [] [] JB; JLABEL PRIVÉE JL; JLABEL PRIVÉE JLABEL SHOWTIME; Map privé int [] []; private int [] [] mv = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; public void makellomin () {int i = 0, tx, ty; for (; i <lomimine_count;) {tx = (int) (math.random () * lomimine_size); ty = (int) (math.random () * lomimine_size); if (map [tx] [ty] == loEmpty) {map [tx] [ty] = lomine; i ++; }}} public void makeButton () {for (int i = 0; i <lomimine_size; i ++) {for (int j = 0; j <lomine_size; j ++) {jb [i] [j] = new JButton (); jb [i] [j] .addactionListener (this); JB [i] [J] .AddMouseListener (this); jb [i] [j] .setName (i + "_" + j); jb [i] [j] .setbounds (j * lobutton_border + Lostart_x, i * lobutton_border + Lostart_y, lobutton_border, lobutton_border); this.add (jb [i] [j]); }}} public void init () {flag = false; jl.setText ("Tester Welcome, il y a un total de" + lomimine_count + "Thunder"); jl.setVisible (true); Jl.SetBounds (20, 20, 500, 30); this.add (jl); showtime.setText ("Elapsed: 0 secondes"); showtime.setbounds (400, 20, 100, 30); this.add (showtime); MakeLomin (); Makebutton (); this.setSize (550, 600); this.setLocation (700, 100); this.setResiSable (false); this.setDefaultCloseOperation (exit_on_close); this.setVisible (true); } public saolei (title de la chaîne) {super (title); this.setLayout (null); // Aucun gestionnaire de mise en page n'est utilisé, setbounds pour la position de chaque contrôle jb = new JButton [lomine_size] [lomine_size]; jl = new JLabel (); showtime = new JLabel (); map = new int [lomine_size] [lomimine_size]; // mappe les boutons dans un tableau} public static void main (String [] args) {saolei test = new saolei ("wulin.com Mine Sweeping Game Test 2"); test.init (); test.run (); } @Override public void ActionPerformed (actionEvent e) {objet obj = e.getSource (); int x, y; if ((obj instanceof jbutton) == false) {showMessage ("erreur", "erreur interne"); retour; } String [] tmp_str = ((jbutton) obj) .getName (). Split ("_"); x = Integer.ParseInt (tmp_str [0]); y = Integer.ParseInt (tmp_str [1]); if (map [x] [y] == lomine) {showMessage ("Death", "Vous avez marché sur une mine ~~~"); Flag = true; showlomine (); retour; } dfs (x, y, 0); Checksuccess (); } private void checkSuccess () {int cnt = 0; for (int i = 0; i <lomimine_size; i ++) {for (int j = 0; j <lomine_size; j ++) {if (jb [i] [j] .iseNabled ()) {cnt ++; }}} if (cnt == lomimine_count) {string tmp_str = showtime.getText (); tmp_str = tmp_str.replaceAll ("[^ 0-9]", ""); ShowMessage ("Victory", "Lorsque ce mines est partagé:" + TMP_STR + "secondes"); Flag = true; showlomine (); }} private int dfs (int x, int y, int d) {map [x] [y] = lochecked; int i, tx, ty, cnt = 0; pour (i = 0; i <8; i ++) {tx = x + mv [i] [0]; ty = y + mv [i] [1]; if (tx> = 0 && tx <lomine_size && ty> = 0 && ty <lomine_size) {if (map [tx] [ty] == lomimine) {cnt ++; } else if (map [tx] [ty] == loEmpty) {; } else if (map [tx] [ty] == lochecked) {; }}} if (cnt == 0) {for (i = 0; i <8; i ++) {tx = x + mv [i] [0]; ty = y + mv [i] [1]; if (tx> = 0 && tx <lomine_size && ty> = 0 && ty <lomine_size && map [tx] [ty]! = lochecked) {dfs (tx, ty, d + 1); }}} else {jb [x] [y] .setText (cnt + ""); } jb [x] [y] .setEnabled (false); retour cnt; } private void showMessage (title de la chaîne, Info de la chaîne) {jl.setText (info); System.out.println ("dans Functino ShowMessage ():" + info); } public void run () {int t = 0; while (true) {if (flag) {break; } essayez {Thread.Sleep (1000); } catch (InterruptedException e) {e.printStackTrace (); } t ++; showtime.setText ("Time Elapsed:" + T + "secondes"); }} private void showlomine () {for (int i = 0; i <lomimine_size; i ++) {for (int j = 0; j <lomine_size; j ++) {if (map [i] [j] == lomine) {jb [i] [j] .settxt ("tonnerre"); }}}} public void Mouseclicked (MouseEvent e) {if (e.getButton () == 3) {objet obj = e.getsource (); if ((obj instanceof jbutton) == false) {showMessage ("erreur", "erreur interne"); retour; } String [] tmp_str = ((jbutton) obj) .getName (). Split ("_"); int x = Integer.ParseInt (tmp_str [0]); int y = Integer.ParseInt (tmp_str [1]); if ("{1} quot" .equals (jb [x] [y] .getText ())) {jb [x] [y] .setText (""); } else {jb [x] [y] .setText ("{1} quot"); }}} public void MousdressressbeEffet de course:
Pour plus d'informations sur les algorithmes Java, les lecteurs qui sont intéressés par ce site peuvent afficher les sujets: "Structure de données Java et tutoriel d'algorithme", "Résumé des conseils de nœud de Dom Operation Java", "Résumé du fichier Java et des conseils d'opération de répertoire" et "Résumé des conseils d'opération Java Cache"
J'espère que cet article sera utile à la programmation Java de tous.