Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > insertar elementos en una matriz en posiciones aleatorias

Hola buenas, estoy desarrollando el juego de "hundir la flota" o "batalla naval" en java swing y quiero hacer que aparezcan los barcos aleatoriamente en el tablero, en este caso es un panel gridLayout de 8 filas y 8 columnas que contiene botones, el tema es que intento asignar un índice aleatorio pero al hacerlo se seleccionan varios índices, mi código para ello es el siguiente:

for(int ri=new Random().nextInt(8);ri<b1.length;ri++){
for(int rj=new Random().nextInt(8);rj<b1.length;rj++){
b1[ri][rj].setIcon(barco);
}

Donde b1 es la matriz y barco es una imagen que le añado al botón para que se vea que es un barco

Al ejecutarlo el resultado no es el esperado, ya que me selecciona muchos botones como barcos y solo quiero añadir un botón como barco.

Para ello he probado lo siguiente:

for(int ri=new Random().nextInt(8);ri<b1.length;ri++){
for(int rj=new Random().nextInt(8);rj<b1.length;rj++){
b1[new Random().nextInt(1)][new Random().nextInt(1)].setIcon(barco);
}
}

Y de esta manera si me coloca un solo barco, pero siempre me lo coloca en la posición b1[0][0].

Espero que podáis ayudarme un poco.

Muchas gracias y un saludo! :D

diciembre 29, 2014 | Unregistered Commenterdavid

Buenos días David,
En mi opinion te estas volviendo un poco loco para generar las posiciones aleatoriamente:
No hagas el random en el for, como consejo.yo haría algo asi:
1º: Definir una clase Coordenada con dos atributos int x, int y.
2º: Definir una variable de clase ArrayList<Coordenada> coordenadasOcupadas = new ...;
3º: Definir un metodo public void situarBarco()(Algo parecido a lo que pongo mas abjo)
4º: Mediante un for llamar a situarBarco tantas veces como barcos quieras
** Este ejempolo es para barcos de una sola casilla verdad? si no habría que crear alguna cosilla mas...

public void situarBarco(){
Coordenada c;
do{
boolean yaOcupada=false;
c= new Coordenada(new Random().nextInt(8),new Random().nextInt(8));
for(Coordenada coord: coordenadasOcupadas.size()){
if(coord==c){
yaOcupada=true;
break;
}
}
}while(yaOcupada);

coordenadasOcupadas.add(c);
b1[c.getX()][c.getY()].setIcon(barco);

}

Espero que te sirva de ayuda:

saludos

Oldskultxo

diciembre 30, 2014 | Registered Commenteroldskultxo

muchas gracias! en el mensaje hablaba de barcos de una sola casilla pero tengo que hacer barcos de 1, 2 y 3 casillas, voy a probar a ver que tal, muchas gracias de nuevo!! ;)

diciembre 30, 2014 | Unregistered Commenterdavid

ya lo probé y funciona, el único problema es que en algunos casos me añade un barco menos de los que le digo que añada, pero igual es un fallo mio, si puedes guiarme un poco para saber que hay que hacer para añadir barcos de mas una casilla estaría muy bien :)
de todas formas muchas gracias!!

diciembre 30, 2014 | Unregistered Commenterdavid

Pos yo lo que haría seria crear una clase barco, con un atributo tamaño y un atributo coordenadaInicial.
Si el tamaño es distinto de uno:
aleatoriamente decidir si crece horizontalmente o verticalmente; esto se traduce, en añadir al array de coordenadasOcupadas, la coordenada inicial, y por ejemplo:
si crece horizontalmente, otra coordenada igual que la anterior pero con +1 en la X.

Lo unico ten cuidado, con los barcos que se quieran escapar de la matriz, esto es, vigila que si un barco ocupa 3 casillas en horizontal, la inicial no este en la columna 7 por ejemplo.

Saludos, suerte con el ejercicio y ánimo, que ese no es tan complicado!!
Cuando seas capaz de sacarlo montate un tetris!! o un buscaminas!! que con esos ejercicios si que aprendes bien a manejar matrices!

Oldskultxo

diciembre 30, 2014 | Registered Commenteroldskultxo