Autor Tema: Ejercicio! entrega CU00669B juego adivinar java  (Leído 6636 veces)

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Ejercicio! entrega CU00669B juego adivinar java
« en: 02 de Agosto 2014, 21:42 »
A continuación el código del ejercicio:
public class AdivinarMesSecreto
Código: [Seleccionar]
import java.util.*;
public class AdivinarMesSecreto
{
    public AdivinarMesSecreto()
    {

    }
   
    public static void main(String []args)
    {
      String [] listaDeMeses = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
      String mesSecreto = listaDeMeses[(int)(Math.random() * 12)];
      System.out.println("\f\nAdivina el mes secreto, por favor escribe el nombre de un mes...");
      Scanner escaner = new Scanner(System.in);
      String entrada;
      entrada = "";
      String pista = "No disponible.";
      String detalles = "No disponible.";
      boolean resuelto = false;     
      do
      {
        entrada = escaner.nextLine();
        if(entrada.equalsIgnoreCase(mesSecreto))
        {
          resuelto = true;
        }else
        {
          resuelto = false;
        }
       
        if(resuelto == false)
        {
          System.out.println("\f\nTe has equivocado! el mes secreto no es " + entrada + ", Desas optener una pista (s/n)?");
          entrada = escaner.nextLine();
          switch(mesSecreto)
          {
            case "enero": pista = "Pista: Primero lo primero."; detalles = "enero es el primer mes."; break;
            case "febrero": pista = "Pista: Que opinas de cupido?"; detalles = "febrero es el mes de cupido."; break;
            case "marzo": pista = "Pista: Me párese haber visto un marziano."; detalles = "en realidad se escribe marciano, pero marziano hace pensar mas en el mes marzo."; break;
            case "abril": pista = "Pista: tortugas ninjas, reportera, te suena?"; detalles = "la reportera del comic, ninjas tortugas adolescentes mutantes se llama abril."; break;
            case "mayo": pista = "Pista: Ella me dijo: si veo una rata me desmayo, Lolz."; detalles = "muy clara, mes de mayo."; break;
            case "junio": pista = "Pista: mitad."; detalles = "la mitad de 12 es 6, junio es el mes 6."; break;
            case "julio": pista = "Pista: Cantante de apellido iglesias."; detalles = "Cantante julio iglesias."; break;
            case "agosto": pista = "Pista: Se agoto mi paciencia."; detalles = "solo faltaria incluir una (s) para que agoto de agotar, sea el mes de ago(s)to."; break;
            case "septiembre": pista = "Pista: El mas largo de todos."; detalles = "septimembre es el mes con mas letras.";break;
            case "octubre": pista = "Pista: 5 + 5."; detalles = "5 + 5 = 10, mes 10 = octubre"; break;
            case "noviembre": pista = "Pista: Sus dos primeras letras forman el sinónimo de la palabra (si)"; detalles = "sinónimo de si = no, noviembre."; break;
            case "diciembre": pista = "Pista: navidad?"; detalles = "diciembre = navidad.";break;
            default: pista = pista; detalles = detalles; break;
          }
          if(entrada.equalsIgnoreCase("s"))
          {
            System.out.println("\f\n" + pista);
          }
          else if(entrada.equalsIgnoreCase("n"))
          {
            System.out.println("\f\nAsi que prefieres adivinar sin pistas, pues inténtalo nuevamente.");
          }
        }
      }while(resuelto == false);
      System.out.println("\f\nHas acertado!! El mes secreto entre los " + listaDeMeses.length + " meses es: " + mesSecreto + ".\n");
      System.out.println(pista + "\n" + "Detalles sobre la pista: " + detalles + "\n" + "\nHasta luego.");
    }
}

 Tengo la siguiente duda: si al referirnos a un "Array estático" hacemos referencia a una colección, arreglo, o lista de tamaño predefinido, cuya diferencia en comparación con un ArrayList es que el ArrayList es dinámico, redimensionable, flexible, ext. Y el Array estático tiene una dimension delimitada por un int, por ejemplo:
Código: [Seleccionar]
public class Ejemplo{
    public String [] listaDeMeses;
    public Ejemplo()
    {
     String [] listaDeMeses = new String[12];
    }
}
donde int 12 limita al Array al que apunta la variable apuntadora listaDeMeses a contener 12 o menos de 12 objetos tipo String y no mas de 12. Aquí viene mi duda: al declarar una sintaxis como:
Código: [Seleccionar]
String [] listaDeMeses = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"}; estoy creando un Array estático o un Array dinámico?
si es dinamico por no estar limitado a 12 objetos, seria un ArrayList como el siguiente:
Código: [Seleccionar]
import java.util.*;
public class Ejemplo{
    public ArrayList<String>lista;
    public Ejemplo()
    {
     lista = new ArrayList<String>();
     lista.add("enero");
     lista.add("enero");
     lista.add("...diciembre");
    }
 }
