tableros

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

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

leosansan

#20
Cita de: amchacon en 14 Marzo 2014, 01:03 AM
La eficiencia es buena, como mucho se puede mejorar creandote un vector fila y ir imprimiendo filas del tirón.

Aparte de eso. El código podría ser más claro. Y sobre todo más genérico (para cualquier tamaño del tablero).

Ah, y los pegotes se puede resolver pintandolos al reves (primero el pegote y despues el cuadrado).


Estimado amigo Maikel Angelo creo que he logrado lo que pedias, ya sabes que tus deseos son como órdenes para mi: eficiente, clarito, genérico y sin pegotes .... y además "cortito", como me gustan a mi los códigos.

He aquí unas salidas de muestra:








Código (cpp) [Seleccionar]

/*****************************/
/*

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


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

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

*/
/*****************************/
#include <stdio.h>

int main()
{
 int i,j,dim,dim_plus;
 printf("\nDimensi\xA2n del Tablero: ");
 fflush (stdout);
 scanf("%d",&dim);
 printf ("\n\n");
 dim_plus=dim*4+1;
 int a0[dim_plus],a1[dim_plus],a2[dim_plus],a3[dim_plus];
 /** linea superior **/
 for (j=0;j<dim_plus;j++){
   if (j==0 )
     a0[j]=218;
   else if (j==dim_plus-1)
     a0[j]=191;
   else if ((j)%4==0 && j<dim_plus-1)
     a0[j]=194;
   else
     a0[j]=196;
 }
 /** linea inferior **/
 for (j=0;j<dim_plus;j++){
   if (j==0 )
     a2[j]=192;
   else if (j==dim_plus-1)
     a2[j]=217;
   else if ((j)%4==0 && j<dim_plus-1)
     a2[j]=193;
   else
     a2[j]=196;
 }
 /** salto de linea...  **/
 /** y dibujo intermedias y laterales  **/
 for (j=0;j<dim_plus;j++){
   if (j==0 )
     a1[j]=195;
   else if (j==dim_plus-1)
     a1[j]=180;
   else if ((j)%4==0 && j<dim_plus-1)
     a1[j]=197;
   else
     a1[j]=196;
 }
 /** linea lateral **/
 for (j=0;j<dim_plus;j++){
   if (j==0 )
     a3[j]=179;
   else if (j==dim_plus-1)
     a3[j]=179;
   else if ((j)%4==0 && j<dim_plus-1)
     a3[j]=179;
   else
     a3[j]=219;
 }
  /** imprimimos **/
 for (j=0;j<dim_plus;j++)
   printf("%c",a0[j]);
 putchar ('\n');
 for (j=0;j<dim_plus;j++)
   printf("%c",a3[j]);
 for (i=0;i<dim-1;i++){
   putchar ('\n');
   for (j=0;j<dim_plus;j++)
     printf("%c",a1[j]);
   putchar ('\n');
   for (j=0;j<dim_plus;j++)
     printf("%c",a3[j]);
 }
 putchar ('\n');
 for (j=0;j<dim_plus;j++)
   printf("%c",a2[j]);
 return 0;
}


Dejo en el comienzo del código las equivalencias entre números y símbolos del tablero al que ya sólo me queda ponerle algo de colorido. Pero como bien sabes, eso no es problema para mi. Por cierto, en la página web salen símbolos raros para las equivalencias entre números y símbolos pero si le dan a citar pueden copiar desde ahí el código correctamente.

Y al amig@ JonaLamper disculparme por no revisarle el código, sencillamente me pareció más fácil hacerlo nuevo.


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




amchacon

#21
Que artista estas hecho Leo.

Sin embargo:

Código (cpp) [Seleccionar]
for (j=0;j<dim_plus;j++)
  printf("%c",a0[j]);
putchar ('\n');
for (j=0;j<dim_plus;j++)
  printf("%c",a3[j]);
