• Publicidad

[RETO] Dibujar tablero de ajedrez

Aprende Perl

[RETO] Dibujar tablero de ajedrez

Notapor explorer » 2014-01-15 11:36 @525

La propuesta es hacer un programa en Perl que dibuje un tablero de ajedrez, junto con sus piezas, en una terminal.

No hay limitación de estilo (se puede hacer como se quiera), ni de tamaño, colores o disposición.

La única limitación es la de no usar ninguno de los módulos CPAN que dibujen el tablero de forma directa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: [RETO] Dibujar tablero de ajedrez

Notapor Aceitunas » 2014-01-15 21:20 @930

Acabo de ver una respuesta tuya en un mensaje, en la que usas el módulo Text::ASCIITable, supongo que tampoco valdrá usarlo, ¿No?

PD: Ya tengo el tablero hecho

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.16;
  2.  
  3. $_ = ".--------------------------.
  4. |  |  |  |  |  |  |  |  |  |
  5. |--------------------------|
  6. |  |  |  |  |  |  |  |  |  |
  7. |--------------------------|
  8. |  |  |  |  |  |  |  |  |  |
  9. |--------------------------|
  10. |  |  |  |  |  |  |  |  |  |
  11. |--------------------------|
  12. |  |  |  |  |  |  |  |  |  |
  13. |--------------------------|
  14. |  |  |  |  |  |  |  |  |  |
  15. |--------------------------|
  16. |  |  |  |  |  |  |  |  |  |
  17. |--------------------------|
  18. |  |  |  |  |  |  |  |  |  |
  19. .--------------------------.";
  20.          
  21. say $_;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4



¡Ja,ja,ja,ja!
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: [RETO] Dibujar tablero de ajedrez

Notapor explorer » 2014-01-15 21:41 @945

Se puede usar cualquier módulo que no sea específico de tablero de ajedrez. Por ejemplo, se puede usar Chess::Board porque es un módulo que sirve para hacer una representación de un momento de una partida, pero no para pintarla en pantalla. También se permite usar el módulo Chess::ChessKit, pero no su método chessview(), porque es justo el método que muestra el tablero.

El objeto es pintar un tablero, con sus piezas. Y las piezas pueden ser letras o lo que sea. Y si se ponen piezas, deben estar en posiciones legales (no aleatorias).

Tu solución no es perfecta: no se distinguen las casillas blancas de las negras, ni tiene piezas. Y una columna demás. Recuerda que puedes reeditarlo pulsando en el botón Editar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: [RETO] Dibujar tablero de ajedrez

Notapor Aceitunas » 2014-01-17 11:42 @529

Bueno, yo he conseguido dibujar el tablero correctamente; con las fichas ya no me he atrevido a entrar :evil:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.16;
  2. use Win32::Console::ANSI;
  3. use Term::ANSIColor;
  4.  
  5. my $tabla = "
  6. .-----------------------.
  7. |  |  |  |  |  |  |  |  |
  8. |-----------------------|
  9. |  |  |  |  |  |  |  |  |
  10. |-----------------------|
  11. |  |  |  |  |  |  |  |  |
  12. |-----------------------|
  13. |  |  |  |  |  |  |  |  |
  14. |-----------------------|
  15. |  |  |  |  |  |  |  |  |
  16. |-----------------------|
  17. |  |  |  |  |  |  |  |  |
  18. |-----------------------|
  19. |  |  |  |  |  |  |  |  |
  20. |-----------------------|
  21. |  |  |  |  |  |  |  |  |
  22. .-----------------------.
  23. ";
  24.  
  25. my @caracter = split("",$tabla);
  26.  
  27. my $siguiente = 0;
  28. my $cont = 0;
  29.  
  30. my $bon = 0;
  31.  
  32. foreach my $c (@caracter)
  33. {
  34.         if ($c eq " " or $c eq "P")
  35.     {
  36.         $bon++;
  37.                
  38.                 if ($siguiente == 1)
  39.                 {
  40.                         print $c;
  41.                        
  42.                         $cont++;
  43.                         if ($cont == 2)
  44.                         {
  45.                             if ($bon == 16)
  46.                                 {
  47.                                     $siguiente = 1;
  48.                                         $bon = 0;
  49.                                 }else{
  50.                                         $siguiente = 0;
  51.                                 }
  52.                                 $cont = 0;
  53.                         }
  54.                 }else{
  55.                        
  56.                         print colored (' ','red on_white');
  57.                     print color 'reset';
  58.                        
  59.                         $cont++;
  60.                        
  61.                         if ($cont == 2)
  62.                         {
  63.                             if ($bon == 16)
  64.                                 {
  65.                                     $siguiente = 0;
  66.                                         $bon = 0;
  67.                                 }else{
  68.                                         $siguiente = 1;
  69.                                 }
  70.                                 $cont = 0;
  71.                         }              
  72.                 }      
  73.     }else{
  74.                 print $c;
  75.         }
  76. }
  77.  
  78. exit;
  79.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Como sé que tu, explorer, no tienes Windows, te dejo una imagen de cómo imprime:

Imagen

Un saludo.

