Este artículo describe el juego de barrido de minas y la versión mejorada implementada por Java Swing. Compártelo para su referencia, como sigue:
Versión 1:
paquete 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.jframe; import javax.swing.jlabel; Ejemplo de barrido de minas, escrito por Swing, adecuado para principiantes para practicar* Este programa usa Setbounds (X, Y, W, H) para diseñar el método de control* se refiere al barrido de minas integrado en Win XP. Por supuesto, la función de escritura no se ha realizado, * algunas de las funciones realizadas tienen errores * * @author ping_qc */la prueba de clase pública extiende jframe implementa actionListener, runnable, mouseListener {private static final long SerialVersionUid = -2417758397965039613l; Private final int vacía = 0; Private final int mine = 1; Private Final Int Checked = 2; Private final int mine_count = 10; // El número de truenos privados finales int button_border = 50; // Tamaño de cada punto Private Final int mine_size = 10; // especificación de interfaz, 20x20 privado final int inicio_x = 20; // Iniciar posición x private final int inicio_y = 50; // Iniciar posición y bandera booleana privada; privado jbutton [] [] jb; Privado Jlabel JL; Private Jlabel Showtime; private int [] [] mapa; /*** Detectar si hay un rayo alrededor de un punto. Las coordenadas de los puntos circundantes se pueden calcular a partir de esta matriz*/ private int [] [] mv = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {-1, -1}; / *** genera aleatoriamente un número establecido de truenos*/ 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] == vacía) {map [tx] [ty] = mine; i ++; // No recuerde el Lightning repetido}}}}/ *** Ponga la matriz de botones en el marco y corresponda al mapa [] [] Array*/ public void MakeButton () {for (int i = 0; i <mine_size; i ++) {int j = 0; j <mine_size; j ++) {jb [i] [j] = new jbutton (); // if (map [i] [j] == mía) // jb [i] [j] .settext (i+","+j); // oyente agregue jb [i] [j] .addactionListener (this); jb [i] [j] .addmouselistener (esto); jb [i] [j] .setName (i + "_" + j); // El clic conveniente es determinar en qué botón se hizo clic // Font Font = New Font (Font.Serif, Font.Bold, 10); // jb [i] [j] .setFont (fuente); // 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 ("Bienvenido a la prueba, hay un total de" + minero_count + "Thunder"); jl.setVisible (verdadero); JL.SetBounds (20, 20, 500, 30); this.add (JL); showtime.settext ("Elapsed: 0 segundos"); showtime.setBounds (400, 20, 100, 30); this.add (showtime); makemine (); makeButton (); this.setsize (550, 600); this.setLocation (700, 100); this.setResizable (falso); this.setDefaultCloseOperation (EXIT_ON_CLOSE); this.setVisible (verdadero); } prueba pública (título de cadena) {super (título); this.setLayout (nulo); // No usar el Administrador de diseño, establezca la posición de cada control con SetBounds jb = new JButton [MINE_SIZE] [MINE_SIZE]; jl = new JLabel (); showtime = new JLabel (); map = new int [mine_size] [mine_size]; // asigna los botones en una matriz} public static void main (string [] args) {test test = new test ("wulin.com-min sideing game test 1"); test.init (); test.run (); } @Override public void ActionPerformed (ActionEvent e) {object obj = e.getSource (); int x, y; if ((obj instancia de jButton) == false) {showMessage ("error", "error interno"); devolver; } String [] tmp_str = ((jButton) obj) .getName (). Split ("_"); x = Integer.ParseInt (tmp_str [0]); y = Integer.ParseInt (tmp_str [1]); if (map [x] [y] == mía) {showMessage ("muerte", "pisaste una mina ~~~"); bandera = verdadero; showmine (); devolver; } dfs (x, y, 0); checkSuccess (); } / ** * Después de cada clic, determine si todos los iluminados se han encontrado calculando el número de botones con estado habilitado * / 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", "Cuando se comparte este mino:" + tmp_str + "segundos"); bandera = verdadero; showmine (); }} private int dfs (int x, int y, int d) {map [x] [y] = checked; int i, tx, ty, cnt = 0; para (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] == mine) {cnt ++; // estadísticas del número de truenos cerca de este punto} else if (map [tx] [ty] == vacío) {; } else if (map [tx] [ty] == checked) {; }}} 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]! = checked) {dfs (tx, ty, d + 1); }}} else {jb [x] [y] .settext (cnt + ""); } jb [x] [y] .SetEnabled (falso); devolver cnt; } / ** * Mostrar información sobre la etiqueta jl * * @param title * @param info * / private void showMessage (título de cadena, info de cadena) {jl.setText (info); System.out.println ("en Functino showMessage ():" + info); } public void run () {int t = 0; while (true) {if (flag) {break; } try {thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } t ++; showtime.settext ("Elapsed:" + t + "segundos"); } // showMine (); } private void showMine () {// icon iconMine = new ImageCon ("e: /Mine.jpg"); for (int i = 0; i <mine_size; i ++) {for (int j = 0; j <mine_size; j ++) {if (map [i] [j] == my) {jb [i] [j] .settext ("#"); // jb [i] [j] .seticon (iconmine); }}}} @Override public void mouseClicked (mouseEvent e) {if (e.getButton () == 3) {object obj = e.getSource (); if ((obj instancia de jButton) == false) {showMessage ("error", "error interno"); devolver; } 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 (nulo); }*/}} @Override public void mousePressed (mouseEvent e) {// toDO met Método Generado Stub} @Override public void Mousereleded (MouseEvent E) {// TODO Método Automático Generado} @Override Public Void Mouseentered (mouseEvent E) {// ToDO Auto Method Stub} @Override public void MouseExited (MouseEvent E) {// TODO Método Generado automático}}Efecto de ejecución:
La versión 2 es una mejora en el programa de la versión 1 anterior, y la función de marcado de clic derecho y la función de dificultad de selección independiente se agregan sobre la base de la base sin cambios.
paquete 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.jframe; importar; import javax.swing.jlabel; @suppleswarnings ("serial") clase pública saolei extiende jframe implementa actionListener, runnable, mouselistener {private final int loempty = 0; Private final int lomine = 1; Private final int Lochecked = 2; Private final int lomine_count = 10; Private final int lobutton_border = 50; Private final int lomine_size = 10; Private final int Lostart_x = 20; Private final int Lostart_y = 50; bandera booleana privada; privado jbutton [] [] jb; Privado Jlabel JL; Private Jlabel Showtime; private int [] [] mapa; private int [] [] mv = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; public void makelomine () {int i = 0, tx, ty; for (; i <lomine_count;) {tx = (int) (math.random () * lomine_size); ty = (int) (math.random () * lomine_size); if (map [tx] [ty] == loempty) {map [tx] [ty] = lomine; i ++; }}} public void makeButton () {for (int i = 0; i <lomine_size; i ++) {for (int j = 0; j <lomine_size; j ++) {jb [i] [j] = new JButton (); jb [i] [j] .addactionListener (esto); jb [i] [j] .addmouselistener (esto); 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 ("Prueba bienvenida, hay un total de" + lomine_count + "Thunder"); jl.setVisible (verdadero); JL.SetBounds (20, 20, 500, 30); this.add (JL); showtime.settext ("Elapsed: 0 segundos"); showtime.setBounds (400, 20, 100, 30); this.add (showtime); makelomine (); makeButton (); this.setsize (550, 600); this.setLocation (700, 100); this.setResizable (falso); this.setDefaultCloseOperation (EXIT_ON_CLOSE); this.setVisible (verdadero); } public saolei (título de cadena) {super (título); this.setLayout (nulo); // no se usa administrador de diseño, setbounds para la posición de cada control jb = new JButton [lomine_size] [lomine_size]; jl = new JLabel (); showtime = new JLabel (); map = new int [lomine_size] [lomine_size]; // asigna los botones en una matriz} public static void main (string [] args) {saolei test = new saolei ("wulin.com-min-sweing game test 2"); test.init (); test.run (); } @Override public void ActionPerformed (ActionEvent e) {object obj = e.getSource (); int x, y; if ((obj instancia de jButton) == false) {showMessage ("error", "error interno"); devolver; } 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 ("muerte", "pisaste una mina ~~~"); bandera = verdadero; showlomine (); devolver; } dfs (x, y, 0); checkSuccess (); } private void checkSuccess () {int cnt = 0; for (int i = 0; i <lomine_size; i ++) {for (int j = 0; j <lomine_size; j ++) {if (jb [i] [j] .ISEnabled ()) {cnt ++; }}} if (cnt == lomine_count) {string tmp_str = showtime.gettext (); tmp_str = tmp_str.replaceall ("[^0-9]", ""); showMessage ("Victory", "Cuando se comparte este mino:" + tmp_str + "segundos"); bandera = verdadero; showlomine (); }} private int dfs (int x, int y, int d) {map [x] [y] = Lochecked; int i, tx, ty, cnt = 0; para (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] == lomine) {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 (falso); devolver cnt; } private void showMessage (título de cadena, información de cadena) {jl.setText (info); System.out.println ("en Functino showMessage ():" + info); } public void run () {int t = 0; while (true) {if (flag) {break; } try {thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } t ++; showtime.settext ("Tiempo elapsado:" + t + "segundos"); }} private void showlomine () {for (int i = 0; i <lomine_size; i ++) {for (int j = 0; j <lomine_size; j ++) {if (map [i] [j] == lomine) {jb [i] [j] .setText ("therunder"); }}}} public void MouseClicked (MouseEvent E) {if (e.getButton () == 3) {object obj = e.getSource (); if ((obj instancia de jButton) == false) {showMessage ("error", "error interno"); devolver; } 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 mousePressed (MouseEvent e) {} @Override public void MouserElEded (MouseEvent E) {} public void mouseEned (mouseEvent E) {} @Override public void mouseeExited (mouseEvent e)}}Efecto de ejecución:
Para obtener más información sobre los algoritmos de Java, los lectores interesados en este sitio pueden ver los temas: "Estructura de datos Java y tutorial de algoritmo", "Resumen de las puntas de nodo de operación de Java DOM", "Resumen de Java Archivo y TIPS de operación de directorio" y "Summary of Java Cache Operation Tips" TIPS ""
Espero que este artículo sea útil para la programación Java de todos.