Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: buscador1 en 24 Diciembre 2017, 12:27 pm



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