Autor
|
Tema: tableros (Leído 18,214 veces)
|
leosansan
Desconectado
Mensajes: 1.314
|
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: /*****************************/ /* 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! ..... !!!!
|
|
« Última modificación: 14 Marzo 2014, 17:26 pm por leosansan »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Que artista estas hecho Leo. Sin embargo: 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: 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: 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.
|
|
« Última modificación: 14 Marzo 2014, 21:25 pm por amchacon »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:  /*****************************/ #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! ..... !!!!
|
|
|
En línea
|
|
|
|
JonaLamper
Desconectado
Mensajes: 394
|
No era necesario para cualquier tamaño, sólo necesitaba de 8x8  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.
|
|
|
En línea
|
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  !!! Mis respetos.
|
|
|
En línea
|
Saludos, Yoel. P.D..- Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
No era necesario para cualquier tamaño, sólo necesitaba de 8x8  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: ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│█│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
/** 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! ..... !!!!
|
|
|
En línea
|
|
|
|
JonaLamper
Desconectado
Mensajes: 394
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.314
|
Buuuueno, vale.¡¡¡¡ Saluditos! ..... !!!!
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
No era necesario para cualquier tamaño, sólo necesitaba de 8x8 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:for (i=0;i<8;i++){ printf("\t\t"); for (j=0;j<8;j++){ printf("%s ",c[i][j]); } puts ("\n"); }
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:
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! ..... !!!!
|
|
« Última modificación: 20 Marzo 2014, 11:37 am por leosansan »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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.
|
|
|
En línea
|
|
|
|
|
|