for (i=0;i<dim-1;i++){
  putchar ('\n');
  for (j=0;j<dim_plus;j++)
    printf("%c",a1[j]);
  putchar ('\n');
  for (j=0;j<dim_plus;j++)
    printf("%c",a3[j]);
}
putchar ('\n');
for (j=0;j<dim_plus;j++)
  printf("%c",a2[j]);


Es mejor que declares los vectores como array de chars y le metas un nulo al final. De ese modo:

Código (cpp) [Seleccionar]
printf("%s\n%s",a0,a3);
for (i=0;i<dim-1;i++){
  putchar ('\n');
  printf(a1);
  putchar ('\n');
  printf(a3);
}
putchar ('\n');
printf(a2);


Más compacto y nos ahorramos llamadas a printf (lo que tarda no es el printf en sí, sino llamar al sistema para escribir en la pantalla). Si siguieramos rascando podríamos meter la figura entera en un solo vector y lanzarlo del tiron:
Código (cpp) [Seleccionar]
printf(figura);

Una ventaja de estas técnicas esque no tenemos que ceñirnos a dibujar la figura de arriba a abajo. Podemos generarla en el orden que queramos y después imprimirla.

Aunque es una ventaja relativa, ya que el enfoque arriba-abajo es bastante claro y intuitivo.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan


La idea es buena pero ..... sólo me serviría para las líneas superior e inferior ya que las intermedias las tengo que procesar como caracteres para el tema del color.

¿Encuentras tu bandera?.




He modificado el código para que , además del color, se ajuste el tamaño de la consola al dibujo:



Código (cpp) [Seleccionar]

/*****************************/

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

int main()
{
  srand((unsigned) time(NULL));
  int i,j,dim,dim_plus;
  char tamanyo_consola[80];
  printf("\nDimensi\xA2n del Tablero: ");
  fflush (stdout);
  scanf("%d",&dim);
  printf ("\n\n");
  dim_plus=dim*4+1;
  int a0[dim_plus],a1[dim_plus],a2[dim_plus],a3[dim_plus];
  /** linea superior **/
  for (j=0;j<dim_plus;j++){
    if (j==0 )
      a0[j]=218;
    else if (j==dim_plus-1)
      a0[j]=191;
    else if ((j)%4==0 && j<dim_plus-1)
      a0[j]=194;
    else
      a0[j]=196;
  }
  /** linea inferior **/
  for (j=0;j<dim_plus;j++){
    if (j==0 )
      a2[j]=192;
    else if (j==dim_plus-1)
      a2[j]=217;
    else if ((j)%4==0 && j<dim_plus-1)
      a2[j]=193;
    else
      a2[j]=196;
  }
  /** salto de linea...  **/
  /** y dibujo intermedias y laterales  **/
  for (j=0;j<dim_plus;j++){
    if (j==0)
      a1[j]=195;
    else if (j==dim_plus-1)
      a1[j]=180;
    else if ((j)%4==0 && j<dim_plus-1)
      a1[j]=197;
    else
      a1[j]=196;
  }
  /** linea lateral **/
  for (j=0;j<dim_plus;j++){
    if (j==0 )
      a3[j]=179;
    else if (j==dim_plus-1)
      a3[j]=179;
    else if ((j)%4==0 && j<dim_plus-1)
      a3[j]=179;
    else
      a3[j]=219;
  }
  /** imprimimos **/
  sprintf(tamanyo_consola, "MODE %d,%d", dim_plus+1,2*dim+1);
  system(tamanyo_consola);
         /** linea superior **/
  for (j=0;j<dim_plus;j++){
    color (6);
    printf("%c",a0[j]);
  }

  putchar ('\n');
  for (j=0;j<dim_plus;j++){
      if ((a3[j]==219) ){
        color (80+rand() % (249-80));
        printf("%c",32);
      }
      else{
        color (6);
        printf("%c",a3[j]);
      }
    }

  /** salto de linea...  **/
  /** y dibujo intermedias y laterales  **/
  for (i=0;i<dim-1;i++){
    putchar ('\n');
    for (j=0;j<dim_plus;j++){
      color (6);
      printf("%c",a1[j]);
      color (7);
    }
    putchar ('\n');
    /** linea lateral **/
    for (j=0;j<dim_plus;j++){
      if ((a3[j]==219) ){
        color (80+rand() % (249-80));
        printf("%c",32);
        color (7);
      }
      else{
        color (6);
        printf("%c",a3[j]);
      }
    }

    }
  putchar ('\n');
   /** linea inferior **/
   for (j=0;j<dim_plus;j++){
    color (6);
    printf("%c",a2[j]);
  }
  system ("pause>null");
  return 0;
}
 
