Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Aikanáro Anário en 4 Octubre 2011, 04:28 am



Título: Ayuda con este método.
Publicado por: Aikanáro Anário en 4 Octubre 2011, 04:28 am
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
  1. public void buscarLetra(){
  2. for(int i=0;i<palabraElegida.length();i++){
  3. if(palabraElegida.substring(i, i+1).equals(letraEscogida)){
  4. System.out.println("si esta la  Letra Escogida");
  5. }
  6. System.out.println(getLetraEscogida());
  7. }
  8. }


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
  1. //obtiene la letra seleccionada del comboBox
  2. public void itemStateChanged(ItemEvent e) {
  3. if(e.getSource() == jcb){ //jcb es el nombre del combo box
  4. letraEscogida = (((String) jcb.getSelectedItem()).toLowerCase());
  5. }
  6. }
  7.  
  8. //habilitar la funcion Salir del menu
  9. //mostrar la letra escogida en el panel intentos
  10. public void actionPerformed(ActionEvent e) {
  11. if(e.getSource() == salir)
  12. System.exit(0);
  13. if(e.getSource() == boton){
  14. lbl_letras.setText(letraEscogida);
  15. }
  16. }

En el constructor tengo estas líneas que no entiendo muy bien su significado, pero sé que hay que ponerlas xD:
Código
  1. salir.addActionListener(this);
  2. boton.addActionListener(this);
  3. 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)


Título: Re: Ayuda con este método.
Publicado por: s00rk en 4 Octubre 2011, 05:58 am
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
  1. for(int x = 0; x < palabra.length(); x++)
  2. {
  3.   if(palabra.charAt(x) == letraEscogida.charAt(0))
  4.   {
  5.   }
  6. }
  7.  

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


Título: Re: Ayuda con este método.
Publicado por: Aikanáro Anário en 4 Octubre 2011, 06:46 am
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
  1. public void presentarNumRayas(){
  2. switch(palabraElegida.length()){
  3. case 4:
  4. lbl_long4 = new JLabel(" _ _ _ _ "); //tiene 9  - 5
  5. panelPalabras.add(lbl_long4);
  6. break;
  7. case 5:
  8. lbl_long5 = new JLabel(" _ _ _ _ _ "); //tiene 11  - 6
  9. panelPalabras.add(lbl_long5);
  10. break;
  11. case 6:
  12. lbl_long6 = new JLabel(" _ _ _ _ _ _ "); //tiene 13  - 7
  13. panelPalabras.add(lbl_long6);
  14. break;
  15. case 7:
  16. lbl_long7 = new JLabel(" _ _ _ _ _ _ _ "); //tiene 15  - 8
  17. panelPalabras.add(lbl_long7);
  18. break;
  19. case 8:
  20. lbl_long8 = new JLabel(" _ _ _ _ _ _ _ _ "); //tiene 17  - 9
  21. panelPalabras.add(lbl_long8);
  22. break;
  23. }
  24. }

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
  1. public void buscarLetra(){
  2. for(int i=0;i<palabraElegida.length();i++){
  3. if(palabraElegida.substring(i, i+1).equals(letraEscogida)){
  4. auxCorrecto += letraEscogida;
  5. switch(palabraElegida.length()){
  6. case 5:
  7. lbl_long5.setText(auxCorrecto+="");
  8. break;
  9. }
  10. }
  11.  
  12. }
  13. }


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
  1. String str = "Animal";
  2. int index = str.indexOf('m');
  3. System.out.println("Reemplazo: " +str.replace(str.charAt(index),'b'));
  4.  
