juego de adivinar palabras en consola con 3 dificultades

Iniciado por sheiking, 1 Octubre 2018, 04:33 AM

0 Miembros y 1 Visitante están viendo este tema.

sheiking

hola que tal estoy haciendo un programa que me adivine palabras y que tenga 3 dificultades pero no logro hacer que me lea las letras que escribo porque directamente me manda a la excepcion que puse en el codigo

esto es lo que llevo actualmente

package adivinapalabras;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


public class AdivinarPalabras {
public static BufferedReader entrada = new BufferedReader (new InputStreamReader(System.in));
private static Set correctas;

String Facil[]= {"reir","hola","jugo","papa","pala","pasa","para","alma","nada","casa","mama","tele","mira","tela","bala","cera","tira"};
String Normal[]={"apretado", "avestruz","ceramica","estimulo","amarillo","eleccion","estrecho","invierno","chatarra","estrella"};
String Dificil[]={"indiscutible","participante","personalismo","perturbacion","contundencia","supervisamos","buscapleitos","vinculandose"};

public String generaPalabra(int Facil)
{
int n;
n= (int)(Math.random()*4);
if(Facil==0)
return Normal[n];

else
return Dificil[n];

}

public boolean checarLetra (char letra,String palabra )
{
boolean mensaje=false;
for(int i=0;i<palabra.length();i++)
{
if(letra==palabra.charAt(i))
{
mensaje = true;
break;
}
}
return mensaje;
}




public Set letrasPalabra(String palabra)
{
Set letras = new HashSet();
for (int i=0;i<palabra.length() ;i++)
{
if(palabra.charAt(i) != ' ')
{
letras.add(palabra.charAt(i));
}
}
return letras;
}

public String actualizaVisible(Set correctas, String palabra, String visible)
{
visible =""; boolean bandera = false;
Iterator it = correctas.iterator();
for(int i=0; i<palabra.length() ;i++)
{
while(it.hasNext())
{
char a = it.next().toString().charAt(0);
System.out.println(" "+a+" "+palabra.trim().charAt(i) );
if ( a == palabra.trim().charAt(i) )
{
visible += a; bandera = true;
break;
}
}
if (bandera == false)
{
visible += "_";
}
bandera=false; it = correctas.iterator();
}
return visible;
}





public static void main(String[] args) throws Exception {

System.out.println("Establezca el nivel de dificultad: ");
System.out.println("Facil(f)");
System.out.println("Normal(n)");
System.out.println("Dificil(d)");
String dificultad = entrada.readLine();


switch(dificultad)
{
case "f":
AdivinarPalabras Operacion = new AdivinarPalabras ();

Operacion.generaPalabra(1);

System.out.println("Palabra generada: ****");
System.out.println("teclea una letra de la palabra");
String letra = entrada.readLine();
char l=letra.charAt(0);
try
{
Operacion.checarLetra(l, letra);
Operacion.letrasPalabra(letra);
Operacion.actualizaVisible( correctas,letra,letra);
}
catch(Exception ex)
{
System.out.println("No introdujo una letra valida "+ex.getMessage());
}
case "n":
}
}
}
[/img][/img][/img][/img][/img][/img][/img][/img]

rub'n

#1
Hola,

no veo el log por lo visto es NPE nullPointerException

claro private static Set<String> correctas; a punta a null instancia la variable de clase, "clase" porque la tienes con static


Código (java) [Seleccionar]
private static Set<String> correctas = new HashSet<>(); // usa operador diamante <> de generics




Código (java) [Seleccionar]
public String generaPalabra(int Facil)
{
int n;
n= (int)(Math.random()*4);
if(Facil==0)
return Normal[n];

else
return Dificil[n];

}


siempre dará falso porque se compara 1==0 que es falso retornando un valor random del array Difícil creo que mejor es así,

Código (java) [Seleccionar]
public String generaPalabra(final int facil) {
       if (facil == 1) {
           return Types.FACIL[SR.nextInt(Types.FACIL.length - 1)];
       } else if (facil == 2) {
           return Types.NORMAL[SR.nextInt(Types.NORMAL.length - 1)];
       }
       return Types.DIFICIL[SR.nextInt(Types.DIFICIL.length - 1)];
}





donde
Código (java) [Seleccionar]
SR.nextInt() para generar un numero aleatorio contenido en el largo del array fácil , y menos 1 para evitar

Código (java) [Seleccionar]
java.lang.ArrayIndexOutOfBoundsException

facil tiene 17 elementos, si cae 18 daría error xq el array no es de ese tamaño pero con -1 nunca caera 18 XD

Código (java) [Seleccionar]
java.lang.ArrayIndexOutOfBoundsException: 18

método checarLetra creo que debería comparar aquí pero con la palabra que se genera de manera aleatoria con el método generaPalabra que la retorna

