PDA

Visualizza la versione completa : [C] aiuto con prato fiorito?


glukosio
23-09-2013, 16:41
Ciao di nuovo, sto realizzando un prato fiorito per svago, su windows, e praticamente quasi finito ma mancano alcuni accorgimenti. adesso mi sto scervellando sulle caselle che non hanno nessuna bomba accanto, in pratica se si clicca su una casella con lo zero dovrebbero aprirsi tutte le caselle adiacenti fino a che non si incontra una casella con un numero diverso da zero (in tutte le direzioni), solo che non riesco a inventarmi un modo per farlo.. si potrebbe fare con una funzione ricorsiva ma nemmeno l mi viene in mente qualche modo per realizzarla :dh: :dh: :dh:
Ecco qua il codice, (diviso in due parti per comodit personale), spero che sia abbastanza comprensibile, :D

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio3.h>
#include"headersPF.h"
int printM(int M[16][16], int stato);
int move(int M[16][16]);
int a=0,b=0;
int P[16][16]={0};
int main(void)
{
srand(time(NULL));
int M[16][16]={0};
randomize(M);
complete(M);
printM(M,0);
while(move(M)!=1);
return 0;
}
int printM(int M[16][16], int stato)
{
clrscr();
int i,j,q=0;
for(i=0;i<16;i++){
for(j=0;j<16;j++){
if(i==a&&j==b){
if(stato==1){
/*if(M[i][j]==0){
???????
}*/
M[i][j]!=9 ? printf("%d ",M[i][j]) : printf("%c%c",254,254);
if(M[i][j]==9) q=1;
P[i][j]=1;
}
else printf("%c%c",219, 219);
}
else if(P[i][j]!=1) printf("%c%c",178,178);
else if(P[i][j]==1){
colors(M[i][j]);
printf("%d ",M[i][j]);
setcolor(WHITE,BLACK);
}
}
printf("\n");
}
if(q==1) return 1;
else return 0;
}
int move(int M[16][16])
{
int stato=0;
if (getch() == 32) stato=1;
else{
switch (getch()) {
case 72: a--;
break;
case 75: b--;
break;
case 77: b++;
break;
case 80: a++;
break;
}
}
if(printM(M, stato)==1){
addio();
return 1;
}
else return 0;
}

void randomize(int M[16][16])
{
int i,j,k;
for(k=0;k<40;k++){
i=rand()%16;
j=rand()%16;
M[i][j]!=9 ? M[i][j]=9 : k--;
}
}
void complete(int M[16][16])
{
int i,j;
for(i=0;i<16;i++){
for(j=0;j<16;j++){
if(M[i][j]!=9) M[i][j]=count(M,i,j);
}
}
}
int count(int M[16][16], int i, int j)
{
int c=0;
if(i!=0 && j!=0 && M[i-1][j-1]==9) c++;
if(i!=0 && M[i-1][j]==9) c++;
if(i!=0 && j!=15 && M[i-1][j+1]==9) c++;
if(j!=0 && M[i][j-1]==9) c++;
if(j!=15 && M[i][j+1]==9) c++;
if(i!=15 && j!=0 && M[i+1][j-1]==9) c++;
if(i!=15 && M[i+1][j]==9) c++;
if(i!=15 && j!=15 && M[i+1][j+1]==9) c++;
return c;
}
void colors(int i)
{
switch(i){
case 0: setcolor(BLACK,WHITE);
break;
case 1: setcolor(LIGHTBLUE,BLACK);
break;
case 2: setcolor(LIGHTGREEN,BLACK);
break;
case 3: setcolor(MAGENTA,BLACK);
break;
case 4: setcolor(YELLOW,BLACK);
break;
case 5: setcolor(PINK,BLACK);
break;
case 6: setcolor(PINK,BLACK);
break;
case 7: setcolor(PINK,BLACK);
break;
case 8: setcolor(PINK,BLACK);
break;
case 9: setcolor(LIGHTGREEN,LIGHTRED);
break;
default: setcolor(WHITE,BLACK);
break;
}
}
void addio()
{
printf("\n\nHAI PERSO!\n\n");
}
Grazie molte a chi mi da qualche consiglio :bh:

P.S.: conio3.h una libreria esterna a tutto, scaricata dal web e modificata un po per farla funzionare, se serve incollo anche quella

glukosio
24-09-2013, 14:36
Ho trovato una soluzione: un algoritmo ricorsivo che controlla tutte le caselle attorno allo zero e a sua volta di nuovo e avanti cos finch non trova un numero!

void zero(int M[16][16],int i, int j)
{
if(M[i][j]!=0){
P[i][j]=1;
}
else if(M[i][j]==0){
P[i][j]=1;
if(j!=0&&P[i][j-1]==0) zero(M,i,j-1);
if(i!=0&&j!=0&&P[i-1][j-1]==0) zero(M,i-1,j-1);
if(i!=0&&P[i-1][j]==0) zero(M,i-1,j);
if(i!=0&&j!=15&&P[i-1][j+1]==0) zero(M,i-1,j+1);
if(j!=15&&P[i][j+1]==0) zero(M,i,j+1);
if(i!=15&&j!=15&&P[i+1][j+1]==0) zero(M,i+1,j+1);
if(i!=15&&P[i+1][j]==0) zero(M,i+1,j);
if(i!=15&&j!=0&&P[i+1][j-1]==0) zero(M,i+1,j-1);
}
}

Loading