[/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


Título: Re: Ayuda con este método.
Publicado por: s00rk en 5 Octubre 2011, 05:54 am
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
  1. package Ahorcado;
  2.  
  3. import java.util.Scanner;
  4.  
  5. public class Principal
  6. {
  7. public static void main(String[] args)
  8. {
  9. Scanner Leer = new Scanner(System.in);
  10. AHORCADO A = new AHORCADO();
  11. String letra = "";
  12. char Letra;
  13. int op = -1;
  14. do{
  15. if(op == -1)
  16. op = 1;
  17. else{
  18. A.SOP("\n[1] - Jugar de Nuevo\n[0] - Salir");
  19. op = Leer.nextInt();
  20. }
  21.  
  22.  
  23. switch(op)
  24. {
  25. case 1:
  26. A.Iniciar();
  27. while(A.Gano == -1)
  28. {
  29. letra = Leer.next();
  30. Letra = letra.charAt(0);
  31. A.BuscarLetra(Letra);
  32. }
  33. break;
  34. case 0:
  35. break;
  36. default:
  37. A.SOP("Opcion Indefinida!");
  38. }
  39.  
  40. }while(op != 0);
  41.  
  42. }
  43.  
  44. }
  45.  

AHORCADO:
Código
  1. package Ahorcado;
  2.  
  3. import java.util.Random;
  4.  
  5. public class AHORCADO
  6. {
  7. private String palabra = "", Solucion = "";
  8. private int pos = -1, intentos = 0, maxintentos = 6;
  9. private String [] PALABRAS = {"GATO", "PERRO", "ELEFANTE", "CASA", "AUTOMOVIL",
  10. "ESCUELA", "MALCOM IN THE MIDDLE"};
  11. public int Gano = -1;
  12.  
  13. public void Iniciar()
  14. {
  15. Random R = new Random();
  16. int x = -1;
  17. do{
  18. x = R.nextInt(PALABRAS.length);
  19. }while(pos == x);
  20. pos = x;
  21. palabra = PALABRAS[pos];
  22.  
  23. for(x = 0; x < palabra.length(); x++)
  24. {
  25. if(palabra.charAt(x) != ' ')
  26. Solucion += "_";
  27. else
  28. Solucion += " ";
  29. }
  30. //SOP(palabra);
  31. Dibujar();
  32. }
  33.  
  34. public void BuscarLetra(char pal)
  35. {
  36. String Sol1 = Solucion;
  37. Solucion = "";
  38. for(int x = 0; x < palabra.length(); x++)
  39. {
  40. if(palabra.charAt(x) != ' ')
  41. {
  42. if(pal == palabra.charAt(x))
  43. Solucion += pal;
  44. else
  45. Solucion += Sol1.charAt(x);
  46. }else
  47. Solucion += ' ';
  48. }
  49.  
  50. if(Sol1.compareTo(Solucion) == 0 && Solucion.indexOf(pal) == -1)
  51. intentos++;
  52.  
  53. Dibujar();
  54. if(Solucion.compareTo(palabra) == 0)
  55. {
  56. Gano = 0;
  57. SOP("Usted ha GANADO!!!! ;D");
  58. }else if(intentos == maxintentos){
  59. Gano = 1;
  60. SOP("Usted ha perdido!!! ");
  61. }
  62. }
  63.  
  64. private void Dibujar()
  65. {
  66. for(char c: Solucion.toCharArray())
  67. System.out.print(c + " ");
  68. SOP("");
  69. SOP("\nIntentos restantes: " + (maxintentos - intentos));
  70. }
  71.  
  72. public void SOP(String msj)
  73. {
  74. System.out.println(msj);
  75. }
  76.  
  77. }
  78.  


Título: Re: Ayuda con este método.
Publicado por: Aikanáro Anário en 6 Octubre 2011, 04:00 am
No me funciona bien :-\

Intenté con todas la vocales y no hizo nada, solo iba restando intentos y todas las palabras tienen vocales.


Título: Re: Ayuda con este método.
Publicado por: s00rk en 6 Octubre 2011, 04:19 am
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
  1. while(A.Gano == -1)
  2. {
  3. letra = Leer.next().toUpperCase();
  4. Letra = letra.charAt(0);
  5. A.BuscarLetra(Letra);
  6. }
  7.  


Título: Re: Ayuda con este método.
Publicado por: 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
Citar
String 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.


Título: Re: Ayuda con este método.
Publicado por: s00rk en 6 Octubre 2011, 21:33 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
  1. if(pal == palabra.charAt(x))
  2.    Solucion += pal;
  3. else
  4.    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*! ^_^


Título: Re: Ayuda con este método.
Publicado por: Aikanáro Anário en 7 Octubre 2011, 05:12 am
Pero hay cosas que no entiendo.

Código
  1. public void BuscarLetra(char pal)
  2. {
  3. String Sol1 = Solucion;
  4. Solucion = "";
  5. for(int x = 0; x < palabra.length(); x++)
  6. {
  7. if(palabra.charAt(x) != ' ')
  8. {
  9. if(pal == palabra.charAt(x))
  10. Solucion += pal;
  11. else
  12. Solucion += Sol1.charAt(x);
  13. }else
  14. Solucion += ' ';
  15. }
  16. }
  17.  

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!


Título: Re: Ayuda con este método.
Publicado por: s00rk en 7 Octubre 2011, 07:17 am
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*!


Título: Re: Ayuda con este método.
Publicado por: Aikanáro Anário en 8 Octubre 2011, 02:18 am
Bueno, al final, terminé haciendo otro método distinto para lo mismo. Es que cuando intentaba usar el tuyo tenía problema con los espacios, salían todas las letras juntas y el método dibujar no me funcionaba bien, seguro fue que me confundí en algo porque es un pelín diferente imprimir el texto en la interfaz, pero bueno....
el caso es que ahora tengo este método:

Código
  1. public void buscarLetra(){
  2. chequearif = false;
  3. string = "";
  4. letra = letraEscogida.toCharArray(); //letra es un vector. la letraEscogida la escoge el usuario desde un combo box
  5.                                                                           //la razon para esta conversion es para poder asignar la letra a arrayGuiones[]
  6. System.out.println("la letra pasa a char:" +letra[0]);
  7. int index = 0;
  8. for(int i=0;i<(palabraElegida.length());i++){
  9. if(palabraElegida.substring(i, i+1).equals(letraEscogida) == true){
  10. if(chequearif == true){//este if es para cuando una palabra tiene letras repetidas
  11. string = "";
  12. index = palabraElegida.indexOf(letraEscogida, index+1);
  13. index *= 2; //lo multiplico por dos por los espacios en blanco, para que ocupe la posicion correcta.
  14. arrayGuiones[index] = letra[0]; //sustituyo la posicion que ocupa la letra en la palabra secreta por el guion bajo correspondiente
  15. System.out.println(index);
  16. }
  17. index = palabraElegida.indexOf(letraEscogida);
  18. index *= 2;
  19. arrayGuiones[index] = letra[0];
  20. for(int j=0;j<arrayGuiones.length;j++){
  21. string += arrayGuiones[j]+"";
  22. }
  23. lbl_palabra.setText(string);
  24. chequearif = true;
  25. }
  26. }
  27.                         //esta parte no es relevante, por ahora.
  28. getLblText();
  29.  
  30. if(chequearif == false){
  31. fallos=fallos+1;
  32. lbl_img.setIcon(imagen[fallos]);
  33. System.out.println("Fallos: " +fallos);
  34. if(fallos == 6){
  35. jcb.setEnabled(false);
  36. boton.setEnabled(false);
  37. }
  38. }
  39. }
  40.  

Sí, mucho más complicado y menos eficiente, pero ¡al fin pude hacerlo yo!, vale que eso me tenía sin dormir por varios días xD y todavía lo va a seguir haciendo... porque no sé que pasa, pero no funciona bien con la palabra "gallina", específicamente con la letra "l" (L minúscula). Cuando mandó la letra L, me da un montón de errores. No sé si pasará con más letras porque ahora solo tengo 10 palabras (pato, vaca, gallina, avestrus, canguro, caracol, perro, oveja, aguila, conejo y chivo). Y solo me pasa con gallina. ¿me hechan una mano?  :rolleyes:  ;D

Los System.out.print que hay en el código no son necesarios, solo que me ayudan a depurarlo y a ver lo que pasa internamente.

También pasa con "perro", así que el problema es cuando la letra que se repite van una después de la otra. "r" "r"; "l" ,"l"

Las tres primeras líneas del error dice:
Estos datos son con la palabra "gallina" y cuando envié la letra "a" y después con la "l"
Citar
longitud de array guionesBajos: 14
la letra pasa a char:a
_ _ _ _ _ _ _
primer index: 2
segundo index: 12
primer index: 2
_ a _ _ _ _ a
la letra pasa a char:l
primer index: 4
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -2
   at Ahorcaito.buscarLetra(Ahorcaito.java:232)
   at Ahorcaito.actionPerformed(Ahorcaito.java:188)

Lo que dice primer index, es el valor del index que se ejecuta primero, cuando chequearif es false. el segundo index, es cuando se cumple chequearif es true. La longitud del array de guionesBajos, (o sea las rayitas que representan las letras del programa) es de 14, contando los espacios en blanco.
Si hubiera enviado la letra L los datos deberían ser:
primer index: 4
segundo index: 6
porque la primera posición en la palabra "gallina" de la letra L es 2 y como se múltiplica por 2 = 4. La segunda posicion de la L es 3 y 3*2=6.

El error que me da me dice que el array está fuera de los límites, pero según mi análisis, no es así :-/


Título: Re: Ayuda con este método.
Publicado por: |Miguel| en 25 Octubre 2011, 17:36 pm
Si te interesa para comparar, tengo por ahí un ahorcado que hice en C.