Problem z napisaniem sapera

0

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.

0

Dawno pisalem sapera nie pamietam... Sciagnij jakiegos :( source.

0

Taaaa sciagnij. Juz szukalem ale jak sie pewnie domyslacie nie znalazlem. Pewnie zle szukalem bo jakbym dobrze szukal to bym znalazl, ale ze zle szukalem i nie znalazlem to moze ktos kto szukal i znalazl lub nie szukal i tez znalazl podesle mi link gdzie ten kod mozna znalezc albo przynajmniej gdzie sie zaczepic. [diabel]

1 użytkowników online, w tym zalogowanych: 0, gości: 1