tableros

Iniciado por anabelanggie, 4 Marzo 2014, 16:44 PM

0 Miembros y 2 Visitantes están viendo este tema.

anabelanggie

Hola.
Habiendo declarado previamente un array bidimensional de 8x8.
quiero dibujar un tablero utilizando  caracteres de la parte extendida del
código ASCII. Estos son los códigos que tengo que utilizar: 218, 196, 194, 191, 179,195, 197, 180, 192, 193 y 217 y tres "fichas" código 219.

No se cómo relacionar el array bidimensional con el tablero que me tiene que dibujar en pantalla :huh: :-(
________
|__|__|__|
|__|__|__|

eferion

La pantalla no es sino una matriz más o menos grande... tiene filas y columnas.

Tu tienes un array de 8x8.

Imagínate que coges una porción de la pantalla de 8x8 y dibujas en esa porción una representación de tu matriz.

Basta con recorrer la matriz por filas... para cada fila recorres sus columnas... en cada posición compruebas el valor de la celda e imprimes por pantalla el caracter que corresponde con ese valor... pasas al siguiente valor. Cuando terminas una fila introduces un salto de línea y repetir.


Yoel Alejandro

#2
Hola. ¿Qué simbolos dibujan esos códigos ASCII? A mí no me parecen símbolos de un tablero de ajedrez o similar ...  :huh:

No se si querrás producir algo como esto:

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| e | f | g | h |
+---+---+---+---+


Bueno, esperando a que respondas pero si ese es el caso aquí tienes un pequeño código que hace la tarea. Por comodida, creé la función fillRow que rellena una fila dada de la matriz con los caracteres de una cadena pasada como argumento. En este caso puse 'x' como relleno de la casilla, y espacio para dejar vacía la misma. Reemplaza el símbolo de relleno por el que tú requieres. Además, puedes cambiar las constantes M y N por otros valores en caso de querer redimensionar la matriz.

Código (cpp) [Seleccionar]

#include <stdlib.h>
#include <stdio.h>

#define M 8
#define N 8

void fillRow( char **, int, const char *);
void printBoard( char ** );

int main() {

char **A;
int i;

/* Inicializa la matriz, y termina si ocurre error */
if ( ( A = (char **) malloc ( M * sizeof(char *) ) ) == NULL )
return -1;
for (i = 0; i < M; i++ )
if ( ( A[i] = (char *) malloc ( N * sizeof(char) ) ) == NULL )
return -1;

fillRow( A, 0, "xxx xx x" );
fillRow( A, 1, "x  x  x " );
fillRow( A, 2, "x x x x " );
fillRow( A, 3, "xxxxx   " );
fillRow( A, 4, "xx      " );
fillRow( A, 5, "xx xx xx" );
fillRow( A, 6, "x  xxxx " );
fillRow( A, 7, "xxxxxxxx" );

/* imprimir el tablero */
printBoard( (char **)A );

return 0;
}

/* Rellena la fila i de la matriz A con los elementos del vector x */
void fillRow( char **A, int i, const char *x) {

int j;

for (j = 0; j < N; j++)
A[i][j] = x[j];
}

/* Imprime un tablero de 8x8, rellenando las casillas con los
* caracteres almacenados en la matriz A
*/
void printBoard( char **A ) {

int i, j;
char c, *s;

puts("+---+---+---+---+---+---+---+---+");
for (i = 0; i < M; i++) {
putchar('|');
for (j = 0; j < N; j++)
if ( A[i][j] != '\0' )
printf(" %c |", A[i][j]);
else
printf("   |");
puts("\n+---+---+---+---+---+---+---+---+");
}
putchar('\n');
}
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

#3
Creo que no has entendido bien el asunto. Se trata de crear la cuadrícula no sólo con los símbolos + , - | sino usando:

Citar

       ┌   ─   ┬   ┐  │  ├   ┼   ┤   └   ┴  


y colocar en medio de la matriz tres:

Citar





Un fuerte saludo querido yoel_alejandro y como se suele decir, pelillos a la mar.

Yo, en particular, estoy muy contento con tus aportes ya que la mayoría de los expertos lo son más de C++ y a mí me interesa más el C puro y duro y creo que tus aportaciones serán muy bienvenidas..... caso aparte es rir3760 al que considero un "maestro" en el conocimiento en profundidad de C y C++.


¡¡¡¡ Saluditos! ..... !!!!




Yoel Alejandro

#4
"Yo, en particular, estoy muy contento con tus aportes ya que la mayoría de los expertos lo son más de C++ y a mí me interesa más el C puro y duro"

Jejeje, pues sí, es un dicho que entre más bajo el nivel más duro es el programador, jeje. De hecho me impongo como costumbre personal tratar de hacer los programas en C puro, salvo que sea estrictamente necesario usar C++ (por ejemplo si se requieren clases).

Ya tengo la respuesta (y creo que me quedó cool :laugh:). Bueno, es cuestión de probar con estos nuevos simbolitos, y tener paciencia hasta "cuadrar" el resultado. Yo te recomendaría anabelangie, definir mnemónicos o nombres simbólicos para los códigos ASCII a usar, de esa forma se trabaja de manera estructurada, y el código es más fácil de comprender y modificar en el futuro.

Siguiendo más o menos la nomenclatura que pude escudriñar en el fichero de cabecera [ncurses.h (el equivalente Linux para conio.h), me "copié" los nombres:

#define ULCORNER 218      /* upper-left corner, esquina superior izquierda */
#define URCORNER 191      /* upper-right corner, esquina superior derecha */
#define LLCORNER 192      /* lower-left corner, esquina inferior izquierda */
#define LRCORNER 217      /* lower-right corner, esquina inferior izquierda */
#define VLINE    179      /* vertical line, linea vertical */
#define HLINE    196      /* horizontal line, linea horizontal (guion) */
#define TTEE     193      /* top-tee, letra 'T' apuntando hacia arriba */
#define RTEE     195      /* right-tee, letra 'T' apuntando hacia la derecha */
#define BTEE     194      /* bottom-tee, letra 'T' apuntando hacia abajo */
#define LTEE     180      /* left-tee, letra 'T' apuntando hacia la izquierda */
#define CROSS    197      /* crossover, cruz grande (de mayor tamaño que el signo '+') */
#define TOKEN    219      /* ficha o pieza */

y disculpen el inglés, es sólo para hacerlo más universal. Lo demás es modificar el printBoard para que el diseño te quede como quieres. Claro, es más laborioso que con '+', '|' y '-', y requiere muchos más caracteres para producir el resultado  ... :rolleyes:

Los caracteres de la matriz A que sean distintos de un nulo '\0' y de un espacio se representarán como la ficha o TOKEN (ASCII 219). Queda la posibilidad de ampliar el programa para permitir varios diseños de fichas, según los caracteres simbólicos en A. El resultado:

┌───┬───┬───┬───┬───┬───┬───┬───┐
│ █ │ █ │ █ │   │ █ │ █ │   │ █ │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ █ │   │   │ █ │   │   │ █ │   │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ █ │   │ █ │   │ █ │   │ █ │   │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ █ │ █ │ █ │ █ │ █ │   │   │   │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ █ │ █ │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ █ │ █ │   │ █ │ █ │   │ █ │ █ │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ █ │   │   │ █ │ █ │ █ │ █ │   │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ █ │ █ │ █ │ █ │ █ │ █ │ █ │ █ │
└───┴───┴───┴───┴───┴───┴───┴───┘


y el código fuente que lo produce:
Código (cpp) [Seleccionar]

#include <stdlib.h>
#include <stdio.h>

#define M 8
#define N 8

/* Definiendo mnemonicos para los simbolos ASCII */
#define ULCORNER 218 /* upper-left corner, esquina superior izquierda */
#define URCORNER 191 /* upper-right corner, esquina superior derecha */
#define LLCORNER 192 /* lower-left corner, esquina inferior izquierda */
#define LRCORNER 217 /* lower-right corner, esquina inferior izquierda */
#define VLINE    179 /* vertical line, linea vertical */
#define HLINE    196 /* horizontal line, linea horizontal (guion) */
#define TTEE     193 /* top-tee, letra 'T' apuntando hacia arriba */
#define RTEE     195 /* right-tee, letra 'T' apuntando hacia la derecha */
#define BTEE     194 /* bottom-tee, letra 'T' apuntando hacia abajo */
#define LTEE     180 /* left-tee, letra 'T' apuntando hacia la izquierda */
#define CROSS    197 /* crossover, cruz grande (de mayor tamaño que el signo '+') */
#define TOKEN    219 /* ficha o pieza */

void fillRow( char **, int, const char *);
void printBoard( char ** );

int main() {

char **A;
int i;

/* Inicializa la matriz, y termina si ocurre error */
if ( ( A = (char **) malloc ( M * sizeof(char *) ) ) == NULL )
return -1;
for (i = 0; i < M; i++ )
if ( ( A[i] = (char *) malloc ( N * sizeof(char) ) ) == NULL )
return -1;

fillRow( A, 0, "xxx xx x" );
fillRow( A, 1, "x  x  x " );
fillRow( A, 2, "x x x x " );
fillRow( A, 3, "xxxxx   " );
fillRow( A, 4, "xx      " );
fillRow( A, 5, "xx xx xx" );
fillRow( A, 6, "x  xxxx " );
fillRow( A, 7, "xxxxxxxx" );

/* imprimir el tablero */
printBoard( (char **)A );

return 0;
}

/* Rellena la fila i de la matriz A con los elementos del vector x */
void fillRow( char **A, int i, const char *x) {

int j;

for (j = 0; j < N; j++)
A[i][j] = x[j];
}

/* Imprime un tablero de 8x8, rellenando las casillas con los
* caracteres almacenados en la matriz A
*/
void printBoard( char **A ) {

int i, j;
char c, *s;

printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", ULCORNER,
HLINE, HLINE, HLINE, BTEE,
HLINE, HLINE, HLINE, BTEE,
HLINE, HLINE, HLINE, BTEE,
HLINE, HLINE, HLINE, BTEE,
HLINE, HLINE, HLINE, BTEE,
HLINE, HLINE, HLINE, BTEE,
HLINE, HLINE, HLINE, BTEE,
HLINE, HLINE, HLINE, URCORNER);
for (i = 0; i < M; i++) {
putchar(VLINE);
for (j = 0; j < N; j++)
if ( A[i][j] != '\0' && A[i][j] != ' ')
printf(" %c %c", 219, VLINE);
else
printf("   %c", VLINE);
if ( i < M - 1 )
/* todas las lineas excepto la ultima */
printf("\n%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", RTEE,
HLINE, HLINE, HLINE, CROSS,
HLINE, HLINE, HLINE, CROSS,
HLINE, HLINE, HLINE, CROSS,
HLINE, HLINE, HLINE, CROSS,
HLINE, HLINE, HLINE, CROSS,
HLINE, HLINE, HLINE, CROSS,
HLINE, HLINE, HLINE, CROSS,
HLINE, HLINE, HLINE, LTEE);
else
/* la linea final */
printf("\n%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", LLCORNER,
HLINE, HLINE, HLINE, TTEE,
HLINE, HLINE, HLINE, TTEE,
HLINE, HLINE, HLINE, TTEE,
HLINE, HLINE, HLINE, TTEE,
HLINE, HLINE, HLINE, TTEE,
HLINE, HLINE, HLINE, TTEE,
HLINE, HLINE, HLINE, TTEE,
HLINE, HLINE, HLINE, LRCORNER);
}

}[/tt]






Ah, por cierto, yo trabajo en consola de Linux, y para que me pudiera representar correctamente los símbolos tuve que poner la codificación "IBM850", no me sirvió ISO-5589-1 ni UTF-8. No se si en Windows será lo mismo ... ¿alguien sabe qué pasa con ésto?  :huh:
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

#5
Tienes que fijarte un poquito más, tan sólo hay que dibujar TRES del 219.




Muy bueno el uso de las macros. A mí me va más hacerlo a lo "bestia":

Citar
218=┌  196=─  194=┬  191=┐  179=│  195=├

197=┼  180=┤  192=└  193=┴  217=┘  219=█

Código (cpp) [Seleccionar]

/**
a0=linea superior
a1=lineas intermedias
a2=linea inferior
a3=lineas laterales
**/

#include <stdio.h>
#include <stdlib.h>

int main()
{
 system("color 70");
 int i,j,cont=0;
 int a1[33]={195,196,196,196,197,196,196,196,197,196,196,196,197,196,196,196,197,196,196,196,197,196,196,196,197,196,196,196,197,196,196,196,180},
     a0[33]={218,196,196,196,194,196,196,196,194,196,196,196,194,196,196,196,194,196,196,196,194,196,196,196,194,196,196,196,194,196,196,196,191},
     a2[33]={192,196,196,196,193,196,196,196,193,196,196,196,193,196,196,196,193,196,196,196,193,196,196,196,193,196,196,196,193,196,196,196,217},
     a3[33]={179,32,32,32,179,32,32,32,179,32,32,32,179,32,32,32,179,32,32,32,179,32,32,32,179,32,32,32,179,32,32,32,179};
 printf("\n\n\t218=%c  196=%c  194=%c  191=%c  179=%c  195=%c  \n\n\t197=%c  180=%c  192=%c  193=%c  217=%c  219=%c \n\n",218,196,194,191,179,195,197,180,192,193,217,219);
 for (j=0;j<33;j++)
   printf("%c",a0[j]);
 putchar ('\n');
   for (j=0;j<33;j++)
     printf("%c",a3[j]);
 for (i=0;i<7;i++){
   putchar ('\n');
   for (j=0;j<33;j++)
     printf("%c",a1[j]);
   putchar ('\n');
   for (j=0;j<33;j++){
     if (a3[j]==32 && a3[j-1]==32  && a3[j+1]==32 && (i*j==18 || i*j==36)){
       cont++;
       if (cont<=3)
         printf("%c",219);
       else
         printf("%c",32);
     }
     else
       printf("%c",a3[j]);
   }
 }
 putchar ('\n');
 for (j=0;j<33;j++)
   printf("%c",a2[j]);
 return 0;
}


Un fuerte saludo amigo yoel_alejandro, esto es lo realmente bueno, lo que yo llamo el pique sano.

Por cierto, en Windows sin problemas, al menos como yo lo tengo planteado.



¡¡¡¡ Saluditos! ..... !!!!



Yoel Alejandro

#6
Leo, ya se que él dijo tres fichas, pero no se en qué posición deben ir. Por eso dejé a potestad del autor del post poner las fichas en su lugar  :D

Y leosansan coincido contigo en lo bueno de la sana competencia, sin hacer la violencia.

Y disertando contigo sobre el tema, pienso (no se si discrepo contingo) que no hay que ser tan extremista en el uso de lo básico, ¿no has considerado positivo de uso de macros, constantes y ficheros de cabecera? Hará tu programa más flexible y configurable, además tendrá la fácil posibilidad de ampliarse o modificarse. Los proyectos profesionales hacen uso de este recurso, por ejemplo los nombres que usé los tomé del fichero de cabecera de la biblioteca ncurses, y supongo que lo mismo ocurre con conio.

No me gusta ser "talibán" o extremista [lo fui cuando era más joven, y creo que fue un error  :-(]. Por ejemplo hay programadores de C que son "linuxeros" exclusivos y hacen sus programas dependientes de Linux, discriminando a los usuarios Windows. Otros lo mismo pero al revés. Aunque yo prefiero Linux, trato de hacer mis programas de C de modo que sean compatibles en ambos sistemas, soy consciente de que el 90% o más de los usuarios del mundo usan Microsoft y eso hay que respetarlo.

No los hago compatible también para Apple porque no la conozco, no tengo Mac (es muy caro en mi país, jeje  :laugh:)

Y para cerrar, aunque no es el motivo de este foro, cuento que mi país (Venezuela) está tomado actualmente por la violencia, pido a todos hagan el deseo de que esto cese, y retornen la Justicia y la Libertad a mi tierra. España pasó por Franco, Chile por Pinochet, ... etc, todos los ciudadanos hispanos han padecido el totalitarismo (de derecha o de izquierda, que al fin resulta lo mismo) y deberían poder comprender mis palabras ...
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

eferion

Solo un detalle tonto yoel_alejandro. Se te olvidó liberar la memoria.

Se que el programa al finalizar la va a liberar por sí mismo... pero no hay que perder las buenas costumbres :D

leosansan

#8
Cita de: yoel_alejandro en  6 Marzo 2014, 15:33 PM
...........................................................................
Y disertando contigo sobre el tema, pienso (no se si discrepo contigo) que no hay que ser tan extremista en el uso de lo básico, ¿no has considerado positivo de uso de macros, constantes y ficheros de cabecera? Hará tu programa más flexible y configurable, además tendrá la fácil posibilidad de ampliarse o modificarse. Los proyectos profesionales hacen uso de este recurso, por ejemplo los nombres que usé los tomé del fichero de cabecera de la biblioteca ncurses, y supongo que lo mismo ocurre con conio.
.................................................

Sí que lo considero positivo pero no es plan de hacer todo tan "clarito" para alguien que no postea nada de nada de código. En estos casos ofusco un poquitito la respuesta.

Y para que veas que de talibán nada de nada, ahí recojo tu guante:


Código (cpp) [Seleccionar]

/**
a0=linea superior
a1=lineas intermedias
a2=linea inferior
a3=lineas laterales
**/

#include <stdio.h>
#include <stdlib.h>

#define ULCORNER 218,196,196,196    /* upper-left corner, esquina superior izquierda y tres guiones*/
#define RTEE     195,196,196,196    /*right-tee, letra 'T' apuntando hacia la derecha y tres guiones*/
#define CROSS    197,196,196,196    /* crossover, cruz grande (de mayor tamaño que el signo '+' y tres guiones) */
#define LTEE     180                /* left-tee, letra 'T' apuntando hacia la izquierda */
#define BTEE     194,196,196,196    /* bottom-tee, letra 'T' apuntando hacia abajo y tres guiones*/
#define URCORNER 191                /* upper-right corner, esquina superior derecha */
#define LLCORNER 192,196,196,196    /* lower-left corner, esquina inferior izquierda y tres guiones */
#define TTEE     193,196,196,196    /* top-tee, letra 'T' apuntando hacia arriba y tres guiones */
#define LRCORNER 217                /* lower-right corner, esquina inferior izquierda */
#define VLINE    179,32,32,32       /*vertical line, linea vertical y tres espacios*/
#define VLINE_   179                /* vertical line, linea vertical */
#define TOKEN    219                /* ficha o pieza */

int main()
{
 int i,j,cont=0;
 int a1[33]={RTEE,CROSS,CROSS,CROSS,CROSS,CROSS,CROSS,CROSS,LTEE},
     a0[33]={ULCORNER,BTEE,BTEE,BTEE,BTEE,BTEE,BTEE,BTEE,URCORNER},
     a2[33]={LLCORNER,TTEE,TTEE,TTEE,TTEE,TTEE,TTEE,TTEE,LRCORNER},
     a3[33]={VLINE,VLINE,VLINE,VLINE,VLINE,VLINE,VLINE,VLINE,VLINE_};
 for (j=0;j<33;j++)
   printf("%c",a0[j]);
 putchar ('\n');
   for (j=0;j<33;j++)
     printf("%c",a3[j]);
 for (i=0;i<7;i++){
   putchar ('\n');
   for (j=0;j<33;j++)
     printf("%c",a1[j]);
   putchar ('\n');
   for (j=0;j<33;j++){
     if (a3[j]==32 && a3[j-1]==32  && a3[j+1]==32 && (i*j==18 || i*j==36 || i*j==12)){
       cont++;
       if (cont<=3)
         printf("%c",TOKEN);
       else
         printf("%c",32);
     }
     else
       printf("%c",a3[j]);
   }
 }
 putchar ('\n');
 for (j=0;j<33;j++)
   printf("%c",a2[j]);
 return 0;
}


Un fuerte abrazo y .... estamos contigo muy cerquita, por algo aquí en Canarias conocemos a Venezuela como la octava isla.


¡¡¡¡ Saluditos! ..... !!!!



Yoel Alejandro

Interesante la simplificación de leosansan, ventajas del trabajo en equipo. Te cuento que soy de Guayana, en el sur de Venezuela, y aquí consideramos como prócer a Manuel Carlos Piar, de quién se dice era hijo de Canarios (y Bolívar desarrolló una infame envidia y rivalidad contra él, mandándolo a fusilar). Piar fue un formidable oficial que combió técnicas de estrategia, en oposición a la lucha de burda de carnicería acostumbrada por entonces, y así llegó invicto en el campo de batalla hasta el final de sus días.

Eferion, gracias, realmente había olvidado liberar la memoria (sorry).

Ahora otra vez leo, me parece interesante tu simplificación del código, pero explícamente la aritmética usada de 12, 18, 36, etc ..... No entiendo esas fórmulas, y creo que también hubiera sido bueno comentariar esa explicación en el programa, los demás no somos adivinos jejejeje (broma)
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)