P.D.: a ver si se anima la gente que suele frecuentar el foro como Doddy y Danimera.
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: [RETO] Dibujar tablero de ajedrez

Notapor explorer » 2014-01-17 21:25 @934

Pero, Aceitunas... para las piezas te vale con usar letras... R (Rey), D (Dama), T (Torre), A (Alfil), C (Caballo), P (Peón). O cualquier otro conjunto de caracteres que las represente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: [RETO] Dibujar tablero de ajedrez

Notapor Aceitunas » 2014-01-18 15:28 @686

Imagen

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.16;
  2. use Win32::Console::ANSI;
  3. use Term::ANSIColor;
  4.  
  5. my $tabla = "
  6. .-------------------------------.
  7. | T | C | A | r | R | A | C | T |
  8. |-------------------------------|
  9. | P | P | P | P | P | P | P | P |
  10. |-------------------------------|
  11. |   |   |   |   |   |   |   |   |
  12. |-------------------------------|
  13. |   |   |   |   |   |   |   |   |
  14. |-------------------------------|
  15. |   |   |   |   |   |   |   |   |
  16. |-------------------------------|
  17. |   |   |   |   |   |   |   |   |
  18. |-------------------------------|
  19. | P | P | P | P | P | P | P | P |
  20. |-------------------------------|
  21. | T | C | A | R | r | A | C | T |
  22. .-------------------------------.
  23. ";
  24.  
  25. my @caracter = split( "", $tabla );
  26.  
  27. my $siguiente = 0;
  28. my $cont      = 0;
  29.  
  30. my $bon = 0;
  31.  
  32. foreach my $c (@caracter) {
  33.     if ( $c eq " " or $c eq 'T' or $c eq 'C' or $c eq 'A' or $c eq 'r' or $c eq 'P' or $c eq 'R' ) {
  34.         $bon++;
  35.  
  36.         if ( $siguiente == 1 ) {
  37.             print $c;
  38.  
  39.             $cont++;
  40.             if ( $cont == 3 ) {
  41.                 if ( $bon == 24 ) {
  42.                     $siguiente = 1;
  43.                     $bon       = 0;
  44.                 }
  45.                 else {
  46.                     $siguiente = 0;
  47.                 }
  48.                 $cont = 0;
  49.             }
  50.         }
  51.         else {
  52.             print colored ( $c, 'blue on_white' );
  53.             print color 'reset';
  54.  
  55.             $cont++;
  56.  
  57.             if ( $cont == 3 ) {
  58.                 if ( $bon == 24 ) {
  59.                     $siguiente = 0;
  60.                     $bon       = 0;
  61.                 }
  62.                 else {
  63.                     $siguiente = 1;
  64.                 }
  65.                 $cont = 0;
  66.             }
  67.         }
  68.     }
  69.     else {
  70.         print $c;
  71.     }
  72. }
  73.  
  74. exit;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Así se queda ya :D
Última edición por explorer el 2014-01-19 19:13 @842, editado 1 vez en total
Razón: Formateado de código con Perltidy
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: [RETO] Dibujar tablero de ajedrez

Notapor explorer » 2014-01-23 18:13 @801

Hay un par de errores... creo... si la dama es la 'r', resulta que la dama blanca no está en la casilla de su color. Y la dama negra está enfrentada al rey blanco. :twisted:

Por otra parte... no hay forma de saber de qué color es cada bando. Las letras son azules sobre fondo blanco, o blancas sobre fondo negro, pero de forma alternada.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: [RETO] Dibujar tablero de ajedrez

Notapor Aceitunas » 2014-01-23 19:31 @854

Hola, explorer :D

En realidad puse las fichas en blanco y negro (bueno, azul), porque pensé que como era consola era mejor que no estuviera en color... Para ponerlas en color solo hacen falta un par de cambios...