void color (int n)
{
        SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
}


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



JonaLamper

No era necesario para cualquier tamaño, sólo necesitaba de 8x8  ;D volviendo a una pregunta que surgió por ahí: ¿cómo hago el primer bloque de tres fichas se almacene en la posición array[0][0], el segundo bloque en la posición array[0][1], etc? ¿Debería guardar un string que contenga tres char(219)? La verdad es que veo que esto no es difícil, pero no logro tener las ideas claras. Disculpadme.
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

Yoel Alejandro

Ya se volvieron unos artistas  :o  :o  :o !!! Mis respetos.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

Cita de: JonaLamper en 18 Marzo 2014, 00:21 AM
No era necesario para cualquier tamaño, sólo necesitaba de 8x8  ;D volviendo a una pregunta que surgió por ahí: ¿cómo hago el primer bloque de tres fichas se almacene en la posición array[0][0], el segundo bloque en la posición array[0][1], etc? ¿Debería guardar un string que contenga tres char(219)? La verdad es que veo que esto no es difícil, pero no logro tener las ideas claras. Disculpadme.

Mira que te lo dije: pon el enunciado exacto. El no hacerlo nos lleva a nosotros a tener que especular y, la verdad, tenemos poco de adivinos y lo único que consigues es  hacernos perder el tiempo en elucubraciones psico-mentales inútiles que acaban cabreando al más pintado.

Es la última hasta que aclares lo del enunciado:


Citar

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

■  ■  ■  ■  ■  ■  ■  ■
■  ■  ■  ■  ■  ■  ■  ■
■  ■  ■  ■  ■  ■  ■  ■
■  ■  ■  ■  ■  ■  ■  ■
■  ■  ■  ■  ■  ■  ■  ■
■  ■  ■  ■  ■  ■  ■  ■
■  ■  ■  ■  ■  ■  ■  ■
■  ■  ■  ■  ■  ■  ■  ■

Código (cpp) [Seleccionar]

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

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

#define CUADRADITOS 179,219,179,219,179,219
#define CUADRADITOS1 "\xdb "
#define CUADRADITOS2 "\xfe "
#define ULCORNER 218,196,196,196,196,196    /* upper-left corner, esquina superior izquierda y tres guiones*/
#define RTEE     195,196,196,196,196,196   /*right-tee, letra 'T' apuntando hacia la derecha y tres guiones*/
#define CROSS    197,196,196,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,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,196,196   /* lower-left corner, esquina inferior izquierda y tres guiones */
#define TTEE     193,196,196,196,196,196    /* top-tee, letra 'T' apuntando hacia arriba y tres guiones */
#define LRCORNER 217                /* lower-right corner, esquina inferior izquierda */
#define VLINE    CUADRADITOS      /*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,tam;
  char a[]="\xfe ";
  char b[8][8][6];

