Ayuda con este método.

Iniciado por Aikanáro Anário, 4 Octubre 2011, 04:28 AM

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

Aikanáro Anário

Estoy haciendo el juego de ahorcado y tengo el siguiente método que sirve para recorrer la palabra que hay que adivinar en busca de un caracter que selecciono el usuario de un combo box.

Código (java) [Seleccionar]

public void buscarLetra(){
for(int i=0;i<palabraElegida.length();i++){
if(palabraElegida.substring(i, i+1).equals(letraEscogida)){
System.out.println("si esta la  Letra Escogida");
}
System.out.println(getLetraEscogida());
}
}


Ahora mismo como ven xD, el método eso no es lo que hace. Por que primero estaba probando (imprimiendo por la consola) si se estaba imprimiendo el valor de la variable LetraEscogida, pero cuando sale por consola se imprimen varios nulls. No sé por qué. La variable letraEscogida es private, dentro de la misma clase, así que debería funcionar, y también cree un método get para esa misma variable, pero no funciona, sigue saliendo null.

Esto son los métodos que tengo para capturar el valor de un JCombo Box y que se muestren en un panel cuando hacen clic en un botón:

Código (java) [Seleccionar]
//obtiene la letra seleccionada del comboBox
public void itemStateChanged(ItemEvent e) {
if(e.getSource() == jcb){ //jcb es el nombre del combo box
letraEscogida = (((String) jcb.getSelectedItem()).toLowerCase());
}
}

//habilitar la funcion Salir del menu
//mostrar la letra escogida en el panel intentos
public void actionPerformed(ActionEvent e) {
if(e.getSource() == salir)
System.exit(0);
if(e.getSource() == boton){
lbl_letras.setText(letraEscogida);
}
}


En el constructor tengo estas líneas que no entiendo muy bien su significado, pero sé que hay que ponerlas xD:
Código (java) [Seleccionar]
salir.addActionListener(this);
boton.addActionListener(this);
jcb.addItemListener(this);



Para hacer el método buscarLetra() bien, debería (el método) de usar letraEscogida cuando se presione el Jboton boton y no desde que se seleccione en el JCombo Box (que es lo que haría el método como lo tengo ahora, si funcionara). Además necesito una forma de activar o llamar ese método cada vez que se presione el botón, (porque después si la letra forma parte de la palabra a adivinar, tengo que sustituir el o los guiones bajos donde debería ir la letra. Ej. si la palabra es vaca, hay 4 guiones bajos _ _ _ _ y si la letra es a, tengo que sustituir el 2do y el 4to guión bajo)
Lo que faltaba en internet: http://binar10s.blogspot.com/

s00rk

Pues no podria saber muy bien ya que pues no se ve muy bien la clase jeje, donde tienes tales propiedades y metodos jeje

-----------

Tambien podrias hacer el chuqueo por caracteres a mi pareces es mejor supongo jeje

Solamente la palabra que este toda en mayuscula y luego que lo que el usuario escriba lo convierte en mayuscula.

y ya ahora pues seria algo asi:

Código (java) [Seleccionar]

for(int x = 0; x < palabra.length(); x++)
{
   if(palabra.charAt(x) == letraEscogida.charAt(0))
   {
   }
}


Bueno eso seria una idea supongo haciendo una comparacion por caracteres que a mi parecer es mejor bueno aunque

Aikanáro Anário

#2
Gracias por tu ayuda, pero ya he resuelto una parte.

Es que tenía un disparate porque todavía no entiendo bien los eventos.
Pero lo que tenía que hacer era pasar la sentencia que le da el valor seleccionado del JCombo Box a la variable letraElegida al método actionPerformed, yo lo tenía en el método itemStatedChanged y quedaba mal.
Y para que el método que compara la letraEscogida con la palabra se ejecute cada vez que le doy al botón, solo tengo que llamar ese método dentro del método actionPerformed.

Wow, había pasado 2 días luchando con eso. Aunque todavía me falta  :xD




Otro problema es para sustituir la letra que forma parte de la palabra en su correspondiente espacio. Necesito ayuda con eso. Estoy muy perdido con eso y creo que no es para nada como yo lo tengo

Tengo este método que crea tantas rayas como letras tenga la palabra:
Código (java) [Seleccionar]

