Gra w statki w C, ruch komputera

0

Hej. Pisze sobie statki w C w konsoli. Wiekszosc napisalem juz, ale pojawia sie u mnie problem przy ruchu komputera.
Nie za bardzo wiem jak zaimplementowac 'inteligentne' strzelanie, czyli jak trafi w jakis statek, to zeby trafial blisko tego pola, a tym bardziej jak trafi juz dwa/trzy maszty. Wazne tez byloby zaznaczenie, kiedy statek bedzie juz zatopiony, aby wrocil do randomowego strzelania.

Szukalem po necie gotowych, by moc sie wzorowac, to znajdywalem tylko w innych jezykach[niestety, ale poki co mialem stycznosc tylko z C].

No i jezeli daloby sie przy okazji podsunac lepszy pomysl, w jaki moglby randomo strzelac[z czasem zajmuje to coraz dluzej, moze losowanie z pliku i usuwanie strzelonych?], to tez bym sie ucieszyl.

Wrzuce to, co juz sam zrobilem, tak bedzie chyba najlepiej.

http://przeklej.org/file/qmXDBU/BattleShips.v.1.0.rar

Uzywam MS Visual Studio 2010 jak cos. Dzieki z gory za kazda sugestie :)

0

Zagraj rundkę ze znajomym na papierze. Uważnie notuj swoje działania przy strzałach.
Dokładnie tak samo zachowa się komputer.

0

Na takim łopatologicznym poziomie to rozumie, ze jak trafi, to ma szukac nad/pod/obok. Jezeli trafi juz dwa/trzy maszty[i o ile nie jest zatopiony], to ma szukac wzdluz poziomu lub pionu az do zatopienia.

Jak pisalem, bardziej u mnie problem lezy w zaimplementowaniu tego, czyli jak stwierdzic, ze statek zostal juz zatopiony[wszystkim statkom przypisalem wartosc 1 w tablicy, aby uniknac warunkow sprawdzania przy strzelaniu] - chociaz przychodzi mi na mysl, ze moge zapisac gdzies te wspolrzedne i najwyzej je sprawdzac, albo w jaki sposob zapisac poprzedni/e strzaly i je sprawdzac - czyli ogolem na czym bazowac.
Troche tez boje sie miliona warunkow, ktore bedzie trzeba wprowadzic, wiec moze to po prostu to?

2

Co masz do dyspozycji? Planszę.

[?][?][?]
[?][?][?]
[?][?][?]

Co się stanie gdy strzelisz? Zaznaczasz to.

[*][?][?]
[?][?][?]
[?][?][?]

Jesteś informowany o trafieniu w statek.

[*][?][?]
[?][x][?]
[?][?][?]

Każdym trafieniu w statek...

[*][?][?]
[?][x][?]
[?][x][?]

Jesteś także informowany o tym, że takowy statek zatopiłeś.