Código (java) [Seleccionar]
palabraGenerada = Operacion.generaPalabra(1);  // ver linea 90

si la palabra aleatoria es tela si se introduce X debería retornar false, porque x no esta en la palabra "tela"

Código (java) [Seleccionar]
public boolean checarLetra(char letra, String palabra) {
       boolean mensaje = false;
       for (int i = 0; i < palabra.length(); i++) {
           if (letra == palabra.charAt(i)) {
               mensaje = true;
               break;
           }
       }
       return mensaje;
}


xq si lo dejas como lo tienes siempre dará true ya que compará siempre el carácter introducido con la palabra que tecleas




Aquí como parámetro dices palabra e introduces una letra ? XD o quizás dices, que cada letra correcta sea añadida al Set ?

Código (java) [Seleccionar]
public Set letrasPalabra(String palabra)
{
Set letras = new HashSet();
for (int i=0;i<palabra.length() ;i++)
{
if(palabra.charAt(i) != ' ')
{
letras.add(palabra.charAt(i));
}
}
return letras;
}


Que deseas que haga actualizaVisible me imagino que si la letra introducida esta contenida en la palabra generada, que se reemplace el asterisco por la letra algo así  ?





Código (java) [Seleccionar]

package adivinapalabras;

public final class Types {

   public static final String FACIL[] = {"reir", "hola", "jugo", "papa", "pala", "pasa",
           "para", "alma", "nada", "casa", "mama", "tele",
           "mira", "tela", "bala", "cera", "tira"};

   public static final String NORMAL[] = {"apretado", "avestruz", "ceramica",
           "estimulo", "amarillo", "eleccion", "estrecho",
           "invierno", "chatarra", "estrella"};

   public  static final String DIFICIL[] = {"indiscutible", "participante", "personalismo",
           "perturbacion", "contundencia", "supervisamos", "buscapleitos",
           "vinculandose"};
}




Código (java) [Seleccionar]

package adivinapalabras;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;

public class AdivinarPalabras {

   public static BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
   private static Set<String> correctas = new HashSet<>();
   private static final SecureRandom SR = new SecureRandom();

   private static String palabraGenerada = "";


   public String generaPalabra(final int facil) {
       //int n = (int) (Math.random() * 4); no hace falta
       if (facil == 1) {
           return Types.FACIL[SR.nextInt(Types.FACIL.length - 1)];
       } else if (facil == 2) {
           return Types.NORMAL[SR.nextInt(Types.NORMAL.length - 1)];
       }
       return Types.DIFICIL[SR.nextInt(Types.DIFICIL.length - 1)];
   }

   public boolean checarLetra(char letra, String palabra) {
       boolean mensaje = false;
       for (int i = 0; i < palabra.length(); i++) {
           if (letra == palabra.charAt(i)) {
               mensaje = true;
               break;
           }
       }
       return mensaje;
   }


   public Set<String> letrasPalabra(String palabra) {
       //Set letras = new HashSet(); no hace falta
       for (int i = 0; i < palabra.length(); i++) {
           if (palabra.charAt(i) != ' ') {
               correctas.add(String.valueOf(palabra.charAt(i)));
           }
       }
       return correctas;
   }

   public String actualizaVisible(Set<String> correctas, String palabra, String visible) {
       visible = "";
       boolean bandera = false;
       Iterator it = correctas.iterator();
       for (int i = 0; i < palabra.length(); i++) {
           while (it.hasNext()) {
               char a = it.next().toString().charAt(0);
               System.out.println("palabra " + a + " " + palabra.trim().charAt(i));
               if (a == palabra.trim().charAt(i)) {
                   visible += a;
                   bandera = true;
                   break;
               }
           }
           if (bandera == false) {
               visible += "_";
           }
           bandera = false;
           it = correctas.iterator();
       }
       return visible;
   }


   public static void main(String[] args) throws Exception {

       System.out.println("Establezca el nivel de dificultad: ");
       System.out.println("Facil(f)");
       System.out.println("Normal(n)");
       System.out.println("Dificil(d)");
       String dificultad = entrada.readLine();


       switch (dificultad) {
           case "f":
               AdivinarPalabras Operacion = new AdivinarPalabras();
               try {

                   palabraGenerada = Operacion.generaPalabra(1);
                   System.out.println("Palabra generada: ****" + palabraGenerada);
                   System.out.println("teclea una letra de la palabra");
                   String letra = entrada.readLine();
                   char l = letra.charAt(0);

                   Operacion.checarLetra(l, palabraGenerada);
                    Operacion.letrasPalabra(palabraGenerada);
                   Operacion.actualizaVisible(correctas, letra, letra);

               } catch (Exception ex) {
                   ex.printStackTrace(); // usado para ver la pila de error generada
                   System.out.println("No introdujo una letra valida " + ex.getMessage());
               }
           case "n":
       }
   }

}



rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen