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":
}
}
}
(http://[img][img][img][img][img][img][img][img])[/img][/img][/img][/img][/img][/img][/img][/img]
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
private static Set<String> correctas = new HashSet<>(); //
usa operador diamante <> de generics
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í,
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 SR.nextInt()
para generar un numero aleatorio contenido en el largo del array fácil , y menos 1 para evitar
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
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
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"
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 ?
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í ?
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"};
}
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":
}
}
}