[*][#][?]
[?][#][?]
[?][#][?]

Dokładnie to odwzoruj w pamięci.

0

Jezeli dobrze Cie zrozumialem, to Ty mnie zle zrozumiales ;p. Nie mam problemu ze strzalami gracza, ten problem obszedlem stosujac kolory konkretnych statkow[wiem, ze na tym gra nie polega, ale mi wystarczy poki co].

Komputer gdy trafi, musialby ta informacje gdzies zapisac[badz pozniej przeszukac tablice, ze tak sie stalo jezeli dobrze rozumiem]. No i jak napisalem, nie wiadomo czy statek zostal zatopiony, bo w tablicy sa zapisane jako 1, nie sa rozdzielane[moge to zrobic, ale znacznie utrudni to pozniej sprawdzanie czy trafiono - bo znowu rozdzielenie na 4].

0

Jezeli dobrze Cie zrozumialem, to Ty mnie zle zrozumiales ;p

Jak pisalem, bardziej u mnie problem lezy w zaimplementowaniu tego, czyli jak stwierdzic, ze statek zostal juz zatopiony[...]
ekhem :P

Rozważmy to inaczej - próbujemy zestrzelić statek na planszy 3x3

  a  b  c
1[?][?][?]
2[?][?][?]
3[?][?][?]

Oddajemy strzał - poszukujemy jakiegoś statku do zestrzelenia.

  a  b  c
1[?][?][?]
2[?][x][?]
3[?][?][?]

Oho, udało się! Jakiś kawałek statku był na pozycji b2! Możliwe pozycje kolejnych fragmentów statku to [b1, b3, a2, c2], czyli sąsiedzi punktu startowego b2
Próbujemy na powiedzmy... b1!

  a  b  c
1[?][*][?]
2[?][x][?]
3[?][?][?]

Niestety, pudło. Zostały nam następujące pozycje [b3, a2, c2]
Próbujemy na powiedzmy... b3!

  a  b  c
1[?][*][?]
2[?][x][?]
3[?][*][?]

Znowu pudło. Pozostałe pozycje to [a2, c2], niesprawdzeni sąsiedzi punktu startowego b2
Próbujemy na powiedzmy.. a2!

  a  b  c
1[?][*][?]
2[x][x][?]
3[?][*][?]

Udało się! Znamy już ułożenie statku - pionowe. w takim wypadku ostatnią możliwą pozycją jest [c2]

  a  b  c
1[?][*][?]
2[#][#][#]
3[?][*][?]

Zatopiony, czas na szampana.

0

Zaczalem robic to jakos i powoli cos wychodzi, ale mam problem przy sprawdzaniu czy jest cos zatopione, mecze sie z tym dobra godzinke. Fajnie by bylo, gdyby ktos rzucil okiem. Jezeli jakichs zmiennych nie zadeklarowalem w funkcji, to dalem je jako globalne - latwiej mi tak pracowac.
Jak sie program zachowuje? Gram sobie, komputer zestrzeli mi np. 4 masztowiec do konca, az w koncu nie ma gdzie trafiac[w okolo puste/trafione pola] - czyli tak jakby nie wywolywal funkcji czyZatopione[dalem sobie dzwiek z komputerka gdyby ta funkcja sie wywolala - cisza]. Na wszelki wypadek u siebie wklepalem ja przed kazdym rysowaniem[je mam na pewno dobrze]

Funkcja, ktora sprawdza czy sa trafione do konca masztowce, jezeli tak, to wklepuje w nich zatopienie

void czyZatopione(char statkiGracza[10][10])
{
if(cztero)
{
    if(F4==1) //F4, podobnie jak F3, F2 i F1 mowi o polozeniu pionowym/poziomym statku
    {
        if(statkiGracza[X4][Y4]=='T'&& statkiGracza[X4][++Y4]=='T')
        {
            if(statkiGracza[X4][++Y4]=='T')
            {
                if(statkiGracza[X4][++Y4]=='T')
                {
                    Y4-=3;
                    statkiGracza[X4][Y4]='Z';
                    statkiGracza[X4][++Y4]='Z';
                    statkiGracza[X4][++Y4]='Z';
                    statkiGracza[X4][++Y4]='Z';
                    cztero=0;
                    traf=0;

                }
                else Y4-=3;
            }
            else Y4-=2;
        }
        else --Y4;
    }

    if(F4==0)
    {
        if(statkiGracza[X4][Y4]=='T'&& statkiGracza[++X4][Y4]=='T')
        {
            if(statkiGracza[++X4][Y4]=='T')
            {
                if(statkiGracza[++X4][Y4]=='T')
                {
                    X4-=3;
                    statkiGracza[X4][Y4]='Z';
                    statkiGracza[++X4][Y4]='Z';
                    statkiGracza[++X4][Y4]='Z';
                    statkiGracza[++X4][Y4]='Z';
                    cztero=0;
                    traf=0;
                }
                else X4-=3;
            }
            else X4-=2;
        }
        else --X4;
    }
}

if(troj)
{
    if(F3==1)
    {
        if(statkiGracza[X3][Y3]=='T'&&statkiGracza[X3][++Y3]=='T')
        {
            if(statkiGracza[X3][++Y3]=='T')
            {
                Y3-=2;
                statkiGracza[X3][Y3]='Z';
                statkiGracza[X3][++Y3]='Z';
                statkiGracza[X3][++Y3]='Z';
                troj=0;
                traf=0;
            }
            else Y3-=2;
        }
        else --Y3;
    }

            if(F3==0)
            {
                if(statkiGracza[X3][Y3]=='T'&&statkiGracza[++X3][Y3]=='T')
                {
                    if(statkiGracza[++X3][Y3]=='T')
                    {
                        X3-=2;
                        statkiGracza[X3][Y3]='Z';
                        statkiGracza[++X3][Y3]='Z';
                        statkiGracza[++X3][Y3]='Z';
                        troj=0;
                        traf=0;
                    }
                    else X3-=2;
                }
                else --X3;
            }
}

if(dwu)
{
    if(F2==1)
    {
        if(statkiGracza[X2][Y2]=='T'&&statkiGracza[X2][++Y2]=='T')
        {
            Y2-=1;
            statkiGracza[X2][Y2]='Z';
            statkiGracza[X2][++Y2]='Z';
            dwu=0;
            traf=0;
        }
        else --Y2;
    }

    if(F2==0)
    {
        if(statkiGracza[X2][Y2]=='T'&&statkiGracza[++X2][Y2]=='T')
        {
            X2-=1;
            statkiGracza[X2][Y2]='Z';
            statkiGracza[++X2][Y2]='Z';
            dwu=0;
            traf=0;
        }
        else --X2;
    }
}

if(jedno)
{
    if(statkiGracza[X1][Y1]=='T')
    {
        statkiGracza[X1][Y1]='Z';
        jedno=0;
        traf=0;
    }
}

}

I na przykladzie wybierania 4romasztowca, gdzie dane sa zapisywane.

void wybieranie_4romasztowca(char statkiGracza[10][10])
{
int i=4, j=4, flaga=1;
char z='A' ;

    while(1)
{
    z=getch();
    if(z==strzalka_LEWO)//zdefiniowany jest kod strzalek
    {
        if(j==0)
            continue;
        j--;
        if(flaga==1)
            rysowanieplanszyPoziom( j, i, statkiGracza);//funkcja, ktora zawiera strukture COORD, rysuje plansze i nie ingeruje w j oraz i
        else if(flaga==0)
            rysowanieplanszyPion( j, i, statkiGracza);
    }
    if(z==strzalka_PRAWO)
    {

        if(flaga==1)
        {
            if(j==6)
                continue;
            j++;
            rysowanieplanszyPoziom( j, i, statkiGracza);
        }
        else if(flaga==0)
        {
            if(j==9)
                continue;
            j++;
            rysowanieplanszyPion(j, i, statkiGracza);
        }
    }
    if(z==strzalka_GORA)
    {
        if(i==0) 
            continue;
        i--;
        if(flaga==1)
            rysowanieplanszyPoziom( j, i, statkiGracza);
        else if(flaga==0)
            rysowanieplanszyPion( j, i, statkiGracza);
    }
    if(z==strzalka_DOL)
    {

        if(flaga==1)
        {
            if(i==9)
                continue;
            i++;
            rysowanieplanszyPoziom( j, i, statkiGracza);
        }
        else if(flaga==0)
        {
            if(i==6)
                continue;
            i++;
            rysowanieplanszyPion( j, i, statkiGracza);
        }
    }
    if(z==9)//klawisz tabulacji - ma zmieniac poziom na pion i odwrotnie
    {
        if(flaga==1)
        {
            if(i<7)
            {
                flaga=0;
                rysowanieplanszyPion(j, i, statkiGracza);
            }
        }
        else if(flaga==0)
        {
            if(j<7)
            {
                flaga=1;
                rysowanieplanszyPoziom(j, i, statkiGracza);
            }
        }
    }

    if(z==' ') //klawisz spacji
    {

        if(flaga==1)
        {
            X4=i;//zapisuje wartosci wspolrzednych glownego klocka oraz czy jest to poziom/pion
            Y4=j;
            F4=1;
            statkiGracza[i][j]=1;
            statkiGracza[i][++j]=1;
            statkiGracza[i][++j]=1;
            statkiGracza[i][++j]=1;
            break;
        }
        else if(flaga==0)
        {
            X4=i;
            Y4=j;
            F4=0;
            statkiGracza[i++][j]=1;
            statkiGracza[i++][j]=1;
            statkiGracza[i++][j]=1;
            statkiGracza[i][j]=1;
            break;
        }
    }
}

}

Moge dorzucic jeszcze kod gdzie strzela, ale nie chce robic balaganu poki co. Dzieki z gory :)

0

Nie, nikt nie rzuci okiem na to spaghetti. Jedynie debugger może ci pomóc.

0

nie wiem czy ktoś o tym wspomniał ale standardowy algorytm wygrywania w statki to strzelanie w co drugie pole (na przemian co drugą linię) - w ten sposób najszybciej trafisz wszystkie dwu-, trzy- i czteromasztowce. Na koniec zostaną tylko jednomasztowce do obstrzelenia ale tych pól zostanie mało bo statki nie mogą się stykać

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