Mam pewien problem z ktorym mecze sie juz dosyc dlugo i niestety za nic nie potrafie nic ciekawego wymyslec.
Sprawa jest taka:
Pisze sobie sapera i wszystko juz dziala oprocz odslaniania pol gy gracz nacisnie wolne pole na ktorym nie ma ani zadnych bomb ani nawet liczby i iloscia bomb dookola. W saperze Windowsa w tym momencie tak ladnie pola sie odslaniaja az do najblizszych pol z liczbami (mozna sprawdzic ustawiajac w saperze maksymalny rozmiar i minimalna ilosc bomb).
Napisalem taka rekurencyjna funkcje (chociaz to nie jest moja mocna strona jak chyba widac :-P ) i niestety w momencie klikniecia na takie wolne pole to odslaniaja sie jak troche chaotycznie i mimo zabezpieczen odslaniaja sie pola z bombami (a nie powinny).
Dodam jeszcze ze plansza sapera jest tablica dwuwymiarowa obiektow, ktore maja nastepujace wlasciwosci:
int ileB; // ilosc bomb wokol tego pola
bool bomba; // czy na tym polu jest bomba
bool visible; // czy pole jest odsloniete (false - niewidoczny)
bool flaga; // czy pole jest oznaczone flaga
bool odswiez; // czy pole ma byc odswiezone w nastepnym odmaloweniu
Oto kod tej funkcji:
void CPlansza::odslonPola(int x, int y)
{
if (x>0 && y>0 && x<this->width && y<this->height)
{
// pole powyzej [x][y]
if (y-1 != 0)
{
if (!this->pola[y-1][x].visible && !this->pola[y-1][x].bomba)
{
this->pola[y-1][x].visible = true;
if (this->pola[y-1][x].ileB == 0)
this->odslonPola(x, y-1);
else
this->pola[y-1][x].visible = true;
this->pola[y-1][x].odswiez = true;
}
}
// pole ponizej [x][y]
if ((y+1) != this->height)
{
if (!this->pola[y+1][x].visible && !this->pola[y+1][x].bomba)
{
this->pola[y+1][x].visible = true;
if (this->pola[y+1][x].ileB == 0)
this->odslonPola(x, y+1);
else
this->pola[y+1][x].visible = true;
this->pola[y+1][x].odswiez = true;
}
}
// pole po prawo [x][y]
if (x+1 < this->width)
{
if (!this->pola[y][x+1].visible && !this->pola[y][x+1].bomba)
{
this->pola[y][x+1].visible = true;
if (this->pola[y][x+1].ileB == 0)
this->odslonPola(x+1, y);
else
this->pola[y][x+1].visible = true;
this->pola[y][x+1].odswiez = true;
}
}
// pole po lewo [x][y]
if (x-1 != 0)
{
if (!this->pola[y][x-1].visible && !this->pola[y][x-1].bomba)
{
this->pola[y][x-1].visible = true;
if (this->pola[y][x-1].ileB == 0)
this->odslonPola(x-1, y);
else
this->pola[y][x-1].visible = true;
this->pola[y][x-1].odswiez = true;
}
}
}
}
Wiem ze to jest dosyc topornie wytlumaczone i nie wiem czy komus sie bedzie chcialo w ogóle ze to zabrac ale jak jakies pytania to prosze pisac.
Z gory dziekuje.