A experiência de varredura de minas de Swing é para sua referência. O conteúdo específico é o seguinte
Recentemente, fiz um pequeno jogo depois de estudar Swing: Minesweeping
1. Design preliminar
2. Implementação
De fato, o núcleo de concluir este jogo está em manipular a matriz. O código principal abaixo é Main.java:
pacote primeiro; importar java.awt.color; importar java.awt.dimension; importar java.awt.font; importar java.awt.gridlayout; importar java.awt.image; import java.awt.toolkit; import.awt.datatransfer.clipboard; java.awt.Event.ActionListener; importar java.awt.event.mouseEvent; importar java.awt.event.mouselistener; importar java.io.bufferErader; import java.io.io.bufferwriter; import java.io.ioexception; import java.io.io.io.IlutEstern; java.net.net.erversocket; importar java.net.socket; importar java.sql.driverManager; importar java.sql.sqLexception; importar java.util.hashset; importUtATA.Utilicon; import java.util.uuid; import Javaxswing.imageicon; javax.jlabel; importar javax.swing.jmenu; importar javax.swing.jmenubar; importar javax.swing.jmenuitem; import javax.swing.joptionPane; importDoD.swing.Timer; com.mysql.jdbc.statement; a classe pública principal estende JFrame implementa ActionListener, mouselistener { / *** yijian* / private estático final serialversionuid = 1L; // Declaração de parâmetros iniciais Jmenuitem Jminew, Jmisave, Jmiopen, Jmiexit, Jmichuji, Jmizhongji, Jmigaoji, Jmishowinfo, Jmiziding; Toolkit Toolkit = Toolkit.getDefaultToolkit (); // Obtenha o kit de ferramentas padrão. CLIPBOARD CLIPBOARD = Toolkit.getSystemClipboard (); // Obtenha uma instância do sistema calibrar // como uma interface para a ferramenta de área de transferência fornecida pela plataforma nativa. // dois ícones 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 número é um número de trovão, você pode escrever um programa para alterar // private estático final int snum = 9; // Esta snum é o número de ladrilhos de lavagem de minas, você pode escrever um programa para alterar o jbutton privado [] JB; private int [] [] mapa; sinalizadores booleanos [] []; Bandeira booleana [] []; int couttime; // declarar a conexão de conexão Connection con; // Nome do driver String driver = "com.mysql.jdbc.driver"; // URL: aponte para o nome do banco de dados a ser acessado string url = "jdbc: mysql: // localhost: 3306/testsql3"; // mysql configurado user string user = "root"; // senha senha senha = "huang"; public main (int snum, int minas) {// Principal de interface do construtor de interface ("mina de mina"); // número inicial de trovão num = minas; Jmenubar Greenbar = new Jmenubar (); // Menu Container Greenbar.setOpAque (true); Greenbar.setBackground (nova cor (250, 250, 250)); Greenbar.setPreferredSize (nova dimensão (800, 28)); Greenbar.setFont (New Font (Font.Dialog_Input, Font.italic, 16)); // menu jmenu filemenu1 = new jmenu ("jogo"); Jmenu filemenu2 = novo jmenu ("dificuldade"); Jmenu filemenu3 = new jmenu ("ajuda:"); Greenbar.add (filemenu1); Greenbar.add (filemenu2); Greenbar.add (JMishowinfo = Filemenu3); filemenu1.setFont (nova fonte (font.dialog_input, font.italic, 16)); filemenu2.setFont (nova fonte (font.dialog_input, font.italic, 16)); filemenu3.setFont (nova fonte (font.dialog_input, font.italic, 16)); // Menu Item filemenu1.add (jminew = new jmenuitem ("novo jogo")); filemenu1.add (jmisave = new jmenuitem ("versão de classificação")); filemenu1.add (jmizing = new jmenuitem ("personalizado")); filemenu1.addseparator (); filemenu1.add (jmiexit = new jmenuitem ("exit")); filemenu2.add (jmichuji = novo jmenuitem ("junior")); filemenu2.add (jmizhongji = novo jmenuitem ("intermediário")); filemenu2.add (jmigaoji = new jmenuitem ("avançado")); filemenu3.add (jmishowinfo = new jmenuitem ("Informações do desenvolvedor")); Jminew.addactionListener (isto); Jmiexit.addactionListener (isto); Jmisave.addactionListener (isto); Jmisave.addactionListener (isto); Jmishowinfo.addactionListener (isto); Jmichuji.addactionListener (isto); Jmizhongji.addactionListener (isto); Jmigaoji.addactionListener (isto); Jmizing.addactionListener (isto); Jmizing.setFont (nova fonte (font.dialog_input, font.italic, 16)); Jmishowinfo.setFont (nova fonte (font.dialog_input, font.italic, 16)); Jminew.setFont (nova fonte (font.dialog_input, font.italic, 16)); Jmisave.setFont (nova fonte (font.dialog_input, font.italic, 16)); Jmiexit.setFont (nova fonte (font.dialog_input, font.italic, 16)); Jmichuji.setFont (nova fonte (font.dialog_input, font.italic, 16)); Jmizhongji.setFont (nova fonte (font.dialog_input, font.italic, 16)); Jmizhongji.setFont (nova fonte (font.dialog_input, font.italic, 16)); Jmigaoji.setFont (nova fonte (font.dialog_input, font.italic, 16)); setjmenubar (Greenbar); ICON da imagem = Toolkit.getDefaultToolkit (). GetImage ("g: //eclipse-workspace//classtest_thundergame//mine.png"); seticonimage (ícone); setlayout (novo gridlayout (snum, snum)); jb = novo jbutton [snum] [snum]; mapa = novo int [snum] [snum]; // mapeie os botões em uma matriz sinalizadores = new boolean [map.length] [map [0] .Length]; // Salvar o sinalizador da tabela de registro = new boolean [map.length] [map [0] .Length]; // salvar a tabela de registros int contagem = 0; // bleigh while (count <num) {int i = (int) (math.random () * map.length); // hang int j = (int) (math.random () * map [0] .Length); // mentira se (mapa [i] [j]! = ' *') {Map [i] [j] = ' *; contagem ++; }} 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 (nova cor (220, 220, 220)); jb [i] [j] .setFont (nova fonte (font.dialog_input, font.italic, 10)); jb [i] [j] .AddactionListener (isto); jb [i] [j] .addmouselistener (this); // Adicione o ouvinte do mouse Add (jb [i] [j]); }} // timer jlabel ststus = new jlabel (); Jlabel Times = new Jlabel (); Jlabel miao = new jlabel (); add (ststus); adicione (tempos); Times.settext ("0"); miao.settext ("segundos"); settimer (horários); couttime = 0; ststus.settext ("time:"); Greenbar.add (Ststus); Greenbar.add (Times, Right_alignment); Greenbar.add (Miao, Right_alignment); Times.setFont (nova fonte (font.dialog_input, font.italic, 16)); ststus.setFont (nova fonte (font.dialog_input, font.italic, 16)); miao.setFont (nova fonte (Font.Dialog_Input, Font.italic, 16)); Setsize (700, 700); setLocationRelativeTo (NULL); setvisible (true); // setDefaultCloseoperation (jframe.exit_on_close); setDefaultCloseoperation (descarte_on_close); // Adicione esta linha} private void settimer (tempo jlabel) {// Tempo escutando final Jlabel varea = time; Timer timeAction = new timer (1000, new ActionListener () {public void actionPerformed (ActionEvent e) {coutTime ++; vartime.settext (""+couttime);}}); timeAction.start (); } private void ShowTheClick (int x, int y) {// Clique em implementação de eventos se (map [x] [y] == '*') {jb [x] [y] .Seticon (icon); showmines (); } else {int count1 = 0; para (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] == '') }} sinalizadores [x] [y] = true; if (count1 == 0) {jb [x] [y] .setbackground (color.white); } else {jb [x] [y] .Settext (count1 + ""); jb [x] [y] .setFont (nova fonte (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] .l) {if (if! == false) {ShowTheClick (i, j); // Traversal de loop} else {// Prevenido Access repetido}}}}}}}}}}} private void showMines () {// Mostra todos os troncos // TODDO-GENERADO Método Stub (int i = 0; <map.length; //}}} // encerre o jogo int b = joptionpane.showOptionDialog (null, "Oh, ele explodiu, novo jogo?", "Confirme Box", JoptionPane.yes_no_option, JoptionPane.Question_Message, null, null, null); if (b == 1) {System.exit (0); } else {setVisible (false); novo principal (map.length, num); }} @Override public void ActionPerformed (ActionEvent e) {// Processamento de escuta de eventos // TODO Método Geralado Stub if (e.getSource () == jminew) {setvisible (false); novo principal (map.length, num); } else if (e.getSource () == jmisave) {showRange (); } else if (e.getSource () == jmiexit) {System.exit (0); } else if (e.getSource () == jmizing) {new Selfmines (); } else if (e.getSource () == jmichuji) {setVisible (false); novo principal (5,3); } else if (e.getSource () == jmishowinfo) {new Myinfo (); } else if (e.getSource () == jmizhongji) {setVisible (false); novo principal (10,10); } else if (e.getSource () == jmigaoji) {setVisible (false); novo principal (20,60); } else {objeto 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 (); // Verifique se o jogo acabou}} private void showRange () {// mostra a classificação nova shiyan13 (map.length); } private void checkSuccess () {// Determine se o jogo acabou // TODO Method Auto-Generated Stub int conting = map.length * map [0] .Length; for (int i = 0; i <map.length; i ++) {for (int j = 0; j <map [0] .Length; j ++) {if (sinalizadores [i] [j] == true) contagem--; }} if (count == num) {string uuid = uuid.randomuuid (). tostring (). replaceall ("-", ""); // a tabela indica exclusivamente uuid // link para os dados do banco de dados e armazenamento de tempo, tente {class.ForName (driver); con = (conexão) driverManager.getConnection (URL, usuário, senha); String sql; if (! con.iscLosed ()) {// ta.settext (""); System.out.println ("Conectando o banco de dados com sucesso"); // Crie instrução Object Declarent = (Declaração) Con.Createstatement (); // if (map.length == 10) {// // instrução sql a ser executada sql = "inserir em valores de middlerange (userID, usertime) (/" " + uuid +"/"," + couttime + ");"; declaration.executeUpdate (SQL); con.close (); } else if (map.length == 5) {sql = "inserir em valores de tocar (userID, usertime) (/" " + uuid +"/"," + couttime + ");"; declaration.executeUpdate (SQL); con.close (); } else if (map.length == 20) {sql = "inserir nos valores TopRange (UserID, Usertime) (/" " + uuid +"/"," + couttime + ");"; declaration.executeUpdate (SQL); con.close (); } else {}} catch (classNotFoundException e) {// Driver de driver de banco de dados System.out.println ("error"); E.PrintStackTrace (); } catch (sqLexception e) {// System.out.println (e); System.err.println ("dados não encontrados"); // int i = joptionpane.showconfirmdialog (null, "a instrução sql que você inseriu está incorreta", // "não encontrado", joptionpane.yes_no_option); } catch (Exceção e) {e.printStackTrace (); } finalmente {System.out.println ("O banco de dados obtém dados com sucesso!"); } int i = JoptionPane.ShowOptionDialog (NULL, "Parabéns por passar no teste, você continua?", "Confirmar Box", joptionpane.yes_no_option, joptionpane.question_message, null, null); // ststus.settext ("hello"+i); if (i == 1) {System.exit (0); } else {setVisible (false); novo principal (map.length, num); }}} @Override public void mouseclicked (mouseevent e) {// TODO Método Auto-Generado Stub int c = e.getButton (); if (c == mouseevent.button3) {objeto obj1 = e.getSource (); int x, y; String [] strm = ((jbutton) obj1) .getName (). Split ("_"); x = Integer.parseint (STRM [0]); y = Integer.parseint (STRM [1]); if (sinalizador [x] [y] == false && sinalizadores [x] [y] == false) {// insira o sinalizador jb [x] [y] .seticon (icon1); bandeira [x] [y] = true; } else {jb [x] [y] .seticon (null); bandeira [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. Perceba o efeito
4. Implementação de funções principais
(1) Função básica de varredura de minas (queima de mina aleatória, inserção de bandeira)
(2) Você pode escolher Dificuldade (3) Você pode personalizar o número de minas varrendo e o número de grades (4) Definir tempo (5) Adicionar função de classificação (armazená -lo no banco de dados de acordo com o tempo)
(6) A embalagem em um arquivo exe (com JRE) pode ser executada em várias plataformas. (Use exe4j para embalar o pacote JAR)
Se você precisar de código -fonte, pode deixar um email! Este é o código-fonte: jogo de varredura de minas
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.