Siguiendo con los Juegos en Java, os pongo el código del Busca Minas , todo un clásico de Windows.
La verdad que éste me ha parecido bastante fácil de realizar, ideal para ir probando como funcionan las cosas en java.
El código del Busca Minas es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | import javax.swing.JFrame; import java.awt.Dimension; import javax.swing.JPanel; import java.awt.Rectangle; import java.awt.Color; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.Font; import javax.swing.SwingConstants; import java.awt.Insets; public class Frame extends JFrame { private JPanel jPanel1 = new JPanel(); private JButton jButton1 = new JButton(); private int ancho=19; private int alto=12; public JButton Botones[][]=new JButton [ancho][alto]; public String [][] elArray =new String [ancho][alto]; //—- Dependiendo del ancho también asignaré el número de bombas public static void main (String [] args){ Frame TabBuscaMin = new Frame(); } public Frame() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { this.getContentPane().setLayout(null); this.setSize(new Dimension(483, 380)); this.setTitle("Busca Minas"); jPanel1.setBounds(new Rectangle(0, 40, 483, 380)); jPanel1.setBackground(new Color(162, 175, 227)); jPanel1.setLayout(null); jButton1.setText("START"); jButton1.setBounds(new Rectangle(0, 0, 125, 40)); jButton1.setFont(new Font("Tahoma", 0, 12)); jButton1.setHorizontalTextPosition(SwingConstants.CENTER); jButton1.setAlignmentY((float)0.0); jButton1.setMargin(new Insets(2, 14, 2, 12)); jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jButton1_actionPerformed(e); } }); this.getContentPane().add(jButton1, null); this.getContentPane().add(jPanel1, null); cargarTablero(); colocarBomba(getAncho()); comprueba(); this.setVisible(true); //—- Oculta los botones del contorno que no participaran en el juego. ocultaBotones(); } private void jButton1_actionPerformed(ActionEvent e) { for (int i=0;i<ancho;i++){ for (int z=0;z<alto;z++){ elArray[i][z]=" "; Botones[i][z].setEnabled(true); Botones[i][z].setText(" "); } } colocarBomba(getAncho()); comprueba(); this.setTitle("Busca Minas"); jButton1.setText("START"); } //—– Inicializa el tablero a 0 public void cargarTablero(){ for (int i=0;i<ancho;i++){ for (int z=0;z<alto;z++){ elArray[i][z]=" "; Botones[i][z]= new JButton(); jPanel1.add(Botones[i][z]); Botones[i][z].setBounds(i*25,z*25,25,25); Botones[i][z].setMargin(new Insets(0, 0, 0, 0)); Botones[i][z].setFont(new Font("Tahoma", 0,10)); //—– Agrego un ActionListener a cada boton del Array de Botones //—– Ahora puede escuchar eventos. Botones[i][z].addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent ar) { for (int i=0;i<ancho;i++){ for (int z=0;z<alto;z++){ if (ar.getSource()==Botones[i][z]){ showTextTop(i,z); //—– Cada Evento llama al método pulsarBoton. } } } } } ); } } } //—- Coloca el numero de bombas dependiendo el ancho. public void colocarBomba(int numeroBombas){ double i=0; double z=0; int condicion=0; do { i=Math.random()*getAncho(); z=Math.random()*getAlto(); i=(int)i; z=(int)z; if (z!=0 && i!=0 && z!=alto-1 && i!=ancho-1){ // Botones[(int) i][(int) z].setText("B"); elArray[(int)i][(int) z ]="B"; condicion++; } } while (condicion<=ancho); } public void setAncho (int sAncho){ ancho=sAncho; } public int getAncho (){ return ancho; } public void setAlto (int sAlto){ alto=sAlto; } public int getAlto (){ return alto; } //—- Asigna un número a cada boton dependiendo de las B que tenga al lado. //--- codigo Busca Minas public void comprueba(){ for (int i=0;i<ancho;i++){ for (int z=0;z<alto;z++){ int numeroComprueba=0; //el numero que voy a asignar al boton if (elArray[i][z]!=("B")){ if (z!=0 && i!=0 && z!=alto-1 && i!=ancho-1){ System.out.println(i+ " "+ z +" "+ ancho +" " +alto); if (elArray[i][z-1]=="B"){ numeroComprueba++; } if (elArray[i-1][z-1]=="B"){ numeroComprueba++; } if (elArray[i+1][z-1]=="B"){ numeroComprueba++; } if (elArray[i][z+1]=="B"){ numeroComprueba++; } if (elArray[i+1][z+1]=="B"){ numeroComprueba++; } if (elArray[i-1][z+1]=="B"){ numeroComprueba++; } if (elArray[i+1][z]=="B"){ numeroComprueba++; } if (elArray[i-1][z]=="B"){ numeroComprueba++; } if (numeroComprueba!=0){ elArray[i][z]=(String.valueOf(numeroComprueba)); } } } } } } //—- Oculta los botones de los laterales. public void ocultaBotones(){ for (int i=0;i<ancho;i++){ for (int z=0;z<alto;z++){ if (z==0 || i==0 || z==alto-1 || i==ancho-1){ Botones[i][z].setVisible(false); } } } } //—- Muestra el texto en todos los botones cuando hay bomba. public void textoBotones(){ for (int i=0;i<ancho;i++){ for (int z=0;z<alto;z++){ Botones[i][z].setText(elArray[i][z]); Botones[i][z].setEnabled(false); //codigo para mostrar el texto encima del boton. } } } //—- Muestra el Numero encima del boton. //—- Cambia las propiedades del boton mostrado. public void showTextTop(int i,int z){ Botones[i][z].setText(elArray[i][z]); Botones[i][z].setEnabled(false); if (elArray[i][z]==" "){ Botones[i][z].setEnabled(false); metodoStackOverFlow(i,z); } else { Botones[i][z].setEnabled(false); } if (Botones[i][z].getText()=="B"){ textoBotones(); } } //—- Pone el numero en los botones cercanos. private void metodoStackOverFlow(int i, int z) { if ( z!=0 && i!=0 && z!=alto-1 && i!=ancho-1){ Botones[i-1][z].setEnabled(false); Botones[i-1][z-1].setEnabled(false); Botones[i-1][z+1].setEnabled(false); Botones[i][z-1].setEnabled(false); Botones[i][z+1].setEnabled(false); Botones[i+1][z].setEnabled(false); Botones[i+1][z+1].setEnabled(false); Botones[i+1][z-1].setEnabled(false); Botones[i-1][z].setText(elArray[i-1][z]); Botones[i-1][z-1].setText(elArray[i-1][z-1]); Botones[i-1][z+1].setText(elArray[i-1][z+1]); Botones[i][z-1].setText(elArray[i][z-1]); Botones[i][z+1].setText(elArray[i][z+1]); Botones[i+1][z].setText(elArray[i+1][z]); Botones[i+1][z+1].setText(elArray[i+1][z+1]); Botones[i+1][z-1].setText(elArray[i+1][z-1]); } } //—- Este es el metodo que mostrara el final del game. //—- 17 columnas por 10 lineas visibles= 170 Botones[][] //—- 170 - 19 Bombas = 171 Botones con Texto //--- codigo Busca Minas public void finalGame (){ int contadorFinal=0; for (int i=1;i<ancho-1;i++){ for (int z=1;z<alto-1;z++){ if (Botones[i][z].getText()==" " || Botones[i][z].getText()=="1" || Botones[i][z].getText()=="2" || Botones[i][z].getText()=="3" || Botones[i][z].getText()=="5" || Botones[i][z].getText()=="4" ){ contadorFinal++; if (contadorFinal==171){ this.setTitle("Has Ganado… oooooo….."); jButton1.setText("NEW…"); } } } } } } |
Espero que os sirva.
4 comments
Join the conversationNMSmwbqY2 - 30 agosto, 2010
I want to post quick hello and want to say appriciate for this good article. G3sXe7OnjxwLRb
antonio - 7 septiembre, 2010
Hola, enhorabuena por el trabajo.
Estaba interesado en este codigo pero no puedo acceder al archivo comprimido, ya que parece que no esta en internet. Podria enviarmelo por correo electronico? Muchisimas gracias, me urge una aplicacion tan apañada como esta
Rodolfo - 22 febrero, 2013
Me puede indicar por que el &, copie mi codigo cual esta letra por letra y me da errores. Gracias.
Ber - 23 febrero, 2013
Hola Rodolfo,
Ya lo tienes corregido, al formatear el texto para ponerlo en la web, me cambió algunos caracteres.
Saludos
Related Posts
Previsión de amenazas de seguridad en la red para 2013-2014
Ber 13 mayo, 2013Resumen del 2012
En estos últimos años, ha habido un incremento de vulnerabilidades y ataques a través de las redes. Las causas de este incremento de vulnerabilidades durante el año 2012 fueron las siguientes:
- El aumento de la movilidad de los datos a los entornos de red, actualmente las empresas están incorporando la posibilidad de que todos los usuarios puedan acceder a sus datos desde cualquier lugar.
- La diversidad de los entornos de trabajo a diferentes plataformas cada vez tiene más presencia en las empresas (Distribuciones Linux, Windows, Mac), por lo que es necesario ampliar el rango de protección de los equipos.
- Están surgiendo cada vez más programas maliciosos destinados a plataformas móviles, siendo Android el objetivo de la gran mayoría.
- Se ha incrementado el uso de dispositivos personales (Tablets, Teléfonos inteligentes) dentro de los entornos laborales, en los que la seguridad o protección de los mismos no recae sobre el administrador de sistemas.
- El uso de internet sigue creciendo y es la vía principal de distribución de código malicioso.
- Existen empresas que crean y distribuyen software destinado a realizar ataques de seguridad, que es utilizado por otras empresas para comprobar sus vulnerabilidades frente ataques y que finalmente acaban en manos de terceros que destinan el software a hacer ataques reales de seguridad.
- También han aparecido nuevas distribuciones de software desarrollado para realizar ataques de seguridad como la distribución de blackhole que cada vez es más popular.
- La forma tradicional de ataque sigue siendo a sitios web que no están actualizados o que están mal configurados, cobran importancia las actualizaciones de seguridad en las plataformas o gestores de contenidos que se utilizan para desarrollar las aplicaciones web.
Actualidad
Como era previsible el incremento de servicios, y datos en la nube es cada vez mayor. Tanto desde el punto de vista personal como laboral, ya que las empresas están cambiando a entornos en la nube. Por lo tanto, esta nueva adaptación en las empresas tendrá que estar respaldada por administradores de redes que sean capaces de mantener el entorno de trabajo libre de malware que pueda ocasionar perdidas de datos o interrupciones de servicios.
Como podemos ver diariamente la pérdida de datos y contraseñas de usuarios existe en todas las empresas, e incluso las empresas más grandes del sector de las TIC tienen grandes vulnerabilidades y los hackers son capaces de entrar en el sistema y obtener datos importantes de los clientes. En el último año, hemos visto como perdían o se publicaban datos importantes de los usuarios (contraseñas, tarjetas de crédito, etc) de grandes compañías. Este es un resumen de los más importantes del último año:
Cifras
- La red social Linkedln tuvo un problema de seguridad que los hacker aprovecharon y obtuvieron la cifra de 6.5 millones de contraseñas de usuarios.
- La web de contactos eHarmony perdió 1,5 millones de contraseñas de usuarios.
- Formspring encontró que se habían publicado en internet casi medio millón de contraseñas de usuario, debido a esto pidió que los 28 millones de inscritos cambiasen sus contraseñas.
- Yahoo reconoció que habían sido robadas medio millón de direcciones de correo electrónico y contraseñas de usuarios.
- Philips también sufrió un ataque en el que perdió el control de miles cuentas de usuario, con sus números de teléfono, direcciones, contraseñas, etc.
Posibles soluciones
Contemplando el escenario actual, los administradores de sistemas deben de tener en cuenta las últimas estrategias de seguridad, entre las que podemos encontrar las siguientes:
- Controlar el uso o eliminar en caso innecesario los complementos Java de los navegadores ya que durante el último año estos complementos han demostrado ser muy vulnerables a los ataques de terceros.
- Reiterar el uso de contraseñas seguras y diferentes en todos los sitios que almacenen
información importante,
- No almacenar las contraseñas en una base de datos en la que se encuentren los datos sin cifrar. Aplicar algoritmos hash varias veces para que resulte más difícil encontrar las contraseñas durante un ataque.
- Proteger la base de datos de contraseñas, la red y los servidores con sistemas de defensas por capas.
- Eliminar software antiguo o desactualizado que pueda ser vulnerable, como los Gadgets de Windows Sidebar y Gadgets de Windows Vista y Windows 7 ya que Microsoft desaconseja el uso de estos Gadgets por razones de seguridad. Se han eliminado en las últimas versiones de Windows por este mismo problema.
- Reducir la superficie expuesta a ataques: adoptar un enfoque activo para vigilar programas maliciosos y vulnerabilidades dentro de las aplicaciones, sitios web y correos no deseados.
- Protección en todos los puntos de acceso: asegurarse que los usuarios están protegidos en cualquier lugar e independientemente del dispositivo que utilicen (móviles, tabletas, etc), y que utilicen tecnologías que ofrezcan garantías de protección sin afectar a los usuarios ni al rendimiento.
- Bloquear ataques y filtraciones, utilizar sistemas que puedan bloquear las amenazas en sus diferentes fases de ejecución, para permitir bloquear un ataque en diferentes capas independientes entre sí.
Opinión personal
Como conclusión, los administradores deben de proteger un abanico muy amplio de dispositivos y software dentro de una misma empresa, para facilitar esta tarea sería conveniente reducir los posibles escenarios de ataques así como establecer un sistema de bloqueo de las amenazas en diferentes capas por si alguna de las capas falla poder parar la amenaza en la siguiente capa, por último añadir como un buen plan de recuperación de las posibles amenazas que permita restaurar el sistema lo antes posible en caso de fallo de seguridad.
Leer másPoner una página de mantemiento en tu web
Ber 29 abril, 2013Este código nos permitiría poner una Web en modo de mantenimiento de tal manera que solamente tú puedas ver una parte de la web y el resto de personas vean la página de mantenimiento.
En un servidor linux tienes que editar el fichero .htaccess e incorporar las líneas siguientes:
Sustituyendo las xxx.xxx.xxx.xxx por la IP de tu router, podéis omitir esta línea sino vais a llamar a ninguna imagen o css desde la página de mantenimiento:
Podéis cambiar el nombre de la página pruebas.html por la página a la que queréis redirigir todo el tráfico.
Leer másCon esto redirigirás todo el tráfico a la página pruebas.html menos las IPs que hayas indicado, puedes poner todas las líneas de IPs que necesites.
Crear un report con Oracle Reports
Ber 24 abril, 2013Para crear un report con el wizard de Oracle Reports tenemos que seguir los siguientes pasos:
Creamos un nuevo report y le indicamos que queremos que se cree automáticamente, con el Wizard, en este caso vamos a seleccionar que cree sola la página web, de la que finalmente podemos ver el código HTML
Nos pedirá el nombre del Report que va a mostrar y el diseño de las columnas que queremos mostrar en el Report, aunque después nos dejará seleccionar un estilo que modificará el aspecto visual del report.
Seleccionamos SQL Query, para generar la consulta, e introducimos la consulta que queremos utilizar en el informe.
Seleccionamos las columnas y si queremos que salga el conteo de las columnas en el informe:
Finalmente le damos a terminar y podemos ver el código HTML que nos ha generado.
Leer más
Crear un listener o escuchador en Android
Ber 1 marzo, 2013En Android podemos crear listener o escuchadores de dos maneras diferentes, por código o a través del fichero AndroidManifiest.xml
En este ejemplo vamos a crear un listener por código para que lance un evento al pulsar o hacer click un botón.
Lo hemos dividido en tres pasos:
Primero- Creamos el botón que vamos a utilizar para lanzar el evento.
Segundo- Vamos al evento onClick (Versión +1.6) del botón y escribimos el nombre de la función que queremos ejecutar cuando presionemos el botón.
En este caso llamaremos a la función lanzarExit(), que finalizará y saldrá del programa.
Tercero- Por último, declaramos el botón y le asignamos el listener o escuchador por código. Solo es necesario añadir las lineas que están comentadas, las demás las genera Eclipse cuando creas la Activity