aceptable en este ejercicio?
Espero no ser muy curioso
Saludos!
« Última modificación: 31 de Agosto 2014, 11:05 por Alex Rodríguez »
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:Ejercicio! entrega CU00669B
« Respuesta #1 en: 02 de Agosto 2014, 22:59 »
Hola, te contesto yo ( con este pie roto me paso el día aquí XDD).

Bueno, cuando tu creas un array mediante esta declaración:

Código: [Seleccionar]
String [] listaDeMeses = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};


Siempre estas creando un array estatico porque si te fijas.... ¿ Que hay a la izquierda? "String [] listaDeMeses" es un array estático, esa sentencia que esta arriba es lo mismo que decir:

Código: [Seleccionar]
String [] listaDeMeses=new String[12];
listaDeMeses[0]="enero";
...
listaDeMeses[11]="diciembre";

Por lo tanto es un array estático como tu bien dices. Siempre tendrá un tamaño de 12 elementos de tipo String.

Para poder modificar su tamaño tienes dos opciones, la primera es volver a inicializar el array con el nuevo tamaño y volver a rellenarlo, cosa que es bastante engorrosa,
o lo transformas a un ArrayList y ya tienes un array dinámico, añades los elementos que quieras añadir y lo volverías a transformar a un array estático, si es que te interesa un array estático, o ya te quedas con el dinámico, eso ya depende de lo que necesitaras.   

Te expongo un ejemplo de como realizar la conversión hacia un lado y hacia otro:

Convertir de array estático a ArrayList dinámico:

Código: [Seleccionar]
public class Prueba {

    public static void main(String[] arg){
        String [] listaDeMesesEstatica={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        ArrayList<String> listaDeMesesDinamica=new ArrayList<>(Arrays.asList(listaDeMesesEstatica));
        listaDeMesesDinamica.add("mes13");
        for(String s:listaDeMesesDinamica){
            System.out.println(s);
        }
       
    }
}

Como convertir de ArrayList dinámico a array estático:

Código: [Seleccionar]
public class Prueba {

    public static void main(String[] arg){
        String [] listaDeMesesEstatica={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
        ArrayList<String> listaDeMesesDinamica=new ArrayList<>(Arrays.asList(listaDeMesesEstatica));
        listaDeMesesDinamica.add("mes13");
        String[] listaDeMesesEstatica2=new String[listaDeMesesDinamica.size()];
        listaDeMesesDinamica.toArray(listaDeMesesEstatica2);
        for(String s:listaDeMesesEstatica2){
            System.out.println(s);
        }
       
       
    }
}

Como ves, pasar de una dinámica a estática es un poco mas engorroso, ya que tendremos que inicializar el array que va a ser estático al tamaño del array dinámico que queremos convertir y una vez lo tenemos, invocamos el método toArray(T[] array) del objeto ArrayList que estamos convirtiendo.

También te comento que hay mas formas de inicializar arrays dinámicos, como por ejemplo:

Código: [Seleccionar]
public class Prueba {

