La experiencia de Swing Mine Sweeping es para su referencia. El contenido específico es el siguiente
Recientemente, hice un juego pequeño después de estudiar Swing: Minesweeping
1. Diseño preliminar
2. Implementación
De hecho, el núcleo de completar este juego radica en manipular la matriz. El código principal a continuación es Main.java:
paquete primero; import java.awt.color; import java.awt.dimension; import java.awt.font; import java.awt.gridLayout; import java.awt.image; import java.awt.toolkit; import java.awt.awatatransfer.clipboard; import java.awt.event.ActionEvent; java.awt.event.actionListener; import java.awt.event.mouseEvent; import java.awt.event.mouseListener; import java.io.bufferedReader; import java.io.bufferedwriter; import java.io.ioxception; import java.io.inputstreamreader; import java.io.io.outputter; 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.uUuid; import javax.swing.imageicon; import javaxswing.jebutton; import; javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jmenu; import javax.swing.jmenubar; import javax.swing.jmenuitem; import javax.swing.joptionpane; import javax.swing.timer; import.mysql.jdbc.connection; import com.mysql.jdbc.Statement; public class Main extiende jframe implementos ActionListener, MouseListener { / *** yijian* / private estático final Long SerialVersionUid = 1l; // Declaración de parámetros tempranos JMenuitem JMinew, JMisave, Jmiopen, Jmiexit, JMichuji, Jmizhongji, JmigaJi, Jmishowinfo, Jmiziding; Toolkit Toolkit = Toolkit.getDefaultToolkit (); // Obtenga el kit de herramientas predeterminado. Portapbook Cappoback = Toolkit.getSystemClipboard (); // Obtenga una instancia del sistema Calibrar // como una interfaz para la herramienta de portapapeles proporcionada por la plataforma nativa. // Dos iconos Imageicon icon = new Imageicon ("g: //eclipse-workspace//classtest_thundergame//mine.png"); Imageicon icon1 = new Imageicon ("g: //eclipse-workspace//classtest_thundergame//flag.png"); Private static int num = 1; // Este num es un número de trueno, puede escribir un programa para cambiar // private static final int snum = 9; // Este snum es el número de mosaico de subida de minas, puede escribir un programa para cambiar jbutton privado [] [] jb; private int [] [] mapa; boolean [] [] banderas; boolean [] [] bandera; int couttime; // Declarar el objeto de conexión Connection Con; // Nombre del controlador String Driver = "com.mysql.jdbc.driver"; // URL: apunte al nombre de la base de datos a acceder a String url = "jdbc: mysql: // localhost: 3306/testSql3"; // MySQL Configurado String de usuario String user = "root"; // Password String Password = "Huang"; Public Main (int Snum, int Minas) {// Interfaz principal Constructor Settitle ("Mina-Sweeping"); // Número inicial de trueno num = minas; JMenubar GreenBar = new JMenubar (); // Contenedor de menú GreenBar.SetOpaque (verdadero); GreenBar.SetBackground (nuevo color (250, 250, 250)); GreenBar.SetPreferedSize (nueva dimensión (800, 28)); GreenBar.SetFont (nueva fuente (font.dialog_input, font.italic, 16)); // menú jmenu fileMenu1 = new JMenu ("Juego"); JMenu fileMenu2 = new JMenu ("Dificultad"); JMenu fileMenu3 = new JMenu ("Ayuda:"); GreenBar.Add (FileMenu1); GreenBar.Add (fileMenu2); GreenBar.Add (JMishoWinfo = fileMenu3); fileMenu1.setFont (nueva fuente (font.dialog_input, font.italic, 16)); fileMenu2.setFont (nueva fuente (font.dialog_input, font.italic, 16)); fileMenu3.setFont (nueva fuente (font.dialog_input, font.italic, 16)); // elemento de menú fileMenu1.add (jminew = new JMenuitem ("nuevo juego")); fileMenu1.add (jmisave = new JMenuitem ("Versión de clasificación")); fileMenu1.add (jmiziding = new JMenuitem ("Custom")); fileMenu1.addseparator (); fileMenu1.add (jmiexit = new JMenuitem ("Salir")); fileMenu2.Add (JMichuji = new JMenuitem ("Junior")); fileMenu2.Add (jmizhongji = new JMenuitem ("Intermediate")); fileMenu2.add (jmigaoji = new JMenuitem ("avanzado")); fileMenu3.add (jmishowinfo = new JMenuitem ("Información del desarrollador")); JMinew.AddactionListener (esto); Jmiexit.addactionListener (esto); Jmisave.addactionListener (esto); Jmisave.addactionListener (esto); Jmishowinfo.addactionListener (esto); Jmichuji.addactionListener (esto); Jmizhongji.addactionListener (esto); Jmigaoji.addactionListener (esto); Jmiziding.addactionListener (esto); Jmiziding.setFont (nueva fuente (font.dialog_input, font.italic, 16)); Jmishowinfo.setFont (nueva fuente (font.dialog_input, font.italic, 16)); JMinew.SetFont (nueva fuente (font.dialog_input, font.italic, 16)); Jmisave.setFont (nueva fuente (font.dialog_input, font.italic, 16)); JMIEXIT.SETFONT (nueva fuente (font.dialog_input, font.italic, 16)); JMichuji.setFont (nueva fuente (font.dialog_input, font.italic, 16)); Jmizhongji.setFont (nueva fuente (font.dialog_input, font.italic, 16)); Jmizhongji.setFont (nueva fuente (font.dialog_input, font.italic, 16)); Jmigaoji.setFont (nueva fuente (font.dialog_input, font.italic, 16)); setJmenubar (barra verde); Icon de imagen = Toolkit.getDefaultToolkit (). setiConImage (icono); setLayout (nuevo GridLayout (Snum, Snum)); jb = nuevo JButton [Snum] [Snum]; map = new int [snum] [snum]; // asigna los botones en un indicador de matriz = new Boolean [map.length] [map [0] .length]; // Guardar el indicador de la tabla de registro = new Boolean [map.length] [map [0] .length]; // Guardar la tabla de registros int count = 0; // bleigh while (count <num) {int i = (int) (math.random () * map.length); // hang int j = (int) (math.random () * map [0] .length); // lie if (map [i] [j]! = ' *') {Map [i] [j] = ' *'; contar ++; }} para (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 (nuevo color (220, 220, 220)); jb [i] [j] .setFont (nueva fuente (font.dialog_input, font.italic, 10)); jb [i] [j] .addactionListener (esto); jb [i] [j] .addmouselistener (this); // Agregar oyente del mouse add (jb [i] [j]); }} // temporizador jlabel ststus = new JLabel (); JLabel Times = new JLabel (); Jlabel miao = new JLabel (); agregar (ststus); agregar (tiempos); Times.settext ("0"); miao.settext ("segundos"); setimer (tiempos); Couttime = 0; ststus.settext ("Time:"); Greenbar.add (ststus); GreenBar.add (Times, Right_alignment); GreenBar.add (Miao, Right_alignment); Times.setFont (nueva fuente (font.dialog_input, font.italic, 16)); ststus.setFont (nueva fuente (font.dialog_input, font.italic, 16)); miao.setFont (nueva fuente (font.dialog_input, font.italic, 16)); setSize (700, 700); setLocationrelativeto (nulo); setVisible (verdadero); // setDefaultCloseOperation (jframe.exit_on_close); setDefaultCloseOperation (disposición_on_close); // Agregar esta línea} private void settimer (jlabel time) {// tiempo escuchando final jlabel vartime = time; Temporizante TimeAction = New Timer (1000, New ActionListener () {public void ActionPerformed (ActionEvent E) {Couttime ++; VarTime.setText (""+Couttime);}}); TIMEACTION.Start (); } private void showTheClick (int x, int y) {// Haga clic en Implementación de eventos if (map [x] [y] == '*') {jb [x] [y] .seticon (icon); showmines (); } else {int count1 = 0; for (int a = x - 1; a <= x+1; a ++) {for (int b = y - 1; b <= y+1; b ++) {if (! (a <0 || b <0 || b> = map [0] .length || a> = map.length) && map [a] [b] == '*') Count1 ++; }} flags [x] [y] = true; if (count1 == 0) {jb [x] [y] .setbackground (color.white); } else {jb [x] [y] .settext (count1 + ""); jb [x] [y] .setFont (nueva fuente (font.dialog_input, font.italic, 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)) {! (I == x & & & j == false) {showThEclick (i, j); // bucle traversal} else {// prevenir acceso repetido}}}}}}}}}} private void showmines () {// show thol thunders // todo auto-métodos generado por (int i = 0; i <map.length; i ++) <map.length; //}}} // finaliza el juego int b = joptionPane.ShowOptionDialog (nulo, "oh, explotó, nuevo juego?", "Confirmar cuadro", joptionpane.yes_no_option, joptionpane.question_message, null, null, null); if (b == 1) {System.exit (0); } else {setVisible (false); nuevo Main (map.length, num); }} @Override public void ActionPerformed (ActionEvent E) {// Procesamiento de escucha de eventos // TODO Auto Generado Método STUB if (E.GetSource () == JMinew) {setVisible (falso); nuevo 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); nuevo Main (5,3); } else if (e.getSource () == jmishowinfo) {new myInfo (); } else if (e.getSource () == jmizhongji) {setVisible (false); nuevo Main (10,10); } else if (e.getSource () == jmigaJi) {setVisible (false); nuevo Main (20,60); } else {object obj = e.getSource (); int x, y; Cadena [] strm = ((jButton) obj) .getName (). Split ("_"); x = integer.parseInt (strm [0]); y = Integer.ParseInt (strm [1]); showtheclick (x, y); checkSuccess (); // Compruebe si el juego ha terminado}} private void showRange () {// show ranking nuevo shiyan13 (map.length); } private void checkSuccess () {// Determine si el juego ha terminado // TODO Método Generado automático 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 (). replaceAll ("-", ""); // La tabla indica UUID // enlace a la base de datos y datos de tiempo de almacenamiento {class.forname (controlador); con = (conexión) drivermanager.getConnection (url, usuario, contraseña); Cadena sql; if (! Con.isClosed ()) {// ta.settext (""); System.out.println ("Conectar la base de datos con éxito"); // Crear instrucción de objeto Declaración = (Declaración) Con.CreateStatement (); // if (map.length == 10) {// // La instrucción SQL se ejecutará sql = "insertar en valores middlerange (userId, userTime) (/" " + uuid +"/"," + couttime + ");"; Declary.ExecuteUpdate (SQL); con.close (); } else if (map.length == 5) {sql = "inserte en valores de rang (userId, userTime) (/" " + uuid +"/"," + couttime + ");"; Declary.ExecuteUpdate (SQL); con.close (); } else if (map.length == 20) {sql = "inserte en valores toprange (userId, userTime) (/" " + uuid +"/"," + couttime + ");"; Declary.ExecuteUpdate (SQL); con.close (); } else {}} Catch (ClassNotFoundException e) {// Database Driver Class Exception Handling System.out.println ("Error"); E.PrintStackTrace (); } catch (sqlexception e) {// system.out.println (e); System.err.println ("datos no encontrados"); // int i = joptionPane.showConfirmDialog (nulo, "La instrucción SQL que ingresó es incorrecta", // "no encontrado", joptionpane.yes_no_option); } catch (Exception e) {E.PrintStackTrace (); } Finalmente {System.out.println ("¡La base de datos obtiene datos con éxito!"); } int i = jOptionPane.ShowOptionDialog (nulo, "Felicitaciones por aprobar la prueba, ¿continúa?", "Confirmar cuadro", JOptionPane.Yes_NO_Option, jOptionPane.Question_Message, Null, Null, Null); // ststus.settext ("hola"+i); if (i == 1) {System.exit (0); } else {setVisible (false); nuevo Main (map.length, num); }}} @Override public void MouseClicked (MouseEvent E) {// TODO Método Generado automático int c = e.getButton (); if (c == MouseEvent.Button3) {object obj1 = e.getSource (); int x, y; Cadena [] strm = ((jButton) obj1) .getName (). Split ("_"); x = integer.parseInt (strm [0]); y = Integer.ParseInt (strm [1]); if (flag [x] [y] == false && flags [x] [y] == false) {// Inserte el indicador jb [x] [y] .Seticon (icon1); bandera [x] [y] = true; } else {jb [x] [y] .Seticon (nulo); bandera [x] [y] = false; } } } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub }}3. Date cuenta del efecto
4. Implementación de funciones principales
(1) Función básica de barrido de minas (quema de minas aleatoria, inserción de la bandera)
(2) Puede elegir la dificultad (3) Puede personalizar el número de barrido de minas y el número de cuadrículas (4) establecer el tiempo (5) Agregar función de clasificación (almacenarla en la base de datos según el tiempo)
(6) Empaquetarlo en un archivo EXE (con JRE) se puede ejecutar en múltiples plataformas. (Use exe4j para empaquetar el paquete jar)
Si necesita código fuente, ¡puede dejar un correo electrónico! Este es el código fuente: juego de barrido de minas
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.