problema de recursividad cn mi buscaminas en c.

revival84
31 de Mayo del 2006
Estoy implementando el buscaminas en c y he conseguido que me oculte las minas. y me diga el numero de minas vecinas q tiene y cuando da en una mina que se desoculten y muestre la pantalla. pero me falta el gran problema de este juego. que es si pulsas una casilla en blanco se vayan abriendo las demas y te muestre el numero de casillas vecinas a las minas. Se que se soluciona con recursividad pero no consiguo ver de que forma. aki pongo mi codigo y haber si me podeis exar una mano. muchas gracias y espero respuestas.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#define CASILLAS 6
#define MINA \'\'
#define VACIO \'*\'

void inicializarmatriz(char *matriz, int longitud)
{
int i,j;
for(i=0;i<longitud;i++)
for(j=0;j<longitud;j++)
*(matriz+(i*longitud)+j)=\'*\';
}

void pintarpantalla(char *matriz, int longitud)
{
int i,j;
printf("\n 0 1 2 3 4 5");
for(i=0;i<longitud;i++)
{
printf("\n%d ",i);
for(j=0;j<longitud;j++)
printf("%c ",(*(matriz+(i*longitud)+j)) );
}
}

void ponerminas(int *vecinas, int longitud) //funcion que pone las minas aleatoriamente.
{
int i,j,mina_i,mina_j;
for(i=0;i<longitud;i++)
for(j=0;j<longitud;j++)
*(vecinas+(i*longitud)+j)=0;
i=0;
while(i<longitud-1) // siempre te saldran una quinta parte minas.
{
mina_i=rand()%longitud;
mina_j=rand()%longitud;
if(*(vecinas+(mina_i*longitud)+mina_j)==0)
{
*(vecinas+(mina_i*longitud)+mina_j)=9; //el numero 9 es una mina.
i++;
}
}
}

int haymina(int *vecinas, int longitud, int pos_x, int pos_y)
{
if(pos_x<0 || pos_y<0 || pos_x==longitud || pos_y==longitud)
return 0;
else if(*(vecinas+(pos_x*longitud)+pos_y)==9)
return 1;
else
return 0;
}
void descubreminas(int *vecinas, char *matriz, int longitud)
{
int i,j;
for(i=0;i<longitud;i++) //DESCUBRE LAS MINAS.
for(j=0;j<longitud;j++)
if(*(vecinas+(i*longitud)+j)==9)
*(matriz+(i*longitud)+j)=\'\';
}

int main()
{
char matriz[CASILLAS][CASILLAS]; //DECLARAMOS UNA MATRIZ QUE EN PRINCIPIO TENDRA SUS CASILLAS IGUALADAS A CERO.
int vecinas[CASILLAS][CASILLAS]={0};
int i,j;
srand(rawclock()); // inicializamos la semilla.
clrscr();

inicializarmatriz(matriz,CASILLAS); //RELLENA LA MATRIZ DE "*".
ponerminas(vecinas,CASILLAS); //COLOCA LAS MINAS ALEATORIAMENTE. SON EL 9.
pintarpantalla(matriz,CASILLAS); //PINTA LA PANTALLA.

do
{
printf("\nINTRODUCE LA FILA: ");
scanf("%d",&i);
printf("\nINTRODUCE LA COLUMNA: "); //INTRODUCIMOS LAS COORDENADAS.
scanf("%d",&j);

clrscr(); //BORRAMOS LA PANTALLA.
//CONTAMOS EL N§ DE MINAS VECINA Q TIENE LA CASILLA ELEGIDA.
if(vecinas[i][j]==9) //MUESTRA UN MENSAJE DE ERROR EN CASO DE ENCONTRAR LA MINA.
printf("\nTE HA EXPLOTADO UNA MINA.");
else
{
//CONTAMOS EL N§ DE VECINOS Q TIENE ESA CASILLA.
vecinas[i][j]=haymina(vecinas,CASILLAS,i-1,j-1)+haymina(vecinas,CASILLAS,i,j-1)+haymina(vecinas,CASILLAS,i+1,j-1)+haymina(vecinas,CASILLAS,i-1,j)+haymina(vecinas,CASILLAS,i+1,j)+haymina(vecinas,CASILLAS,i-1,j+1)+haymina(vecinas,CASILLAS,i,j+1)+haymina(vecinas,CASILLAS,i+1,j+1);
matriz[i][j]=vecinas[i][j]+\'0\'; //PINTAMOS EN MATRIZ EL NUMERO DE VECINOS DE ESA CASILLA.

pintarpantalla(matriz,CASILLAS); //VOLVEMOS A PINTAR LA PANTALLA.
getch();
}
}while(vecinas[i][j]!=9);

descubreminas(vecinas,matriz,CASILLAS); //AL SALIR DEL JUEGO CAMBIA LOS ASTERICOS POR MINAS.
pintarpantalla(matriz,CASILLAS); //VISUALIZA LA MATRIZ.

getch();
return 0;
}