/******* AQUI MATRIZ CUADRADITOS=254=xfe 8X8 *******/
/** SOLO CUADRADITOS SIN LINEAS INTERMEDIAS **/

  for (i=0;i<8;i++)
    for (j=0;j<8;j++)
      strcpy( b[i][j], a );

  for (i=0;i<8;i++){
    for (j=0;j<8;j++){
      printf("%s ",b[i][j]);
    }
    putchar ('\n');
  }
  int a1[]={RTEE,CROSS,CROSS,CROSS,CROSS,CROSS,CROSS,CROSS,LTEE},
      a0[]={ULCORNER,BTEE,BTEE,BTEE,BTEE,BTEE,BTEE,BTEE,URCORNER},
      a2[]={LLCORNER,TTEE,TTEE,TTEE,TTEE,TTEE,TTEE,TTEE,LRCORNER},
      a3[]={CUADRADITOS,CUADRADITOS,CUADRADITOS,CUADRADITOS,CUADRADITOS,CUADRADITOS,CUADRADITOS,CUADRADITOS,CUADRADITOS};
  tam=sizeof (a1)/sizeof (a1[0]);
  /** linea superior **/
  for (j=0;j<tam;j++)
    printf("%c",a0[j]);
  putchar ('\n');
  /** linea lateral **/
  for (j=0;j<tam;j++)
    printf("%c",a3[j]);
  /** salto de linea...  **/
  /** y dibujo intermedias y laterales  **/
  for (i=0;i<7;i++){
    putchar ('\n');
    for (j=0;j<tam;j++)
        printf("%c",a1[j]);
      putchar ('\n');
      for (j=0;j<tam;j++)
          printf("%c",a3[j]);
  }
  /** linea inferior **/
  putchar ('\n');
  for (j=0;j<tam;j++)
    printf("%c",a2[j]);
  putchar ('\n');

/******* AQUI MATRIZ SOLA DE CUADRADITOS=219=xdb 8X8 *******/

  for (i=0;i<8;i++){
    for (j=0;j<8;j++){
      printf("%s ",CUADRADITOS1);
    }
    putchar ('\n');
  }
  putchar ('\n');

/******* AQUI UNA MATRIZ SOLA DE CUADRADITOS=254=xfe 8X8 *******/

  for (i=0;i<8;i++){
    for (j=0;j<8;j++){
      printf("%s ",CUADRADITOS2);
    }
    putchar ('\n');
  }
  putchar ('\n');

  return 0;
}


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



JonaLamper

Lo siento leo. No quería ponerte el enunciado porque... bueno, sé que aquí todos estamos para ayudarnos, pero no querría coger una cosa hecha por ti y copiarla sin más, por eso solo te pregunté cosas exactas, problemas con los que me iba encontrando a medida que iba avanzando en el ejercicio, pero claro, tú no sabías exactamente a qué me refería al no tener el enunciado.

Esta noche lo pongo. Y si no es mucha molestia, cuando lo leas, no pretendo hagas un código y me lo enseñes, preferiría que me lo explicarás o que me dijeras cómo lo harías tú, pero ante todo, no hacerlo.

Gracias y disculpa una vez más, sé lo que vale el tiempo invertido en ayudar de forma desinteresada a los demás.
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

leosansan


Buuuueno, vale.

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



leosansan

#28
Cita de: JonaLamper en 18 Marzo 2014, 00:21 AM
No era necesario para cualquier tamaño, sólo necesitaba de 8x8  ;D volviendo a una pregunta que surgió por ahí: ¿cómo hago el primer bloque de tres fichas se almacene en la posición array[0][0], el segundo bloque en la posición array[0][1], etc? ¿Debería guardar un string que contenga tres char(219)? La verdad es que veo que esto no es difícil, pero no logro tener las ideas claras. Disculpadme.

Disculpad@ estás y a la espera de que pongas el enunciado, te adelanto una posible solución, en el supuesto de que el problema radique en cómo extraer una matriz de 8x8 a partir de las matrices iniciales, estando esta matriz de 8x8 constituida por cadenas de tres cuadraditos. Aunque otra forma sería obtenerla directamente.

Te explico el proceso:

* la matriz inicial a usar debe ser de 8x8x4, sí, tridimensional. Esto es debido en que para generarla hemos de recorrer, además de las 8 filas y 8 columnas,también  hemos de tener en cuenta que cada elemento almacenado en esa matriz de 8x8 es  de cuatro caracteres .....sí, cuatro, los tres cuadraditos y el caracter nulo. Necesitaremos por lo tanto:

