Saper - rekurencja

0

Jestem nowy na forum także witam wszystkich. Uczę się programowania od jakiegoś czasu i ostatnio wziąłem się za pisanie gry saper, i utknąłem w miejscu funkcji która ma odkrywać pola jeśli wokół nie ma bomb. Nie wiem jak to dokładnie nazwać. Program ogólnie cały się wywala. Poniżej zamieszczam kod

void check_place(int i, int j)
{
    if (i>10 || i<1) 
        return;
    if (j>10 || j<1)
        return;
    if(clear_tab[i][j] == ' ') // sprawdza czy pole jeszcze nie było zaznaczone
    {
        clear_tab[i][j] = 48; // jeśli tak to wpisuje 0
        for(int m=i-1;m<i+2;m++)
        {
            for(int n=j-1;n<j+2;n++)
            {
                if(tab[m][n] == '+')
                tab[i][j]++; // czy wokół są bomby jeśli tak to zwiększ wartość o jeden
            }
        }
    }
        if (clear_tab[i][j] == 48) // jeśli wartość dalej jest równa 0 to rekurencja
        {
            check_place(i-1,j-1);
            check_place(i-1,j);
            check_place(i-1,j+1); 
            check_place(i,j-1);
            check_place(i,j+1);
            check_place(i+1,j-1);
            check_place(i+1,j);
            check_place(i+1,j+1);
        }
}
 
0

W jaki sposób jest stworzona tablica na której operujesz?

0
  1. przestan uzywac golych tablic, zamien to na vector
  2. nie uzywaj magi numbers. Lepiej wpisac '0' niz 48
  3. zapewne wychodzisz po za zakres tablicy dlatego sie wywala
0

tu jest cały kod.

 
clear_tab = new char*[10];
        for(x=0;x<10;x++)
        {
            clear_tab[x] = new char[10];
        }
        for (x=0;x<10;x++)
        {
            for(y=0;y<10;y++)
            {
                clear_tab[x][y] = ' ';
            }
        }

ukryta tablica jest stworzona identycznie tyle że są dodane do niej bomby .

0

Na oko to ta funkcja się nie zatrzyma, bo sprawdza wte i wewte jeśli oba pola mają wartość '0'.

I dla i==10 lub j==10 jest błąd zakresu. Maksymalny indeks to 9.

1
Lyczkul napisał(a):

tu jest cały kod.

 
clear_tab = new char*[10];
        for(x=0;x<10;x++)
        {
            clear_tab[x] = new char[10];
        }
        for (x=0;x<10;x++)
        {
            for(y=0;y<10;y++)
            {
                clear_tab[x][y] = ' ';
            }
        }

ukryta tablica jest stworzona identycznie tyle że są dodane do niej bomby .

Czyli wychodzisz poza zakres tablicy w swojej funkcji

1

Brakuje ci metody int countBombsAt(int x, int y) (problem należy dzielić na możliwie małe kawałki).

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