Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: keylatmnt24 en 01 de Septiembre 2018, 18:58

Título: Lenguaje JAVA usar Operadores booleanos para simular vida en un juego misiles
Publicado por: keylatmnt24 en 01 de Septiembre 2018, 18:58
Buenos días, tengo una consulta sobre como realizar un codigo booleano en base al siguiente:

Código: [Seleccionar]
package fuerzas.rebeldes;

public class XWing {

private String nombre;

private int misiles = 6;
private int disparos = 0;

public XWing() {

}

public XWing(String nombre) {
this.nombre = nombre;
}

/**
* @return boolean
*/
public boolean disparar_misil() {
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;
return true;
} else {
System.out.println(this.nombre + "**** WARNING : NO HAY MISILES ****");
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;
}

}
Me estan pidiendo modificar  la   clase   XWing.java   para   agregar   un   atributo   boolean   que   indique   si   el   X -Wing   está  aun   en   misión   o   ha   sido destruido   por   las   fuerzas   imperiales.  Has   un   programa   main   que   pueda   trabajar   con   este   atributo   antes   de   efectuar   cualquier  acción   de   disparo. 

Me dieron una sugerencia : Utilizar Random
Código: [Seleccionar]
Random randomGenerator = new Random();
int destruir = randomGenerator.nextInt(12);
Título: Re:Lenguaje JAVA - Operadores booleanos
Publicado por: Kabuto en 02 de Septiembre 2018, 02:16
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".
Citar
   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.
Citar
   /**
    * 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:
Citar
   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:
Código: [Seleccionar]
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.

Código: [Seleccionar]
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();

}

}