Título: Problemas con los colores. Buscaminas. Publicado por: buscador1 en 24 Diciembre 2017, 12:27 pm Hola a todos,
estoy haciendo el juego del buscaminas y no se como hacer para que cuando se destapen las bombas (*) salgan en color rojo. Utilizamos el fichero colores.h y colores.c extraídos de la siguientes páginas: http://stackoverflow.com/questions/3219 ... utput-in-c http://ascii-table.com/ansi-escape-sequences.php Os dejo el fichero del tablero. Muchas gracias. // #include "tablero.h" #include "azar.h" #include "tiempo.h" #include <stdio.h> #include "casilla.h" void inicializar_tablero(ttablero *t) { int i,j,opc,max_bombas; printf("Menu:\n"); printf("1) Tablero 8x8 10 minas\n"); printf("2) Tablero 16x16 40 minas\n"); printf("3) Tablero 16x30 99 minas\n"); printf("4) Tablero personalizado\n"); printf("Que opcion eliges? [1-4]:\n"); scanf("%d", &opc); while(opc<1||opc>4) { printf("No ha introducido una opcion valida, vuelva a intentarlo"); scanf("%d",&opc); } switch(opc) { case 1: t->fil = 8; t->col = 8; t->nbombas=10; for(i=0;i<t->fil;i++) { for(j=0;j<t->col;j++) { t->c[j].valor=0; t->c[j].estado='x'; } }colocar_bombas(&*t); break; case 2: t->fil = 16; t->col = 16; t->nbombas=40; for(i=0;i<t->fil;i++) { for(j=0;j<t->col;j++) { t->c[j].valor=0; t->c[j].estado='x'; } }colocar_bombas(&*t); break; case 3: t->fil = 16; t->col = 30; t->nbombas=99; for(i=0;i<t->fil;i++) { for(j=0;j<t->col;j++) { t->c[j].valor=0; t->c[j].estado='x'; } }colocar_bombas(&*t); break; case 4: printf("Filas? [4-36]\n"); scanf("%d%*c", &(t->fil)); if(t->fil<4||t->fil>36) { while(t->fil<4||t->fil>36) { printf("Filas? [4-36]\n"); scanf("%d%*c", &(t->fil)); } } printf("Columnas? [4-36]\n"); scanf("%d%*c", &(t->col)); if(t->col<4||t->col>36) { while(t->col<4||t->col>36) { printf("Columnas? [4-36]\n"); scanf("%d%*c", &(t->fil)); } } max_bombas=(t->fil)*(t->col)-9; printf("Bombas? [4-%d]\n",max_bombas); scanf("%d%*c", &(t->nbombas)); printf("\n"); if(t->nbombas<4||t->nbombas>36) { while(t->nbombas<4||t->nbombas>36) { printf("Bombas? [4-%d]\n",max_bombas); scanf("%d%*c", &(t->nbombas)); }printf("\n"); } else{ for(i=0;i<t->fil;i++) { for(j=0;j<t->col;j++) { t->c[j].valor=0; t->c[j].estado='x'; } }colocar_bombas(&*t); } break; default: printf("Vuelva a elegir una opcion"); } } void colocar_bombas (ttablero *t) { inicializar_azar(); int b=0; int bombas,i,j,f,c; while(b<t->nbombas) { f=numero_al_azar(t->fil); c=numero_al_azar(t->col); if(t->c[f][c].valor!=-1){//valor bomba -1 t->c[f][c].valor=-1; b++;} } for(i=0;i<t->fil;i++)//MINAS CIRCUNDANTES en las 8 posiciones que rodean la casilla (-10 10 0-1 01 -11 -1-1 11 1-1) { for(j=0;j<t->col;j++) { if(t->c[i-1][j].valor == -1) bombas++; if(t->c[i+ 1][j].valor == -1) bombas++; if(t->c[j - 1].valor == -1) bombas++; if(t->c[j + 1].valor == -1) bombas++; if(t->c[i - 1][j + 1].valor == -1) bombas++; if(t->c[i - 1][j - 1].valor == -1) bombas++; if(t->c[i + 1][j + 1].valor == -1) bombas++; if(t->c[j + 1][j - 1].valor == -1) bombas++; } } t->c[j].valor=bombas; } void mostrar_tablero(ttablero t){ char i,j; printf(" |"); for(i=0;i<t.col;i++) { if(i>9){ printf("%c|",i+55);} else{printf("%d|",i);} }printf("\n"); for(i=0;i<t.fil;i++) { if(i>9){ printf("%c|",i+55);} else{printf("%d|",i);} for(j=0;j<t.col;j++) { mostrar_casilla(t.c[j]); } printf("\n"); }printf("\n"); } void jugar(ttablero *t) { char estado_nuevo; int i, j, fila, columna,f,c,cont,levantadas; cont=0;levantadas=0; do{ //añadir tiempo y casillas marcadas printf("Acciones: '!' marcar, '?' marcar como dudosa, 'x' desmarcar, ' ' levantar.\n"); printf("Introduce jugada [fca] (fila, columna, accion [!?x ]):"); scanf("%d,%d,%c%*c",&fila,&columna,&estado_nuevo); if(estado_nuevo==t->c[fila][columna].estado) { printf("Posicion ya seleccionada, vuelva a intentarlo\n"); printf(" [00:00] MARCADAS: %d/%d\n", cont,t->nbombas); mostrar_tablero(*t); } else if(estado_nuevo == '!') { t->c[fila][columna].estado ='!'; //Marca de bomba cont=cont+1; printf(" [00:00] MARCADAS: %d/%d\n", cont,t->nbombas); mostrar_tablero(*t); } else if(estado_nuevo=='?') { t->c[fila][columna].estado='?'; //Duda printf(" [00:00] MARCADAS: %d/%d\n", cont,t->nbombas); mostrar_tablero(*t); } else if(estado_nuevo=='x') { t->c[fila][columna].estado='x'; //desmarcar vuelve al estado de tapado cont=cont-1; printf(" [00:00] MARCADAS: %d/%d\n", cont,t->nbombas); mostrar_tablero(*t); } else if(estado_nuevo==' '&&t->c[fila][columna].valor==-1)//si la posición elegida es una bomba y la accion es levantar, entonces todas las casillas que contengan una bomba aparecen visibles y la partida termina { t->c[fila][columna].estado='*'; //Esta debe estar en otro color. for (i=0;i<t->fil;i++) { for(j=0;j<t->col;j++) { if(t->c[j].valor==-1) { t->c[j].estado='*'; } } } printf(" [00:00] MARCADAS: %d/%d\n", cont,t->nbombas); mostrar_tablero(*t); printf(" GAAAAMEEE OOOOOVEEER!!\n"); } else if(estado_nuevo==' ') { // Jugada normal cuando se destapa una casilla sin bomba y que no haya sido destapada previamente. //usar codigo parecido a minas_circundantes, en caso de que la casilla tenga un valor diferente a -1, destapar, es decir, mostrar su valor. expandir(&*t,i,j,levantadas); mostrar_tablero(*t); } }while(t->nbombas!=t->fil*t->col-(cont+levantadas)); //SI SALE DEL WHILE VICTORIA. Arriba |