L'expérience de balayage de la mine de Swing est pour votre référence. Le contenu spécifique est le suivant
Récemment, j'ai fait un petit jeu après avoir étudié le swing: le remontage des mines
1. Design préliminaire
2. Implémentation
En fait, le cœur de la réalisation de ce jeu réside dans la manipulation du tableau. Le code principal ci-dessous est Main.java:
Package d'abord; import java.awt.color; import java.awt.dimension; import java.awt.font; import java.awt.gridlayout; import java.awt.image; import java.awt.toolkit; java.awt.event.actionListener; import java.awt.event.mouseevent; import java.awt.event.mouseListener; importer java.io.buffereDeader; import java.io.inputstreamreader; import java.io.ioexception; importer java.inputtreamreader; import java.io.outportSt java.net.serversocket; import java.net.socket; import java.sql.drivermanager; import java.sql.sqlexception; import java.util.hashset; import java.util.set; import java.util.uuid; import javax.swing.imageion; importation javax.wing.jbutton; javax.swing.jframe; importer javax.swing.jLabel; import javax.swing.jmenu; import javax.swing.jmenubar; import javax.swing.jmecutem; import javax.swing.joptionpane; import javax.swing.timer; com.mysql.jdbc.statement; public classe principale étend jframe implémente ActionListener, MouseListener {/ ** * yijian * / private static final SerialVersionUid = 1l; // Déclaration des paramètres précoces JMenuItem Jminew, Jmisave, Jmiopen, JMiexit, Jmichuji, Jmizhongji, Jmigaoji, Jmishowinfo, Jmiziding; Toolkit Toolkit = toolkit.getDefaultToolkit (); // Obtenez la boîte à outils par défaut. Clips de presse à presse = Toolkit.getSystemClipboard (); // Obtenez une instance du système Calibrate // comme interface avec l'outil de presse-papiers fourni par la plate-forme native. // deux icônes ImageIcon icon = new ImageIcon ("g: //eclipse-workspace//classtest_thundergame//mine.png"); ImageIcon icon1 = new ImageIcon ("g: //eclipse-workspace//classtest_thundergame//flag.png"); Int statique privé Num = 1; // Ce num est un numéro de tonnerre, vous pouvez écrire un programme pour modifier // Final statique privé int snum = 9; // ce SNUM est le nombre de carreaux de remontage des mines, vous pouvez écrire un programme pour modifier JBUTTON PRIVÉ [] [] JB; Map privé int [] []; booléen [] [] drapeaux; booléen [] [] drapeau; int Couttime; // Déclare la connexion de connexion Connexion CON; // Nom du pilote String Driver = "com.mysql.jdbc.driver"; // URL: pointez le nom de la base de données à accéder à la chaîne url = "jdbc: mysql: // localhost: 3306 / testsql3"; // MySQL Configured User String user = "root"; // Mot de passe String mot de passe = "Huang"; public main (int snum, int mines) {// l'interface principale settitle ("mine-sweeping"); // Nombre initial de tonnerre Num = mines; JMenubar Greenbar = new JMenubar (); // Menu Container Greenbar.SetOpaque (true); Greenbar.setbackground (nouvelle couleur (250, 250, 250)); Greenbar.SetPreferredSize (nouvelle dimension (800, 28)); greenbar.setfont (new Font (font.dialog_input, font.italic, 16)); // Menu jmenu filemenu1 = new JMenu ("jeu"); JMenu fileMemenu2 = new JMenu ("difficulté"); JMenu fileMenu3 = new JMenu ("Aide:"); Greenbar.Add (FileMenu1); Greenbar.Add (FileMenu2); Greenbar.Add (JMishowInfo = FileMenu3); fileMenu1.setfont (new Font (font.dialog_input, font.italic, 16)); fileMenu2.setfont (new Font (font.dialog_input, font.alic, 16)); fileMenu3.setfont (new Font (font.dialog_input, font.alic, 16)); // élément de menu fileMenu1.add (jMinew = new JMenuItem ("nouveau jeu")); fileMenu1.add (jMisave = new JMenuItem ("Version de classement")); fileMenu1.add (jMizIding = new JMenUitem ("Custom")); fileMenu1.addSeparator (); fileMenu1.Add (jMiexit = new JMenUitem ("exit")); fileMenu2.Add (jmichuji = new JMenUitem ("Junior")); fileMenu2.Add (jmizhongji = new JMenUitem ("intermédiaire")); fileMenu2.Add (jmigaoji = new JMenUitem ("Advanced")); fileMenu3.Add (jMishowinfo = new JMenuItem ("Informations de développeur")); JMinew.AddactionListener (this); JMIEXIT.AddactionListener (this); JMisave.AddactionListener (this); JMisave.AddactionListener (this); JMishowinfo.AddactionListener (this); Jmichuji.addactionListener (this); Jmizhongji.addactionListener (this); Jmigaoji.addactionListener (this); Jmiziding.addactionListener (this); Jmiziding.setfont (new Font (font.dialog_input, font.alic, 16)); JMishowinfo.setfont (New Font (font.dialog_input, Font.Italic, 16)); Jminew.setfont (new Font (font.dialog_input, font.alic, 16)); JMisave.setfont (New Font (font.dialog_input, Font.italic, 16)); JMIEXIT.SETFONT (New Font (font.dialog_input, Font.Italic, 16)); Jmichuji.setfont (new Font (font.dialog_input, font.italic, 16)); Jmizhongji.setfont (new Font (font.dialog_input, font.alic, 16)); Jmizhongji.setfont (new Font (font.dialog_input, font.alic, 16)); Jmigaoji.setfont (new Font (font.dialog_input, font.alic, 16)); setjMenubar (barre verte); Image icon = toolkit.getDefaultToolkit (). GetImage ("g: //eclipse-workspace//classtest_thundergame//mine.png"); setiConImage (icône); setLayout (new GridLayout (snum, snum)); jb = new JButton [snum] [snum]; map = new int [snum] [snum]; // Map les boutons dans un tableau Flags = new Boolean [map.length] [map [0] .length]; // Enregistrer le tableau d'enregistrement Flag = new booléen [map.length] [map [0] .length]; // Enregistrer la table d'enregistrement int count = 0; // bleigh while (count <num) {int i = (int) (math.random () * map.length); // hang int j = (int) (math.random () * map [0] .length); // mentir if (map [i] [j]! = '*') {Map [i] [j] = '*'; Count ++; }} pour (int i = 0; i <snum; i ++) {for (int j = 0; j <snum; j ++) {jb [i] [j] = new JButton (); jb [i] [j] .setName (i + "_" + j); jb [i] [j] .setbackground (nouvelle couleur (220, 220, 220)); jb [i] [j] .setfont (new Font (font.dialog_input, font.alic, 10)); jb [i] [j] .addactionListener (this); JB [i] [J] .AddMouseListener (this); // Add Mouse Écouteur ADD (JB [I] [J]); }} // TIMER JLABEL STSTUS = NOUVEAU JLABEL (); JLabel Times = new JLabel (); JLabel miao = new JLabel (); Add (STSTUS); ajouter (fois); Times.SeTText ("0"); miao.setText ("secondes"); Settimer (fois); couttime = 0; STSTUS.SETTEXT ("Time:"); Greenbar.Add (STSTUS); greenbar.add (Times, droite_alignment); Greenbar.Add (Miao, droite_alignment); Times.setfont (New Font (font.dialog_input, Font.Italic, 16)); ststus.setfont (new Font (font.dialog_input, font.italic, 16)); miao.setfont (new Font (font.dialog_input, font.alic, 16)); setSize (700, 700); setLocationRelativeto (null); setVisible (true); // setDefaultCloseOperation (jframe.exit_on_close); setDefaultCloseOperation (dissose_on_close); // Ajouter cette ligne} private void Settimer (JLabel Time) {// Time écoute final jLabel vartime = time; TIMER TIMEACTION = NOUVEAU TIMER (1000, new ActionListener () {public void ActionPerformed (ActionEvent e) {couttime ++; vartime.setText ("" + couttime);}}); TIMEACTION.START (); } private void showTheClick (int x, int y) {// cliquez sur l'implémentation de l'événement if (map [x] [y] == '*') {jb [x] [y] .seticon (icon); showmines (); } else {int count1 = 0; pour (int a = x - 1; a <= x + 1; a ++) {pour (int b = y - 1; b <= y + 1; b ++) {if (! (a <0 || b <0 || b> = map [0] .length || a> = map.length) && map [a] [b] == '*') count1 ++; }} drapeaux [x] [y] = true; if (count1 == 0) {jb [x] [y] .setbackground (colore.white); } else {jb [x] [y] .setText (count1 + ""); jb [x] [y] .setfont (new Font (font.dialog_input, font.alic, 20)); JB [x] [y] .setbackground (Color.white); } if (count1 == 0) {for (int i = x - 1; i <= x + 1; i ++) {for (int j = y - 1; j <= y + 1; j ++) {if (! (i <0 || j <0 || i> = map.length || j> = map [0] .Length)) {if! (i == == false) {showTheClick (i, j); // boucle Traversal} else {// prévenir l'accès répété}}}}}}}}}} private void showmines () {// affiche tous les milleurs // map.length; j ++) {if (map [i] [j] == '*') {jb [i] [j] .seticon (icon); //}}} // terminer le jeu int b = joptionpane.showoptionDialog (null, "Oh, il a explosé, nouveau jeu?", "Confirmer la boîte", joptionpane.yes_no_option, joptionpane.question_message, null, null, null); if (b == 1) {System.exit (0); } else {setVisible (false); nouveau main (map.length, num); }} @Override public void ActionPerformed (ActionEvent e) {// Traitement d'écoute d'événement // TODO Méthode générée automatiquement Stub if (e.getSource () == JMinew) {setVisible (false); nouveau main (map.length, num); } else if (e.getsource () == jMisave) {showRange (); } else if (e.getSource () == JMIEXIT) {System.Exit (0); } else if (e.getsource () == jmiziding) {new selfMines (); } else if (e.getsource () == jmichuji) {setVisible (false); Nouveau principal (5,3); } else if (e.getSource () == JMishowInfo) {new MyInfo (); } else if (e.getSource () == jmizhongji) {setVisible (false); Nouveau principal (10,10); } else if (e.getSource () == jmigaoji) {setVisible (false); Nouveau principal (20,60); } else {objet obj = e.getsource (); int x, y; String [] strm = ((jbutton) obj) .getName (). Split ("_"); x = Integer.ParseInt (strm [0]); y = Integer.ParseInt (strm [1]); showTheClick (x, y); checksuccess (); // Vérifiez si le jeu est terminé}} private void showRange () {// Show Ranking new shiyan13 (map.length); } private void checkSuccess () {// Déterminez si le jeu est terminé // TODO Méthode générée automatiquement Stub int count = map.length * map [0] .length; for (int i = 0; i <map.length; i ++) {for (int j = 0; j <map [0] .length; j ++) {if (flags [i] [j] == true) count--; }} if (count == num) {String uUid = uUid.randomuuid (). toString (). RempaceALL ("-", ""); // Le tableau indique un lien UUID // à la base de données et stocker les données de temps try {class.forname (pilote); con = (connexion) driverManager.getConnection (URL, utilisateur, mot de passe); String SQL; if (! con.isclosed ()) {// ta.seTText (""); System.out.println ("Connexion de la base de données avec succès"); // Créer une instruction d'objet Instruction = (instruction) CON.CreatEstaTation (); // if (map.length == 10) {// // instruction sql à exécuter sql = "insérer dans Middlerange (userId, usertime) valeurs (/" "+ uuid +" / "," + couttime + ");"; instruction.ExecuteUpdate (SQL); con.close (); } else if (map.length == 5) {sql = "insérer dans Rang (userId, usertime) valeurs (/" "+ uuid +" / "," + couttime + ");"; instruction.ExecuteUpdate (SQL); con.close (); } else if (map.length == 20) {sql = "INSERT IN TOPRange (userId, usertime) valeurs (/" "+ uuid +" / "," + couttime + ");"; instruction.ExecuteUpdate (SQL); con.close (); } else {}} catch (classNotFoundException e) {// Database Driver Class exception exception gessely.out.println ("error"); e.printStackTrace (); } catch (sqlexception e) {// system.out.println (e); System.err.println ("Données introuvables"); // int i = joptionpane.showconfirmDialog (null, "L'instruction SQL que vous avez entrée est incorrecte", // "non trouvé", joptionpane.yes_no_option); } catch (exception e) {e.printStackTrace (); } Enfin {System.out.println ("La base de données obtient les données avec succès!"); } int i = joptionpane.showoptionDialog (null, "Félicitations pour passer le test, continuez-vous?", "Confirmer la boîte", joptionpane.yes_no_option, joptionpane.question_message, null, null, null); // ststus.setText ("Hello" + i); if (i == 1) {System.exit (0); } else {setVisible (false); nouveau main (map.length, num); }}} @Override public void Mouseclicked (MouseEvent E) {// TODO Méthode générée automatiquement Stub int C = e.getButton (); if (c == MouseEvent.Button3) {objet obj1 = e.getsource (); int x, y; String [] strm = ((jbutton) obj1) .getName (). Split ("_"); x = Integer.ParseInt (strm [0]); y = Integer.ParseInt (strm [1]); if (flag [x] [y] == false && flags [x] [y] == false) {// insérer l'indicateur jb [x] [y] .seticon (icon1); Flag [x] [y] = true; } else {jb [x] [y] .seTICon (null); Flag [x] [y] = false; }}} @Override public void Mousdressressed (Mouseevent e) {// Todo Méthode générée automatiquement Stub} @Override public void muouseentered (Mouseevent E) {// Todo Généré Auto-généré Stub} @Override Public Void MouseExite3. Réalisez l'effet
4. Implémentation des fonctions principales
(1) Fonction de balayage de base (brûlant des mines aléatoires, insertion de drapeau)
(2) Vous pouvez choisir la difficulté (3) Vous pouvez personnaliser le nombre de mines de balayage et le nombre de grilles (4) Réglez le temps (5) Ajouter la fonction de classement (le stocker dans la base de données en fonction du temps)
(6) Le package dans les fichiers EXE (avec JRE) peut être exécuté sur plusieurs plates-formes. (Utilisez EXE4J pour emballer le package JAR)
Si vous avez besoin de code source, vous pouvez laisser un e-mail! Ceci est le code source: le jeu de balayage des mines
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.