Hola.
Lo primero indicar que esta sección es para presentarse y/o hacer sugerencias para el foro, no para plantear dudas. Luego un moderador lo moverá a la sección correspondiente.
Sobre lo que planteas.
Supongo que lo que piden es hacer que, de manera aleatoria, se decida si el X-Wing ha sido destruido o no.
De modo que si ha sido destruido, ya no podrá disparar misiles cuando se lo ordenemos.
Así que habría que añadirle a la clase un atributo booleano. Podemos llamarlo
destruido y se iniciaría con valor "falso".
private String nombre;
private int misiles = 6;
private int disparos = 0;
private boolean destruido = false;
Luego habría que añadir un método donde usando el random que proponían, decidiremos si la nave sufre una destruccion o no.
Este método sería privado, porque es una función interna de esta clase. En principio, no queremos que otras clases puedan llamar a este método.
El código que te proponian genera numeros aleatorios entre 0 y 11.
Ahora podemos decidir a nuestro antojo cómo decidir cuando será destruida la nave.
Yo por ejemplo he decidido que si se genera un 0, un 5 o un 11... la nave será destruida.
Pero podríamos decidir otra forma, por ejemplo destruir solo si el número generado es un numero par, o cualquier cosa que se nos ocurra.
/**
* Método interno que decide si el XWing sufre una destrucción o no.
* En caso de ser destruido, ya no podrá seguir disparando.
*/
private void decidirDestruccion() {
Random randomGenerator = new Random();
int destruir = randomGenerator.nextInt(12);
//Decidimos que el X-Wing será destruido si obtenemos: 0, 5 ó 11
if (destruir == 0 || destruir == 5 || destruir == 11)
destruido = true;
}
Bien, ahora ya tenemos COMO decidir si la nave se destruye o no.
Ahora hay que establecer el CUANDO vamos a tomar esta decisión.
Puesto que no se indica nada en el enunciado, a mi se me ocurre que podemos hacerlo cada vez que el X-Wing recibe orden de disparar, es decir, cuando se invoque el método
disparar_misil().
Este método lo vamos a modificar, lo primero que hará es consultar el atributo
destruido, de modo que si tiene valor "verdadero", es decir, la nave está destruida, entonces no disparará e informará con un mensaje.
Si no, es decir, la nave aún está "viva", entonces sí disparará (si es que le quedan misiles). Y tras el disparo (o intento de disparo), será CUANDO decidiremos si va a sufrir una destrucción llamando a nuestro método privado.
Marco en rojo los cambios:
public boolean disparar_misil() {
if (destruido)
{
System.out.println("El X-Wing " + nombre + " ha sido destruido y no puede disparar");
return false;
}
else
{
if (misiles > 0) {
System.out.println(this.nombre + "...: L A N Z A N D O M I S I L # :" + misiles);
misiles = misiles - 1;
//Tras cada accion de ataque, echamos a suertes si el X-Wing sufre una destrucción.
decidirDestruccion();
return true;
} else {
System.out.println(this.nombre + "**** WARNING : NO HAY MISILES ****");
decidirDestruccion();
return false;
}
}
}
Así que finalmente, esta podría ser la clase
XWing finalizada:
import java.util.Random;
public class XWing {
private String nombre;
private int misiles = 6;
private int disparos = 0;
private boolean destruido = false;
public XWing() {
}
public XWing(String nombre) {
this.nombre = nombre;
}
/**
* Método interno que decide si el XWing sufre una destrucción o no.
* En caso de ser destruido, ya no podrá seguir disparando.
*/
private void decidirDestruccion() {
Random randomGenerator = new Random();
int destruir = randomGenerator.nextInt(12);
//Decidimos que el X-Wing será destruido si obtenemos: 0, 5 ó 11
if (destruir == 0 || destruir == 5 || destruir == 11)
destruido = true;
}
/**
* @return boolean
*/
public boolean disparar_misil() {
if (destruido)
{
System.out.println("El X-Wing " + nombre + " ha sido destruido y no puede disparar");
return false;
}
else
{
if (misiles > 0) {
System.out.println(this.nombre + "...: L A N Z A N D O M I S I L # :" + misiles);
misiles = misiles - 1;
//Tras cada accion de ataque, echamos a suertes si el X-Wing sufre una destrucción.
decidirDestruccion();
return true;
} else {
System.out.println(this.nombre + "**** WARNING : NO HAY MISILES ****");
decidirDestruccion();
return false;
}
}
}
/**
* @param rafaga
*/
public void disparar_canon(boolean rafaga) {
if (rafaga) {
for (int i = 0; i < 20; i++) {
System.out.println(this.nombre + " RAFAGA laser shot !!!");
disparos = disparos + 1;
}
} else {
System.out.println(this.nombre + " laser shot !!!");
disparos = disparos + 1;
}
System.out.println(this.nombre + " *** INFO para el piloto : van " + disparos + " disparos ***");
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Ahora nos piden un main donde poner en práctica esta función.
Yo propongo aquí una clase supersencilla. Básicamente creamos un objeto XWing y ponemos un menú con dos opciones: disparar y terminar programa.
Tras cada accion de disparo, se decidirá si el Xwing es destruido tal y como hemos programado en su clase.
Así que en algún momento indeterminado, pediremos disparar pero ya no será posible porque la nave habrá sido destruida.
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
XWing xW = new XWing("Falcon");
Scanner teclado = new Scanner(System.in);
int opcion = 0;
do {
System.out.println("\n\n1 - Disparar");
System.out.println("9 - Terminar programa");
System.out.println("Elija opcion: ");
opcion = teclado.nextInt();
switch (opcion) {
case 1:
xW.disparar_misil();
break;
case 9:
System.out.println("\n\nFIN DE PROGRAMA");
break;
default:
System.out.println("Opcion invalida");
}
}while(opcion != 9);
teclado.close();
}
}