Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Potapanje podmornica

[es] :: C/C++ programiranje :: C/C++ za početnike :: Potapanje podmornica

[ Pregleda: 3737 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

proka_92
proka_92
Smederevo

Član broj: 153372
Poruke: 69
*.dynamic.isp.telekom.rs.



+4 Profil

icon Potapanje podmornica18.05.2012. u 15:30 - pre 145 meseci
Pozdrav svima. Pravim igricu potapanje podmornica. Problem mi pravi funkcija koja generise lokacije brodova za racunar, previse vremena joj treba da generise sve brodove (znam i zasto, ali nemam ideju kako da to optimizujem). U svakom slucaju - evo funkcije, pa ako neko moze da pomogne, bio bih mu zahvalan.
Code:
void popuniRacunar(int ***matrix)
{
    int i, x, y, num, **arr;
    arr = (int **)calloc(4, sizeof(int *));
    if(arr == NULL)
        exit(1);
    for(i = 0; i < 4; i++)
    {
        arr[i] = (int *)calloc(2, sizeof(int));
        if(arr[i] == NULL)
            exit(1);
    }
    x = generisiBroj(1, 11);
    y = generisiSlovo();
    (*matrix)[x][y] = 4;
    arr[0][0] = (proveriKoordinateInput(x+1, y, 4, 1, *matrix) == 1) ? (x + 1) : 11;
    arr[0][1] = (proveriKoordinateInput(x+1, y, 4, 1, *matrix) == 1) ? y : 11;
    arr[1][0] = (proveriKoordinateInput(x-1, y, 4, 1, *matrix) == 1) ? (x - 1) : 11;
    arr[1][1] = (proveriKoordinateInput(x-1, y, 4, 1, *matrix) == 1) ? y : 11;
    arr[2][0] = (proveriKoordinateInput(x, y-1, 4, 1, *matrix) == 1) ? x : 11;
    arr[2][1] = (proveriKoordinateInput(x, y-1, 4, 1, *matrix) == 1) ? (y - 1) : 11;
    arr[3][0] = (proveriKoordinateInput(x, y+1, 4, 1, *matrix) == 1) ? x : 11;
    arr[3][1] = (proveriKoordinateInput(x, y+1, 4, 1, *matrix) == 1) ? (y + 1) : 11;
    num = generisiBroj(0, 4);
    x = arr[num][0];
    y = arr[num][1];
    while(!proveriKoordinateInput(x, y, 4, 1, *matrix))
    {
        num = generisiBroj(0, 4);
        x = arr[num][0];
        y = arr[num][1];
    }
    (*matrix)[x][y] = 4;
    if((*matrix)[x][y-1] == 4)
    {
        (*matrix)[x][y+1] = 4;
        (*matrix)[x][y+2] = 4;
    }
    else
        if((*matrix)[x][y+1] == 4)
        {
            (*matrix)[x][y-1] = 4;
            (*matrix)[x][y-2] = 4;
        }
        else
            if((*matrix)[x-1][y] == 4)
            {
                (*matrix)[x+1][y] = 4;
                (*matrix)[x+2][y] = 4;
            }
            else
            {
                (*matrix)[x-1][y] = 4;
                (*matrix)[x-2][y] = 4;
            }
    for(i = 0; i < 2; i++)
    {
        x = generisiBroj(1, 11);
        y = generisiBroj(1, 11);
        while(!proveriKoordinateInput(x, y, 3, 0, *matrix))
        {
            x = generisiBroj(1, 11);
            y = generisiBroj(1, 11);
        }
        (*matrix)[x][y] = 3;
        arr[0][0] = (proveriKoordinateInput(x+1, y, 3, 1, *matrix) == 1) ? (x + 1) : 11;
        arr[0][1] = (proveriKoordinateInput(x+1, y, 3, 1, *matrix) == 1) ? y : 11;
        arr[1][0] = (proveriKoordinateInput(x-1, y, 3, 1, *matrix) == 1) ? (x - 1) : 11;
        arr[1][1] = (proveriKoordinateInput(x-1, y, 3, 1, *matrix) == 1) ? y : 11;
        arr[2][0] = (proveriKoordinateInput(x, y-1, 3, 1, *matrix) == 1) ? x : 11;
        arr[2][1] = (proveriKoordinateInput(x, y-1, 3, 1, *matrix) == 1) ? (y - 1) : 11;
        arr[3][0] = (proveriKoordinateInput(x, y+1, 3, 1, *matrix) == 1) ? x : 11;
        arr[3][1] = (proveriKoordinateInput(x, y+1, 3, 1, *matrix) == 1) ? (y + 1) : 11;
        num = generisiBroj(0, 4);
        x = arr[num][0];
        y = arr[num][1];
        while(!proveriKoordinateInput(x, y, 3, 1, *matrix))
        {
            num = generisiBroj(1, 4);
            x = arr[num][0];
            y = arr[num][1];
        }
        (*matrix)[x][y] = 3;
        if((*matrix)[x][y-1] == 3)
            (*matrix)[x][y+1] = 3;
        else
            if((*matrix)[x][y+1] == 3)
                (*matrix)[x][y-1] = 3;
            else
                if((*matrix)[x-1][y] == 3)
                    (*matrix)[x+1][y] = 3;
                else
                    (*matrix)[x-1][y] = 3;
    }
    for(i = 0; i < 3; i++)
    {
        x = generisiBroj(1, 11);
        y = generisiBroj(1, 11);
        while(!proveriKoordinateInput(x, y, 2, 0, *matrix))
        {
            x = generisiBroj(1, 11);
            y = generisiSlovo();
        }
        (*matrix)[x][y] = 2;
        arr[0][0] = (proveriKoordinateInput(x+1, y, 2, 1, *matrix) == 1) ? (x + 1) : 11;
        arr[0][1] = (proveriKoordinateInput(x+1, y, 2, 1, *matrix) == 1) ? y : 11;
        arr[1][0] = (proveriKoordinateInput(x-1, y, 2, 1, *matrix) == 1) ? (x - 1) : 11;
        arr[1][1] = (proveriKoordinateInput(x-1, y, 2, 1, *matrix) == 1) ? y : 11;
        arr[2][0] = (proveriKoordinateInput(x, y-1, 2, 1, *matrix) == 1) ? x : 11;
        arr[2][1] = (proveriKoordinateInput(x, y-1, 2, 1, *matrix) == 1) ? (y - 1) : 11;
        arr[3][0] = (proveriKoordinateInput(x, y+1, 2, 1, *matrix) == 1) ? x : 11;
        arr[3][1] = (proveriKoordinateInput(x, y+1, 2, 1, *matrix) == 1) ? (y + 1) : 11;
        num = generisiBroj(0, 4);
        x = arr[num][0];
        y = arr[num][1];
        while(!proveriKoordinateInput(x, y, 2, 1, *matrix))
        {
            num = generisiBroj(0, 4);
            x = arr[num][0];
            y = arr[num][1];
        }
        (*matrix)[x][y] = 2;
    }
    for(i = 0; i < 4; i++)
    {
        x = generisiBroj(1, 11);
        y = generisiBroj(1, 11);
        while(!proveriKoordinateInput(x, y, 1, 0, *matrix))
        {
            x = generisiBroj(1, 11);
            y = generisiBroj(1, 11);
        }
        (*matrix)[x][y] = 1;
    }
    for(i = 0; i < 4; i++)
        free(arr[i]);
    free(arr);
}
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Potapanje podmornica18.05.2012. u 15:48 - pre 145 meseci
Teško mi je da čitam ovo. Objasni zašto treba previše vremena, možda rešenje može da se nađe iz objašnjenja.
 
Odgovor na temu

proka_92
proka_92
Smederevo

Član broj: 153372
Poruke: 69
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: Potapanje podmornica18.05.2012. u 16:02 - pre 145 meseci
Treba previse vremena jer kako se postavljaju podmornice, tako se smanjuje i broj polja koji je slobodan za upis (podmornice se postavljaju po svim pravilima, znaci ne smeju da se dodiruju ni na koji nacin). Kada se dodje do podmornica velicine 1, generise se vise koordinata na koje ne moze da se upise nego onih na koje moze da se upise. Npr, za postavljanje jedne takve podmornice prodje po 5-10 generisanja koordinata, dok se ne pronadje odgovarajuce polje, a njih ima 4.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Potapanje podmornica18.05.2012. u 16:32 - pre 145 meseci
Šta misliš o tome da posle postavljanja svake pojedinačne podmornice pronađeš sve koordinate koje su prihvatljive za sledeću podmornicu, skupiš ih u jedan niz i odabereš jednu od njih po randomu? Tako nema ponavljanja. Ako ne uspeš da nađeš ni jednu takvu koordinatu onda moraš da se vratiš korak unazad, ukloniš koordinatu poslednje odabrane podmornice iz njegove liste pogodnih koordinata pa ponoviš postupak. Ako se vratiš unazad i ukloniš koordinatu, i ispostavi se da nema više raspoloživih koordinata, onda se vrati unazad za još jedan korak.

Ova gore ideja se lepo ostvaruje rekurzijom. Da li si upoznat s tim?
 
Odgovor na temu

proka_92
proka_92
Smederevo

Član broj: 153372
Poruke: 69
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: Potapanje podmornica18.05.2012. u 16:39 - pre 145 meseci
Da, tacno. To bi moglo da mi resi probleme :D Slabo sam radio sa rekurzijom, uglavnom sam je izbegavao, mnogo mi je teze da pratim flow kada je funkcija rekurzivna, nego kada se radi iterativno, a i znam da sa rekurzivnim resenjima lako moze doci do overflow-a, ali videcu, mozda cu odraditi tako sada. Hvala mnogo, javljam kad odradim, a kada ceo program bude gotov, ostavicu link ovde za one koji zele da testiraju/vide kako sam radio.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Potapanje podmornica18.05.2012. u 16:44 - pre 145 meseci
Stack overflow se ublažava tako što što manje memorije zauzimaš na samom steku. Naročito nizove. Na steku (kao lokalnu promenljivu) držiš samo pokazivač na niz, a sam sadržaj je u slobodnoj memoriji, kreiran sa malloc (pretpostavljam da je ovo jezik C, a ne C++). Pošto je broj podmornica tačno određen i ograničen, onda neće biti problema sa stekom.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Potapanje podmornica

[ Pregleda: 3737 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.