• Publicidad

Problema con el control de un bucle

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con el control de un bucle

Notapor Alfumao » 2010-11-08 09:57 @456

Hola a todos,

He intentado hacer como práctica un programa para jugar al "AHORCADO". Pero aunque el programa funciona relativamente, tengo un problema crucial con el control de los fallos. Resulta que cada letra introducida para ver si esta en la palabra secreta, me es reconocida como fallo a excepción de la primera letra de la palabra secreta. Es decir, que hay un descontrol en el bucle encargado de controlar los fallos. No soy capaz de idear una forma de controlarlo... ¿Alguien me puede ayudar?

Gracias por adelantado.

Aquí va el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\Perl\bin\perl.exe
  2. use strict;
  3. use warnings;
  4.  
  5. print "Elige tu palabra secreta:\n";
  6. chomp(my $word = <STDIN>);
  7. my @word = split ('', $word);
  8. my @hidden = ((0) x scalar (@word));
  9.  
  10. my @toy = ("","O","-","|","-","<");
  11. my @palis =();
  12. my $i = 0;
  13. my $wrong = 0;
  14. my $right = 0;
  15.  
  16. CORE: #Bucle Central
  17. while (($wrong < 6)){  
  18. print"Dí una letra:\n";
  19. chomp(my $guess = <STDIN>);
  20.     foreach $i (0..$#word){
  21.         if ($guess eq $word[$i]){  #Correctos
  22.             $right++;
  23.             $word[$i] = $guess;
  24.             $hidden[$i] = $guess;
  25.             print "ACIERTO!\n";
  26.             print "@hidden\n";
  27.             &compare;
  28.             next;
  29.         }
  30.         }
  31.  
  32.         if ($guess eq $word[$i]){ #Fallos
  33.             next CORE;
  34.             }
  35.         else {
  36.             $wrong++;
  37.             print "Fallo!\n";
  38.             my $muneco = shift(@toy);
  39.             push (@palis,$muneco);
  40.             print"@palis\n";
  41.             next;
  42.         }
  43. }
  44. &guess_word;
  45.  
  46. sub compare{ #Final correcto
  47.   my $hidden = join ("", @hidden);
  48.   my $e_word = join ("", @word);
  49. if ($e_word =~ /$hidden/){
  50.     print"Correcto -> GANASTE\!\n!\n";
  51.     exit;
  52.     }
  53. }
  54. sub guess_word{ #Ultima oportunidad
  55.   my $hidden = join ("", @hidden);
  56.   my $f_word = join ("", @word);
  57. if ($f_word =~ /$hidden/){
  58.     print"GANASTE\!\n";
  59.    return 1;
  60.    }else {
  61.     print "Intenta adivinar la palabra completa:\n";
  62.     chomp(my $g_word = <STDIN>);
  63.     if ($g_word =~ /$word/){
  64.     print"GANASTE\!\n";
  65.     return 1;
  66.     } else {
  67.      print "AHORCADO\!";  
  68.     exit;
  69.     }
  70. }
  71. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Publicidad

Re: Problema con el control de un bucle

Notapor explorer » 2010-11-08 14:14 @635

El problema es que la comprobación de si hay un fallo (sentencia if() de la línea 32) está fuera del bucle que recorre la palabra, en la línea 20.

El bucle comprueba los aciertos, pero al salir del bucle, si la última letra es un fallo, siempre entrará en la parte de fallo.

Te recomiendo que aprendas a usar el depurador paso a paso de Perl, así se ve fácil dónde está el fallo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con el control de un bucle

Notapor Alfumao » 2010-11-08 17:59 @791

Hola, explorer.

Es que si lo meto en el bucle, como tú dices, aún funciona peor... porque al meter la primera letra, cada letra no acertada la cuenta como fallo, pudiendo así perder la partida con solo meter una letra (incluso si ésta es correcta) si la palabra tiene más de 7 letras en total (se dibujaría todo el ahorcado de una vez)... gracias a que lo saqué de ese bucle, solo me daba un fallo por iteración del bucle.

Creo que es cosa de controlar de forma independiente el bucle de los fallos, pero no sé cómo hacerlo.

Saludos.

PD. ¿Dónde puedo aprender a usar el depurador de Perl? Gracias de nuevo. :D
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Problema con el control de un bucle

Notapor explorer » 2010-11-08 19:18 @845

Yo creo que es fácil: se produce un fallo solo en el caso de que, al terminar el bucle, no se haya encontrado ninguna letra correcta. Eso quiere decir que deberás llevar la cuenta de los aciertos dentro del bucle. Y si no hay aciertos... es un fallo.

Sobre el tema del depurador, Google me dice que en Tutorial de Perl de JJ Merelo (pdf), entre las páginas 8 y 9, se comenta, brevemente, el uso del depurador. Bueno, con saberse los comando 'n' (siguiente instrucción), 's' (ir paso a paso), y 'p' (de print), vale.

Hecha un vistazo también a la La Guía de Brian para resolver cualquier problema Perl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con el control de un bucle

Notapor Alfumao » 2010-11-10 10:29 @478

¡Gracias explorer!

:D

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\Perl\bin\perl.exe
  2. use strict;
  3. use warnings;
  4.  
  5. print "Elige tu palabra secreta:\n";
  6. chomp(my $word = <STDIN>);
  7. my @word = split ('', $word);
  8. my @hidden = ((0) x scalar (@word));
  9.  
  10. my @toy = ("O","-","|","-","<");
  11. my @palis =();
  12. my $i = 0;
  13. my $wrong = 0;
  14. my $right = 0;
  15.  
  16. CORE: #Bucle Central
  17. while (($wrong < 5)){  
  18. print"Dí una letra:\n";
  19. chomp(my $guess = <STDIN>);
  20. my $right_guess = 0;
  21.     foreach $i (0..$#word){
  22.         if ($guess eq $word[$i]){  #Correctos
  23.             $right_guess = 1;
  24.             $right++;
  25.             $word[$i] = $guess;
  26.             $hidden[$i] = $guess;
  27.             print "ACIERTO!\n";
  28.             print "@hidden\n";
  29.             &compare;
  30.             next;
  31.         }
  32.     }
  33.          if (! $right_guess){
  34.             $wrong++;
  35.             print "FALLASTE!\n";
  36.             my $muneco = shift(@toy);
  37.             push (@palis,$muneco);
  38.             print"@palis\n";
  39.             next;
  40.                     }
  41.         }    
  42. &guess_word;
  43.      
  44. sub compare{ #Final correcto
  45.   my $hidden = join ("", @hidden);
  46.   my $e_word = join ("", @word);
  47. if ($e_word =~ /$hidden/){
  48.     print"Correcto -> GANASTE\!\n!\n";
  49.     exit;
  50.     }
  51. }
  52. sub guess_word{ #Ultima oportunidad
  53.   my $hidden = join ("", @hidden);
  54.   my $f_word = join ("", @word);
  55. if ($f_word =~ /$hidden/){
  56.     print"GANASTE\!\n";
  57.    return 1;
  58.    }else {
  59.     print "Intenta adivinar la palabra completa:\n";
  60.     chomp(my $g_word = <STDIN>);
  61.     if ($g_word =~ /$word/){
  62.     print"GANASTE\!\n";
  63.     return 1;
  64.     } else {
  65.      print "AHORCADO\!";  
  66.     exit;
  67.     }
  68. }
  69. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 24 invitados