Imagen

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.16;
  2. use Win32::Console::ANSI;
  3. use Term::ANSIColor;
  4.  
  5. my $tabla = "
  6. .-------------------------------.
  7. | T | C | A | D | R | A | C | T |
  8. |-------------------------------|
  9. | P | P | P | P | P | P | P | P |
  10. |-------------------------------|
  11. |   |   |   |   |   |   |   |   |
  12. |-------------------------------|
  13. |   |   |   |   |   |   |   |   |
  14. |-------------------------------|
  15. |   |   |   |   |   |   |   |   |
  16. |-------------------------------|
  17. |   |   |   |   |   |   |   |   |
  18. |-------------------------------|
  19. | P | P | P | P | P | P | P | P |
  20. |-------------------------------|
  21. | T | C | A | D | R | A | C | T |
  22. .-------------------------------.
  23. ";
  24.  
  25. my @caracter = split("",$tabla);
  26.  
  27. my $siguiente = 0;
  28. my $cont = 0;
  29.  
  30. my $bon = 0;
  31. my $Color = 0;
  32.  
  33. foreach my $c (@caracter)
  34. {
  35.         if ($c eq " " or $c eq 'T' or $c eq 'C' or $c eq 'A' or $c eq 'D' or $c eq 'P' or $c eq 'R')
  36.     {
  37.         $bon++;
  38.                
  39.                 if ($c eq 'T' or $c eq 'C' or $c eq 'A' or $c eq 'D' or $c eq 'P' or $c eq 'R')
  40.                 {
  41.                          $Color++;
  42.                 }
  43.                
  44.                 if ($siguiente == 1)
  45.                 {
  46.                         #print $c;
  47.                        
  48.                         if ($Color < 17)
  49.                         {
  50.                                 print colored ($c,'green on_black');
  51.                                 print color 'reset';
  52.                         }else{
  53.                             print colored ($c,'red on_black');
  54.                                 print color 'reset';
  55.                         }
  56.                        
  57.                         $cont++;
  58.                         if ($cont == 3)
  59.                         {
  60.                             if ($bon == 24)
  61.                                 {
  62.                                     $siguiente = 1;
  63.                                         $bon = 0;
  64.                                 }else{
  65.                                         $siguiente = 0;
  66.                                 }
  67.                                 $cont = 0;
  68.                         }
  69.                 }else{
  70.                     if ($Color < 17)
  71.                         {
  72.                                 print colored ($c,'green on_white');
  73.                                 print color 'reset';
  74.                         }else{
  75.                             print colored ($c,'red on_white');
  76.                                 print color 'reset';
  77.                         }
  78.                        
  79.                         $cont++;
  80.                        
  81.                         if ($cont == 3)
  82.                         {
  83.                             if ($bon == 24)
  84.                                 {
  85.                                     $siguiente = 0;
  86.                                         $bon = 0;
  87.                                 }else{
  88.                                         $siguiente = 1;
  89.                                 }
  90.                                 $cont = 0;
  91.                         }              
  92.                 }      
  93.     }else{
  94.                 print $c;
  95.         }
  96. }
  97.  
  98. exit;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo de las fichas es cierto, estaban colocadas mal... no sé por qué pensaba que iban al revés (no soy aficionado al Ajedrez).
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: [RETO] Dibujar tablero de ajedrez

Notapor explorer » 2014-01-23 20:44 @905

Esta es mi versión:

Imagen

Las letras y piezas salen un poco descolocadas, porque he usado un tipo de letra no monoespaciada (Symbola). Con fuente monoespaciada sale mejor, pero las piezas son más feas :)

Imagen

El código (un poquitín ofuscado, y con alguna trampa):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #
  3. # Pinta un tablero de ajedrez. v2
  4. # Joaquín Ferrero, 2014-01-24.
  5.  
  6. use v5.16;
  7. use utf8::all;
  8. use Term::ANSIColor;
  9. #use charnames ":full";                                 # usar nombres de caracteres (implícito en v5.16)
  10.  
  11. my @colores_escaques = qw<bright_green green>;          # colores del tablero
  12. my @colores_piezas   = qw<white red>;                   # colores de las piezas
  13. my @colores_borde    = qw<black on_rgb310>;
  14. my $borde_h          = colored(\@colores_borde, ' ', (map {" $_ "} 'a' .. 'h'), ' ');
  15.  
  16.  
  17. ## Pintado del tablero
  18. say $borde_h;                                           # de arriba
  19.  
  20. for my $fila ( reverse 1 .. 8 ) {
  21.  
  22.     my $borde = colored(\@colores_borde, $fila);
  23.  
  24.     print $borde;                                       # de la izq.
  25.    
  26.     for my $columna ( 1 .. 8 ) {
  27.         print celda($fila, $columna);
  28.     }
  29.    
  30.     say $borde;                                         # de la der.
  31. }
  32.  
  33. say $borde_h;                                           # de abajo
  34.  
  35.  
  36. ### Subrutinas
  37. sub celda {
  38.     my($fila, $columna) = @_;
  39.  
  40.     ## Escaque
  41.     my $color_escaque = $colores_escaques[1-($fila+$columna) % 2];
  42.  
  43.     ## Pieza
  44.     my $pieza
  45.         = ($fila > 2  and  $fila < 7)
  46.         ? ' '
  47.         : eval '"\N{'
  48.                . join(' ',
  49.                     ( $fila < 3 ? 'BLACK'       # 'WHITE'       # ¡Trampa!
  50.                     : $fila > 6 ? 'BLACK'
  51.                     : ''
  52.                     ),
  53.                     'CHESS',
  54.                     qw(ROOK KNIGHT BISHOP QUEEN KING PAWN)
  55.                     [( ($fila == 2 or  $fila == 7) ? 6
  56.                      :  $columna < 6               ? $columna
  57.                      :                               9 - $columna
  58.                     )-1]
  59.                   )
  60.                . '}"'
  61.         ;
  62.  
  63.     ## Color de la pieza
  64.     my $color_pieza = $colores_piezas[$fila > 5];
  65.  
  66.  
  67.     ## Resultado
  68.     return colored([$color_pieza, "on_$color_escaque"], " $pieza ");
  69. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: [RETO] Dibujar tablero de ajedrez

Notapor Aceitunas » 2014-01-24 08:54 @413

Cómo abusas, explorer :mrgreen:
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Siguiente

Volver a Formación

¿Quién está conectado?

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