Batalla naval con interfaz gráfica
mikis69
Mensajes publicados
174
Estado
Miembro
-
mikis69 Mensajes publicados 174 Estado Miembro -
mikis69 Mensajes publicados 174 Estado Miembro -
Hola a todos,
Soy estudiante de informática y tengo un proyecto de fin de año que entregar para el mes de mayo.
He elegido hacer un juego de batalla naval con una interfaz gráfica. (SWING obligatorio) (si tienen otras ideas de proyectos, también pueden compartirlas conmigo)
Solo tengo una pregunta sobre el tablero de juego.
He pensado en una manera de hacer mi tablero de juego y no logro obtener el resultado que deseo, excepto utilizando un array de botones.
Me explico: el tablero de juego estará compuesto por casillas: 10 x 10 (en abscisa los números 0-9, en ordenada las letras A-J) cada casilla tendrá por tanto una coordenada del tipo A1, B0, C5, J9, ...
¿Habría otra forma 'normal' de hacer este tablero de juego (sin botones)?
Porque tengo mi cuadrícula con mis casillas, donde se puede hacer clic, pero imagínense, hacer 100 clases diferentes para 100 acciones diferentes dependiendo del botón en el que se haga clic. Porque cada botón deberá devolverme su propia coordenada de forma que pueda controlar si debajo de esta casilla hay un barco o hay agua.
Así que eso es todo, estoy bastante molesto.
¡Gracias a quienes lean y respondan mi mensaje!
Es una pena que no podamos adjuntar imágenes para mostrarles el resultado, pero les pongo el código de mi clase de tablero:
Configuración: Windows 7 / Chrome 33.0.1750.149
Soy estudiante de informática y tengo un proyecto de fin de año que entregar para el mes de mayo.
He elegido hacer un juego de batalla naval con una interfaz gráfica. (SWING obligatorio) (si tienen otras ideas de proyectos, también pueden compartirlas conmigo)
Solo tengo una pregunta sobre el tablero de juego.
He pensado en una manera de hacer mi tablero de juego y no logro obtener el resultado que deseo, excepto utilizando un array de botones.
Me explico: el tablero de juego estará compuesto por casillas: 10 x 10 (en abscisa los números 0-9, en ordenada las letras A-J) cada casilla tendrá por tanto una coordenada del tipo A1, B0, C5, J9, ...
¿Habría otra forma 'normal' de hacer este tablero de juego (sin botones)?
Porque tengo mi cuadrícula con mis casillas, donde se puede hacer clic, pero imagínense, hacer 100 clases diferentes para 100 acciones diferentes dependiendo del botón en el que se haga clic. Porque cada botón deberá devolverme su propia coordenada de forma que pueda controlar si debajo de esta casilla hay un barco o hay agua.
Así que eso es todo, estoy bastante molesto.
¡Gracias a quienes lean y respondan mi mensaje!
Es una pena que no podamos adjuntar imágenes para mostrarles el resultado, pero les pongo el código de mi clase de tablero:
package bataillemoi; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JPanel; public class Plateau { private JPanel total; private JButton mesBoutons[] = new JButton[121]; public Plateau() { JPanel grille = new JPanel(); total = new JPanel(); // Creamos el contenedor que tendrá el JLabel total.setLayout(new BorderLayout()); // Lo posicionamos! Aquí, modo por defecto grille = new JPanel(); grille.setLayout(new GridLayout(11,11)); int taille = 0, lettre = 65, numero = 0; for(int i=0;i<11;i++) { for(int j=0;j<11;j++) { mesBoutons[taille] = new JButton(""); if(i==0&&j==0) mesBoutons[taille].setBackground(Color.BLACK); if(i==0&&j!=0) { mesBoutons[taille].setText(""+numero); mesBoutons[taille].setBackground(Color.ORANGE); mesBoutons[taille].setForeground(Color.red); mesBoutons[taille].setBorder(BorderFactory.createEtchedBorder(Color.blue, Color.red)); numero++; } if(j==0&&i!=0) { mesBoutons[taille].setText(""+(char)lettre); mesBoutons[taille].setBackground(Color.ORANGE); mesBoutons[taille].setBorder(BorderFactory.createEtchedBorder(Color.blue, Color.red)); lettre++; } if(i>0&&j>0) { mesBoutons[taille].setText("."); } grille.add(mesBoutons[taille]); taille++; } } total.add(grille); } public JPanel getTotal() { return total; } public JButton[] getMesBoutons() { return mesBoutons; } } Configuración: Windows 7 / Chrome 33.0.1750.149
2 respuestas
-
"Es una pena que no podamos adjuntar imágenes para mostrarte el resultado"
Es para evitar abusos. Pero te la pongo aquí. También responderé a tu pregunta, mientras lo escribo.
public static void main(String[] args) { Plateau plateau = new Plateau(); JFrame frame = new JFrame(); frame.setContentPane(plateau.getTotal()); frame.pack(); frame.setVisible(true); }
-
Como lo hiciste, tus botones están registrados en un arreglo unidimensional, ya sería bueno ponerlos en un arreglo bidimensional para conservar las coordenadas.
Pero en tu caso eso no será suficiente, ya que debido a las interacciones que esperas, necesitarás crear una clase (¡no 100, eh!) para definir cada una de tus casillas. En esta clase, que llamaremos Case por ejemplo, deberás registrar el botón (o lo que sea) que te servirá para representar tu casilla en el lado de swing, las coordenadas de esta casilla dentro de la matriz (que pondría estático en Case en lugar de en Plateau), así como diversos campos útiles para tu casilla.
public class Case { private static final Case[][] cases = new Case[10][10]; public static Case getCase(int i, int j) { Case c = cases[i][j]; if (c == null) { c = new Case(i, j); cases[i][j] = c; } return c; } private final JButton button; private final int x; private final int y; private Case(int x, int y) { if (cases[x][y] != null) throw new IllegalStateException("Case existe ya"); this.x = x; this.y = y; button = new JButton(toString()); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Soy " + toString()); } }); cases[x][y] = this; } public JButton getButton() { return button; } @Override public String toString() { return String.format("[%c%d]", 'A'+x, y); } }
Para que funcione, solo tienes que reemplazar este fragmento de código:
if(i>0&&j>0) { mesBoutons[taille].setText("."); }
Por este:
if (i>0 && j>0) { mesBoutons[taille] = Case.getCase(i-1, j-1).getButton(); }
Aunque, como resultado, probablemente ya no sea necesario conservar el arreglomesBoutons
, hay que repensar el programa en torno a la cuadrícula de casillas.
--
La confianza no excluye el control.-
Buenas noches,
¡Gracias por tu ayuda, tu información y tu tiempo!
Entonces, he mirado lo que me explicaste y creo que he logrado expresar en código lo que me aconsejaste.
He cambiado algunas cosas, como:
- Cambio lo que dice en los botones.
Pero he logrado hacer mi cuadrícula de computadora (porque es en esta cuadrícula donde el jugador hará clic cuando quiera atacar).
Cuando hacemos clic, muestra: estás en -el lugar donde hiciste clic- (usando button.getText();). Pero creo que es un error... porque si en el botón muestro un "." para indicar que el botón no ha sido clicado aún, cuando hagamos clic en él, mostrará: estás en .
Se presenta un problema: Debido a que la clase Case tiene un arreglo de cases STATIC, ¿solo puedo crear uno? ¿No puedo crear dos tableros que usen esta clase?
(Te pregunto esto porque intenté hacer un tablero de computadora y un tablero de jugador con la misma clase de tablero y no funciona. Tuve que hacer un tablero de computadora con la clase Case y otro tablero de jugador con mi antigua clase de tablero...)
...
No sé qué más decir porque no logro visualizar el siguiente paso de mi programación... Espero tu respuesta, si logras entender lo que he escrito y te enviaré el resto de mis ideas.
¡Gracias de todos modos!
¡Buenas noches! -
Buenas noches,
Actualización: He añadido un setActionCommand a mis botones (de la clase Case que me preparaste). Ahora, independientemente del texto que aparezca en el botón, me devuelve su coordenada y eso es bastante útil ^^
Así que, mi pregunta sigue siendo la misma: ¿cómo puedo crear dos pantallas de juego (una para el jugador y otra para el computador) que sean de tipo tablero (usando tu clase Case)?
Porque debido al static final, tengo la impresión de que solo puedo crear una sola pantalla, pero necesito dos..
Gracias !
-