    public static void main(String[] arg){
        ArrayList<String> lista = new ArrayList<String>() {{
            add("elemento1");
            add("elemento2");
            add("elemento3");
        }};
        lista.add("elemento4");
        for(String s:lista){
            System.out.println(s);
        }
       
    }
}


Es cosa de investigar, de todas formas te comento que para una lista de meses no tiene sentido porque a no ser que un meteorito nos impacte y nos cambie de orbita dudo que aparezcan nuevos meses. XDD

De todas formas conforme vayas trabajando con las distintas estructuras veras las capacidades y limitaciones de cada una.

Me ha gustado el uso que haces del bucle do{ } while( ) <---> no es muy común usarlo.

Y nada, siento extenderme tanto pero es que esto es un mundo muy extenso y hay muchas formas de hacer las cosas. Espero al menos haberte abierto un poco mas el campo de arrays estáticos y dinámicos.

Un Saludo!

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio! entrega CU00669B
« Respuesta #2 en: 02 de Agosto 2014, 23:02 »
Hola, el código está todo bien aunque creo haber visto un marziano que no dice que haya que volver a introducir el mes.

Te voy a aclarar que array estático en el sentido en el que se usa en el curso es <<una colección de tamaño fijo a la que denominamos array estático, arreglo estático, formación o vector>>

String [] listaDeMeses = new String[12]; sería lo que se llama un array estático en el sentido de que tiene un número de elementos fijo. Es el array "más tradicional", digamos que de la programación de toda la vida.

ArrayList<String>lista = new ArrayList<String> (); sería lo que en el contexto del curso se llama una colección que puede considerarse un array dinámico: colección donde el número de elementos puede crecer y decrecer dinámicamente, no es fijo.  el ArrayList es dinámico, redimensionable, flexible, etc. al igual que otras clases de colecciones del api de java.

Al declarar String [] listaDeMeses = {"enero","febrero","marzo"... estás declarando un array estático, el número de elementos es fijo. Desde que uses [] piensa en que estarás usando arrays (o matrices) estáticas.

En muchas ocasiones se pueden usar tanto arrays estáticos como dinámicos y no tiene demasiada importancia usar uno u otro. Sin embargo, de modo general, podríamos decir que a no ser que usar un array dinámico conlleve alguna ventaja, será mejor usar uno estático. ¿Por qué? Porque la operación con arrays estáticas será más rápida y requerirá menos espacio de memoria, etc. , es decir, a igualdad de condiciones te recomendaría que uses el estático. Pero ten en cuenta que muchas veces dará igual uno que otro, y en otras ocasiones será recomendable usar uno dinámico.

En este ejercicio lo que se pretende es que se usen arrays estáticos (el propio enunciado indica mesSecreto = mes[9] ... ) pero también se puede resolver con arrays dinámicos pej. con ArrayList.

Saludos


Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio! entrega CU00669B
« Respuesta #3 en: 02 de Agosto 2014, 23:07 »
Creo que al mismo tiempo que escribía por otro lado te ha respondido dongo, creo que en su respuesta tienes más información ya que como ves te explica la posibilidad de conversión. Y además dice una cosa muy cierta: para una lista de 12 meses es más lógico usar un array de tamaño fijo porque los de tamaño variables están pensados para cuando la colección puede aumentar y a no ser que como dice dongo un meteorito nos impacte los 12 meses van a ser fijos.

Saludos

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio! entrega CU00669B
« Respuesta #4 en: 03 de Agosto 2014, 00:48 »
 Mi duda había surgido debido a un concepto erróneo que tenia el cual fue aclarado con sus comentarios, gracias dongo, gracias Alex.

Concepto erróneo: Si al compilar el codigo:
Código: [Seleccionar]
String [] lista = {"enero", "...", "diciembre", "wisky"}; el compilador no me da un error de tipo: java.lang.ArrayIndexOutOfBoundsException:  Entonces tengo un Array dinámico, porque me permite agregar tantos meses como me imagine, y como estoy programando borracho y la borrachera me dio con creer que un meteorito impacto la tierra y que tenemos un nuevo mes 13 con nombre whisky XD entonces lo he agregado. A diferencia de usar un código como:
Código: [Seleccionar]
String [] lista; lista = new String[12]; lista[0] = "enero"; lista[...] = "..."; lista[12] = "whisky"; Donde también estoy borracho pero java me cubre la espalda y me dice:  java.lang.ArrayIndexOutOfBoundsException. traducción de lo que me dice java: Estas borracho? estas agregando 13 meses donde ayer cuando no estabas borracho indicaste que solo son 12 meses.

Convicción: Lo que hace un Array estático o no estático es la forma en que se declare, ejemplo: int [] lista = {1,2,3,...}; o int [] lista; lista = new int [3];
lista[0] = 1;
lista[1] = 2;
lista[2] = 3;
y que no importa que en una declaración como: int [] mesesEnNumeros = {1,2,3,...,13};
java acepte que se agregue un objeto 13, la lógica: un año = 12 meses, es quien debe limitar el Array a 12 objetos, (por lo que se recomienda no programar borracho XD).
una vez mas muchas gracias.
Nota: realice algunos ajustes al código, me gustaría que opinen a cerca de la utilidad que le doy al condicional switch.
Saludos.
Pos data: Si no mal entendí, me parece que estas accidentado dongo, si es así espero te recuperes!
« Última modificación: 03 de Agosto 2014, 00:50 por Sniper »
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:Ejercicio! entrega CU00669B
« Respuesta #5 en: 03 de Agosto 2014, 01:46 »
jaja Respondimos Alex y yo a la vez, jaja bueno lo de programar borracho, la verdad que no es muy recomendable.

Y sobre los arrays, bueno, quédate con lo que te comenta Alex:
Desde que uses [] piensa en que estarás usando arrays (o matrices) estáticas.

Sobre lo de usar uno u otro, bueno, quédate con lo siguiente:

  • Si tienes alguna forma de averiguar el numero de elementos que va a tener el array y ese número de elementos no va a cambiar, create un array estático
  • Si no puedes saber el numero de elementos que va a tener el array o el numero de elementos va a ir variando durante la ejecución, create uno dinámico

Y nada, ten cuidado con la botella, sobre todo que no te de por conducir...XDD Un saludo!

Edición: Me acabo de fijar que metiste el switch y el random, la verdad que esta bastante bien, jaja joe lo he ejecutado y me ha tocado abril, no veas que rebuscado lo de las tortugas ninja colega... jajaja

Si bueno, accidentado un mal patineo, nunca mejor dicho metí el patín en un agujero. jajaja
« Última modificación: 03 de Agosto 2014, 01:56 por dongo »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio! entrega CU00669B
« Respuesta #6 en: 03 de Agosto 2014, 11:16 »
Curioso coincidir respondiendo al mismo tiempo  ::)


 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".