* 1 * un primer for:1->8 para recorrer la matriz en filas.

* 2 * un segundo for:1->8  para recorre la matriz en columnas.

* 3 * un tercer for:1->tam para el for anterior recorrerlo internamente, ya que se compone de los caracteres extremos más los intermedios, tanto cuadraditos como líneas verticales.

Y hemos de quedarnos en este último for con los cuadraditos. ¿Cómo?. Teniendo en cuenta el hecho de cómo se componen las filas LV=línea vertical=179 y de cuadraditos = C=219=\xdb:

    LV     C    LV    C   LV    C   LV    C   LV    C   LV    C   LV    C   .....  
     0      1    2     3    4     5     6    7    8     9    10   11  12   13......
k =          0          1           2          0           1           2          0 .....

Observa que para "pillar" sólo los cuadraditos, que son los números impares, en el último for se empieza desde uno y se avanza con paso 2: i+=2.

Pero además tienes que usar una variable auxiliar k tal que cada tres cuadraditos "pillados", y después de añadirle el caracter nulo, se inicie a cero y se incremente el array.  ES decir empiezas en array[0][0] y una vez que k haya llegado a dos, pasará a valer otra vez cero y empezarás a rellenar el array[0][1] y así sucesivamente.

No te pongo ahora mismo la respuesta porque me has pedido expresamente que tan sólo te lo explicara para tú intentar sacarlo.

Espero que la explicación te encamine hacia la solución.

Por respeto a los seguidores de este tema, que no son pocos, pondré en un día o dos la respuesta.

Ahora te adelanto el código que imprime la matriz, para que veas que es efectivamente de 8x8, y una salida del programa:


Código (cpp) [Seleccionar]
for (i=0;i<8;i++){
   printf("\t\t");
   for (j=0;j<8;j++){
     printf("%s  ",c[i][j]);
   }
   puts ("\n");
 }


Citar

             
 A PARTIR DE LA MATRIZ DE 8X8



               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███



               DE FORMA DIRECTA

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███

               ███  ███  ███  ███  ███  ███  ███  ███



Y para los que estén aburridos y le peguen a la criptografía, aquí pongo el código solución cifrado. He usado un método propio, pero no lo he querido hacer totalmente indescifrable por si se animan ..... pero tranquilos, como comenté próximamente pondré la solución, no es plan de dejar a nadie colgado en este tema:


Citar

Cifrado es:

Æ¿å| æâyiàX¼ÇD¿wD1  lÜ╗ aø`5_}QbM┤^muÄ`;    ê╝x anVåUæG_Hòpp3ñU>      m║© *ÿFrxè
e┐ŪHøYêEz┼]N        sê«┐d,xc▬        ¬ç 9tïkG╬;☼          ö{ìï¡ëë®®ÜCJgöÜu3]Öc│
ïes?6▼          «?àå↕+        Ö♫↓        û¡Åkæ▲)          ⌂Åî®Øo_Ññ½]Zt:CeKA
     skIe_♀        ╣VP      ×E\    è7E  ©?↑H9  æçºtìÉà [üx║OOm ((M  á⌂ú NÅê3T╗c
fiÁnÇyº#4    ¡┐«x|~?[óøêùDvs\↕    ÿ¡║ /àZOKîLlQ£2Xv┤+D      Ö¥┐┐øöK.|©  YSqvóuñü
¼9è]8    Ê(W    üæî╩ A$á|ixoF↓  ø@¶  î╗úvu╗s u3øÅtsé┴Ñ╝í<í♣E


Aunque me temo que el procesador de esta página "baile" algunos símbolos extraños para él.


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




eferion

Cita de: leosansan en 19 Marzo 2014, 10:59 AM
Aunque me temo que el procesador de esta página "baile" algunos símbolos extraños para él.

Conviértelo a base64 y así no habrá problemas con el código cifrado... total, el que quiera descifrarlo únicamente tiene que añadir la decodificación de base 64 antes de ponerse a decodificar en serio.