public void presentarNumRayas(){
switch(palabraElegida.length()){
case 4:
lbl_long4 = new JLabel(" _ _ _ _ "); //tiene 9  - 5
panelPalabras.add(lbl_long4);
break;
case 5:
lbl_long5 = new JLabel(" _ _ _ _ _ "); //tiene 11  - 6
panelPalabras.add(lbl_long5);
break;
case 6:
lbl_long6 = new JLabel(" _ _ _ _ _ _ "); //tiene 13  - 7
panelPalabras.add(lbl_long6);
break;
case 7:
lbl_long7 = new JLabel(" _ _ _ _ _ _ _ "); //tiene 15  - 8
panelPalabras.add(lbl_long7);
break;
case 8:
lbl_long8 = new JLabel(" _ _ _ _ _ _ _ _ "); //tiene 17  - 9
panelPalabras.add(lbl_long8);
break;
}
}


Y este para buscar la letra dentro de la palabra. Si la letra forma parte de la palabra, entonces se determina cual Label es el que se está mostrando y a ese label le setteo la letraElegida.
Pero eso es un disparate, hay muchos inconvenientes: el principal de todos es que muestra las letras en el orden que el usuario las adivina.
Código (java) [Seleccionar]

public void buscarLetra(){
for(int i=0;i<palabraElegida.length();i++){
if(palabraElegida.substring(i, i+1).equals(letraEscogida)){
auxCorrecto += letraEscogida;
switch(palabraElegida.length()){
case 5:
lbl_long5.setText(auxCorrecto+="");
break;
}
}

}
}



Necesito saber otra forma de hacerlo, tal vez sin necesidad de crear un Label para cada longitud. Que se cree solo un Label con la palabra y que sea oculta para el usuario, entonces que cuando se haga la comparación se muestre sola la letra que ha adivinado.




Necesito hacer esto:
Tengo un String, por ejemplo: ¨"Animal" y tengo que reemplazar en ese String el caracter que ocupa la posición 3 (el índice 3) que sería la "m" por una "b" por ejemplo para que quede así: "Anibal"
¿Cómo puedo hacer eso?

Sé que está el método string.indexOf() que me da el índice que en que está un caracter dentro de un String. Y sé que está el método string.replace() que replaza un caracter viejo por uno nuevo. Pero cómo decirlo.... es que no son como "compatibles" o sea no encuentro una forma de combinarlos para hacer lo que quiero.




Creo que se puede hacer así:
Código (java) [Seleccionar]

String str = "Animal";
int index = str.indexOf('m');
System.out.println("Reemplazo: " +str.replace(str.charAt(index),'b'));

[/u]

No sé que pasa, pero casi siempre que posteo algo al rato se me ocurre la solución, el foro es mágico xD
Lo que faltaba en internet: http://binar10s.blogspot.com/

s00rk

Pues aburrido me puse a hacer el mismo juego del ahorcado y aqui lo hice jeje aunque pues sin GUI jeje

Aqui te lo dejo:

Principal:
Código (java) [Seleccionar]
package Ahorcado;

import java.util.Scanner;

public class Principal
{
public static void main(String[] args)
{
Scanner Leer = new Scanner(System.in);
AHORCADO A = new AHORCADO();
String letra = "";
char Letra;
int op = -1;
do{
if(op == -1)
op = 1;
else{
A.SOP("\n[1] - Jugar de Nuevo\n[0] - Salir");
op = Leer.nextInt();
}


switch(op)
{
case 1:
A.Iniciar();
while(A.Gano == -1)
{
letra = Leer.next();
Letra = letra.charAt(0);
A.BuscarLetra(Letra);
}
break;
case 0:
break;
default:
A.SOP("Opcion Indefinida!");
}

}while(op != 0);

}

}


AHORCADO:
Código (java) [Seleccionar]
package Ahorcado;

import java.util.Random;

public class AHORCADO
{
private String palabra = "", Solucion = "";
private int pos = -1, intentos = 0, maxintentos = 6;
private String [] PALABRAS = {"GATO", "PERRO", "ELEFANTE", "CASA", "AUTOMOVIL",
"ESCUELA", "MALCOM IN THE MIDDLE"};
public int Gano = -1;

public void Iniciar()
{
Random R = new Random();
int x = -1;
do{
x = R.nextInt(PALABRAS.length);
}while(pos == x);
pos = x;
palabra = PALABRAS[pos];

for(x = 0; x < palabra.length(); x++)
{
if(palabra.charAt(x) != ' ')
Solucion += "_";
else
Solucion += " ";
}
//SOP(palabra);
Dibujar();
}

public void BuscarLetra(char pal)
{
String Sol1 = Solucion;
Solucion = "";
for(int x = 0; x < palabra.length(); x++)
{
if(palabra.charAt(x) != ' ')
{
if(pal == palabra.charAt(x))
Solucion += pal;
else
Solucion += Sol1.charAt(x);
}else
Solucion += ' ';
}

if(Sol1.compareTo(Solucion) == 0 && Solucion.indexOf(pal) == -1)
intentos++;

Dibujar();
if(Solucion.compareTo(palabra) == 0)
{
Gano = 0;
SOP("Usted ha GANADO!!!! ;D");
}else if(intentos == maxintentos){
Gano = 1;
SOP("Usted ha perdido!!! ");
}
}

private void Dibujar()
{
for(char c: Solucion.toCharArray())
System.out.print(c + " ");
SOP("");
SOP("\nIntentos restantes: " + (maxintentos - intentos));
}

public void SOP(String msj)
{
System.out.println(msj);
}

}

Aikanáro Anário

No me funciona bien :-\

Intenté con todas la vocales y no hizo nada, solo iba restando intentos y todas las palabras tienen vocales.
Lo que faltaba en internet: http://binar10s.blogspot.com/

s00rk

Si se me paso eso de convertir lo que escribas en la consola a Mayuscula jeje, pero en si ya con eso deberia funcionar.

En el main donde lee la palabra:
Código (java) [Seleccionar]

while(A.Gano == -1)
{
letra = Leer.next().toUpperCase();
Letra = letra.charAt(0);
A.BuscarLetra(Letra);
}

Aikanáro Anário

Gracias, creo que el método BuscarLetra() me va a servir.

Pensé que lo podía hacer como ya dije antes
CitarString str = "Animal";
int index = str.indexOf('m');
System.out.println("Reemplazo: " +str.replace(str.charAt(index),'b'));

Pero no me funcionó. En ese caso donde hay que sustituir un caracter de una palabra funciona bien, pero en el caso mío que todos los caracteres son iguales ( _ _ _ _ _ ) entonces lo sustituye todo.
Lo que faltaba en internet: http://binar10s.blogspot.com/

s00rk

Cita de: Aikanáro Anário en  6 Octubre 2011, 18:18 PM
Gracias, creo que el método BuscarLetra() me va a servir.

Pensé que lo podía hacer como ya dije antes
Pero no me funcionó. En ese caso donde hay que sustituir un caracter de una palabra funciona bien, pero en el caso mío que todos los caracteres son iguales ( _ _ _ _ _ ) entonces lo sustituye todo.

Exacto jeje, de hecho yo tmb estuve un poco de tiempo en eso, hasta que se me hizo hacer una segunda y de ahi empezar a checar y si se encuentra la palabra se agrega a la solucion sino se pone la misma que estaba anteriormente ya sea "_" o la letra que ya se haya encontrado jeje

En esta parte:
Código (java) [Seleccionar]

if(pal == palabra.charAt(x))
    Solucion += pal;
else
    Solucion += Sol1.charAt(x);


ahi con eso se busca la palabra si esta se pone, sino se pone lo que estaba anteriormente en la solucion ya que al principio del metodo pues poniamos Sol1 = Solucion; y luego Solucion = "" para asi volverla a llenar con la nueva palabra que se vaya a encontrar en la palabra y si no pues que se ponga lo mismo que tenia anteriormente.

Saludos*! ^_^

Aikanáro Anário

#8
Pero hay cosas que no entiendo.

Código (java) [Seleccionar]

public void BuscarLetra(char pal)
{
String Sol1 = Solucion;
Solucion = "";
for(int x = 0; x < palabra.length(); x++)
{
if(palabra.charAt(x) != ' ')
{
if(pal == palabra.charAt(x))
Solucion += pal;
else
Solucion += Sol1.charAt(x);
}else
Solucion += ' ';
}
}


En ese ciclo el "else" externo nunca se va a ejecutar.
Supongamos que la palabra es "vaca", entonces el ciclo va a ir comparando cada letra de esa palabra con '_',
vaca.charAt(0) = v
vaca.charAt(1) = a
vaca.charAt(2) = c
vaca.charAt(3) = a
Cada una de esas letras es distinta de '_', así que siempre se va ejecutar lo que está adentro del if y nunca se va a ejecutar el else, entonces por qué hay un else?




Oh, ok, ya entendí que es para las frases que tienen espacio, no me fijé en la excepción a la regla :p.
Gracias!
Lo que faltaba en internet: http://binar10s.blogspot.com/

s00rk

Si jeje exactamente al principio me daba error y pues es para eso mismo de los espacios jeje si lo quitas y pones el de Malcom In The Middle si pones una letra no pasara nada, pero al poner la siguiente y que no este dara error puesto que si no esta pondra sol1.charAt(x) y en tal x ya en la solucion anteriormente se habran quitado los espacios .

Bueno no se explicarme muy bien pero creo que ya sabes jeje ;$

Saludos*!