Gra w statki - ustalanie współrzędnych strzałów.

0

Hej, chce napisać program, który będzie wyznaczał współrzędne strzałów w grze statki. Pole mapy wynosi 7 x 7, są 4 statki - 1 masztowiec, 2 masztowiec, 3 i 4. Miał być to prosty program bo dopiero uczę się programować . Algorytm wymyśliłem też raczej nie za wybitny, abym był w stanie go zrealizować (chce po kolei od lewej do prawej strzelać, aż zatopie wszystkie statki) .
Jednakże coś mi nie wychodzi, a sam nie mogę się dopatrzeć gdzie popełniam błąd.

#include <iostream>

using namespace std;

int Z=0,N=0;
int mapa[7][7]= {0};

void wczytanie_mapy()
{
    Z=0;

    for(int i=0; i < 7; i++)
    {
        for(int j=0; j < 7; j++)
        {
            cin >> mapa[i][j];

            if(mapa[i][j]== 2) Z++;

        }
    }

}


int main()
{
    int W,K,X;
    bool T;

    while(N <= 45 && Z < 10)
    {
        wczytanie_mapy();
        W=0;
        K=0;

            do{
            T=false;

            if(W != 0 && mapa[W][K] != 2)
            {
                X=K;

                do
                {

                    if(K==0)
                    {
                        if(mapa[W-1][K]==2 || mapa[W-1][K+1]==2 || mapa[W][K+1]==2)
                        {
                            K++;
                            X++;
                        }

                    }
                    else if(K==6)
                    {
                        if(mapa[W-1][K]==2 || mapa[W-1][K-1]==2 || mapa[W][K-1]==2)
                        {
                            K++;
                            X++;
                        }

                    }
                    else if(mapa[W-1][K]==2 || mapa[W-1][K+1]==2 || mapa[W][K-1]==2 || mapa[W-1][K-1]==2)
                    {
                        K++;
                        X++;
                    }
                    else X++;

                }
                while(X == K );
            }

            if(mapa[W][K]==0)
            {
                N++;
                cout << W<<" "<< K <<endl;
                T=true;
            }
            else if(mapa[W][K]==9)
            {
                if(K>0)
                {
                    if(mapa[W][K-1]==1)
                    {
                        K--;
                        W++;
                    }
                    else if(K < 6)
                    {
                        K++;
                    }
                    else
                    {
                        K=0;
                        W++;
                    }
                }
                else if(K < 6)
                {
                    K++;
                }
                else
                {
                    K=0;
                    W++;
                }

            }
            else if(mapa[W][K]==1)
            {
                if(W > 0)
                {
                    if(mapa[W-1][K]==1) W++;
                    else K++;
                }
                else K++;
            }
            else if(K <6) K++;
            else
            {
                K=0;
                W++;
            }

            }while(T==false);

    }
    return 0;
}```

Ogólnie to program będzie podawał kordy strzału do innego programu, który podaje czy trafiłem czy nie
0

No, ale co konkretnie Ci nie wychodzi? Jakie jest Twoje pytanie? Tylko poproszę coś konkretniejszego niż gdzie mam błąd wśród tych 130 wierszy.

0

Program podaje do drugiego programu tylko współrzędne 1 strzału i drugiego a potem, gdzieś się zapętla, przez co nie podaje kolejnych strzałów

4

Wg mnie wywalić wszystko, zacząć od nowa tym razem używając przynajmniej funkcji i struktur.

0

Podjąłem próbę przeanalizowania tego, ale się poddaję. Jeżeli chcesz otrzymać pomoc na tym forum to chociaż:

  1. Nazwij te zmienne porządnie lub chociaż opisz kod co robi po kolei w komentarzach
  2. Umieść to w funkcje aby było czytelniejsze
    Wtedy chociaż będziemy wiedzieli co miałeś na myśli.

Na pierwszy rzut oka:
Błąd 1: Program podaje do drugiego programu tylko współrzędne 1 strzału i drugiego a potem
Nigdzie nie widzę żadnej metody wysyłania komunikatu do "innego programu"
Błąd 2: Co to jest W, K, X, T, Z, N, i, j ?

0
#include <iostream>

using namespace std;

int Z=0,N=0; //Z - liczba trafionych pól statku N-liczba wykonanych strzałów
int mapa[7][7]= {0};
int W,K; // W - numer wiersza K-numer kolumny
//oznaczenia liczbowe: 0 - obszar nie sprawdzony , 1 - trafione pole statku , 2 - pole zatopionego statku, 9 -pudło 
void wczytanie_mapy() // wczytanie mapy dostarczonej przez program
{
    Z=0;

    for(int i=0; i < 7; i++)
    {
        for(int j=0; j < 7; j++)
        {
            cin >> mapa[i][j];

            if(mapa[i][j]== 2) Z++;

        }
    }

}

void sprawdzenie() //sprawdzam czy w pobliżu nie znajduje się już jakiś trafiony statek, gdyż okręty nie mogę się stykać
{
    for(;;)
    {
        if(K==0)
        {
            if(mapa[W-1][K]==2 || mapa[W-1][K+1]==2 || mapa[W][K+1]==2 ) K++;
            else break;
        }
        if(K==6)
        {
            if(mapa[W-1][K]==2 || mapa[W-1][K-1]==2 || mapa[W][K-1]==2 )
            {
                W++;
                K=0;
            }
            else break;
        }
        else
        {
            if(mapa[W-1][K+1]==2 || mapa[W-1][K]==2 || mapa[W-1][K-1]==2 || mapa[W][K-1]==2) K++;
            else break;
        }
    }
}

int main()
{

    while(N <= 45 && Z < 10) // program kończy się po oddaniu 45 strzałów, lub zatopieniu 4 statku o łącznej wartości 4 pół (1-masztowiec, 2-masztowiec, 3-masztowiec, 4-masztowiec ) 
    {
        wczytanie_mapy();
        W=0;
        K=0;

        do
        {
            if(W!=0 && mapa[W][K]!=2) sprawdzenie();

            if(mapa[W][K]==0)
            {
                N++;
                cout << W << " " << K <<endl; // W ten sposób podaje współrzędne do programu, który aktualizuje mape
            }
            else if(mapa[W][K]==9)
            {
                if(K>0)
                {
                    if(mapa[W][K-1]==1)
                    {
                        K--;
                        W++;
                    }
                    else if(K < 6) K++;
                    else
                    {
                        K=0;
                        W++;
                    }

                }
                else if(K < 6) K++;
                else
                {
                    K=0;
                    W++;
                }
            }
            else if(mapa[W][K]==1)
            {
                if(W>0)
                {
                    if(mapa[W-1][K]==1) W++;
                    else K++;
                }else K++;
            }
            else
            {
                if(K<6) K++;
                else{ K=0; W++;}
            }

        }while(mapa[W][K] != 0);

    }
    return 0;
}

Wydaje mi się bardziej czytelny, jednakże cały czas coś jest źle ...

2

Pozmieniałem nazwy zmiennych i od razu widać pierwsze bugi:

  1. W funkcji wczytanie_mapy przekazujesz dane do mapy i robisz to za każdym wywołaniem funkcji wczytanie_mapy, czyli na początku cyklu pętli while (oddaneStrzaly <= 45 && trafienia < 10). Funkcja wczytanie_mapy() powinna wykonać się tylko raz wraz ze startem aplikacji tak? Ponad to w funkcji wczytanie_mapy() zmieniasz wartość trafienia. Dlaczego?
while (oddaneStrzaly <= 45 && trafienia < 10) // program kończy się po oddaniu 45 strzałów, lub zatopieniu 4 statku o łącznej wartości 4 pół (1-masztowiec, 2-masztowiec, 3-masztowiec, 4-masztowiec ) 
    {
        wczytanie_mapy();
void wczytanie_mapy() // wczytanie mapy dostarczonej przez program
{
    trafienia = 0;
    for (int i = 0; i < 7; i++)
    {
        for (int j = 0; j < 7; j++)
        {
            cin >> mapa[i][j];
            if (mapa[i][j] == 2) trafienia++;
        }
    }
}

jeżeli już obliczasz trafienia w funkcji wczytanie_mapy() to dlaczego sprawdzasz tylko zatopione statki (wartość 2)? Wartość 1 też jest trafieniem

  1. W tej linijce cout << row << " " << col << endl; // W ten sposób podaje współrzędne do programu, który aktualizuje mape nie podajesz współrzędnych, tylko je wyświetlasz.

  2. W pętli do-while masz taki warunek w ciele pętli:

if (mapa[row][col] == 0)
            {
                oddaneStrzaly++;
                cout << row << " " << col << endl; // W ten sposób podaje współrzędne do programu, który aktualizuje mape
            }

Oraz warunek zapętlania:

} while (mapa[row][col] != 0);

Zdajesz sobie sprawę, że jeżeli mapa[row][col] będzie równe 0 to oddasz jeden strzał i nawet nie zaznaczysz, że już go oddałeś? Dzięki temu Twoja mapa jest cały czas taka jak na początku.

  1. Proponuję napisać program od nowa (nie przejmuj się, mi się to zdarzało tysiące razy). Stwórz sobie na przykład następujące funkcje:
void WypelnijMape() 
{
    // Wypełnia mapę mapa[7][7]
}
int PobierzTypPola(int wiersz, int kolumna)
{
    //Zwraca 
    //0 - obszar nie sprawdzony , 
    //1 - trafione pole statku , 
    //2 - pole zatopionego statku, 
    //9 - pudło
    //w zależności jaka wartość kryje się pod mapa[wiersz][kolumna]
}
int ObliczIloscTrafien()
{
    //Zwraca liczbę komórek w mapa[7][7] w której wartość jest równa trafionego lub zatopionego statku
}
void OddajStrzal(int wiersz, int kolumna)
{
    // Oddaje strzal i zaznacza wartość w odpowiedniej komorce:
    //0 - obszar nie sprawdzony , 
    //1 - trafione pole statku , 
    //2 - pole zatopionego statku, 
    //9 - pudło
}

Tutaj całość edytowana:

#include <iostream>
using namespace std;

int trafienia = 0, oddaneStrzaly = 0; //Z - liczba trafionych pól statku N-liczba wykonanych strzałów
int mapa[7][7]= {0};
int row, col; // W - numer wiersza K-numer kolumny
//oznaczenia liczbowe: 0 - obszar nie sprawdzony , 1 - trafione pole statku , 2 - pole zatopionego statku, 9 -pudło 

void wczytanie_mapy() // wczytanie mapy dostarczonej przez program
{
    trafienia = 0;
    for (int i = 0; i < 7; i++)
    {
        for (int j = 0; j < 7; j++)
        {
            cin >> mapa[i][j];
            if (mapa[i][j] == 2) trafienia++;
        }
    }
}

void sprawdzenie() //sprawdzam czy w pobliżu nie znajduje się już jakiś trafiony statek, gdyż okręty nie mogę się stykać
{
    for (; ; )
    {
        if (col == 0)
        {
            if (mapa[row - 1][col] == 2 || mapa[row - 1][col + 1] == 2 || mapa[row][col + 1] == 2) 
                col++;
            else 
                break;
        }
        if (col == 6)
        {
            if (mapa[row - 1][col] == 2 || mapa[row - 1][col - 1] == 2 || mapa[row][col - 1] == 2)
            {
                row++;
                col = 0;
            }
            else 
                break;
        }
        else
        {
            if (mapa[row - 1][col + 1] == 2 || mapa[row - 1][col] == 2 || mapa[row - 1][col - 1] == 2 || mapa[row][col - 1] == 2) 
                col++;
            else 
                break;
        }
    }
}

int main()
{

    while (oddaneStrzaly <= 45 && trafienia < 10) // program kończy się po oddaniu 45 strzałów, lub zatopieniu 4 statku o łącznej wartości 4 pół (1-masztowiec, 2-masztowiec, 3-masztowiec, 4-masztowiec ) 
    {
        wczytanie_mapy();
        row = 0;
        col = 0;

        do
        {
            if (row != 0 && mapa[row][col] != 2) 
                sprawdzenie();

            if (mapa[row][col] == 0)
            {
                oddaneStrzaly++;
                cout << row << " " << col << endl; // W ten sposób podaje współrzędne do programu, który aktualizuje mape
            }
            else 
            if (mapa[row][col] == 9)
            {
                if (col > 0)
                {
                    if (mapa[row][col - 1] == 1)
                    {
                        col--;
                        row++;
                    }
                    else 
                    if (col < 6) 
                        col++;
                    else
                    {
                        col = 0;
                        row++;
                    }

                }
                else 
                if (col < 6) 
                    col++;
                else
                {
                    col = 0;
                    row++;
                }
            }
            else 
            if (mapa[row][col] == 1)
            {
                if (row > 0)
                {
                    if (mapa[row - 1][col] == 1) row++;
                    else col++;
                }
                else col++;
            }
            else
            {
                if (col < 6) col++;
                else { col = 0; row++; }
            }

        } while (mapa[row][col] != 0);
    }
    return 0;
}
0

@Grzegorz Świdwa: 1. funkcja wczytanie mapy powinno wykonywać się dopóki nie zatopię wszystkich statki, lub wykorzystam 45 strzałów. Tak jak pisałem jest to bot, który typuje pola do strzału, a mapę na bieżąco aktualizuje drugi program, który mówi czy trafiłem czy nie. Sprawdzam 2, ponieważ tak oznaczone jest pole statku zatopionego.(jeżeli trafie statek, a go nie zatopię to trafione pole przyjmuje 1, a jeżeli statek jest zatopiony to wszystkie jego pola mają wartość 2.)

2.Z wyjścia standardowego program odczytuje współrzędne.

  1. Dziękuję za podpowiedź, chyba muszę tak postąpić ;)
1

Zamień to: //oznaczenia liczbowe: 0 - obszar nie sprawdzony , 1 - trafione pole statku , 2 - pole zatopionego statku, 9 -pudło
na enum
Przy wczytywaniu mapy trafienia++;. Już mi się podoba ta gra, dopiero wczytujemy mapę zaś od razu mam kilka trafień gratis! :D
Czyli mylące nazewnictwo.
Wywal zmienne globalne, do funkcji podaj strukturę z potrzebnymi zmiennymi.
Pozbądź się magicznych liczb zamiast int mapa[7][7]= {0}; użyj: const int Size=7; int mapa[Size][Size]= {0}; oraz odpowiednio zamiast: for (int i = 0; i < 7; i++) użyj: for(int i=0;i<Size;++i) przy okazji: Wyszukiwanie i zliczanie par takich samych liczb z tablicy
W void sprawdzenie() widzę osobną obsługę dla if (col == 0) oraz if (col == 6) zaś dla if (row == 0) oraz if (row == 6) nie ma? WTF?
Weź sobie zrób int mapa[1+Size+1][1+Size+1]= {0}; i nie używaj krawędzi.

NIC_SKILLA napisał(a):

@Grzegorz Świdwa: ...Sprawdzam 2, ponieważ tak oznaczone jest pole statku zatopionego.(jeżeli trafie statek, a go nie zatopię to trafione pole przyjmuje 1, a jeżeli statek jest zatopiony to wszystkie jego pola mają wartość 2.)

Czyli jeżeli na mapie 2 pola o wartości 2 oraz 10 pól o wartości 1 oraz 20 pól o wartości 9 to strzeliłeś tylko 2 razy?
Powinieneś zliczyć wartości 0 - nie_sprawdzono zaś Size*Size-nie_sprawdzono będzie to co porównujesz do 45 - znowu magiczna liczba!

1

using namespace std;

int N=0; //Z - liczba trafionych pól statku N-liczba wykonanych strza³ów
int mapa[7][7]= {0};
int W,K; // W - numer wiersza K-numer kolumny
//oznaczenia liczbowe: 0 - obszar nie sprawdzony , 1 - trafione pole statku , 2 - pole zatopionego statku, 9 -pud³o


void wczytanie_mapy() // wczytanie mapy dostarczonej przez program
{

    for(int i=0; i < 7; i++)
    {
        for(int j=0; j < 7; j++)
        {
            cin >> mapa[i][j];

        }
    }

}

void sprawdzenie() //sprawdzam czy w pobli¿u nie znajduje siê ju¿ jakiœ trafiony statek, gdy¿ okrêty nie mogê siê stykaæ
{
    for(;;)
    {
        if(K==0)
        {
            if(mapa[W-1][K]==2 || mapa[W-1][K+1]==2 || mapa[W][K+1]==2 ) K++;
            else break;
        }
        if(K==6)
        {
            if(mapa[W-1][K]==2 || mapa[W-1][K-1]==2 || mapa[W][K-1]==2 )
            {
                W++;
                K=0;
            }
            else break;
        }
        else
        {
            if(mapa[W-1][K+1]==2 || mapa[W-1][K]==2 || mapa[W-1][K-1]==2 || mapa[W][K-1]==2) K++;
            else break;
        }
    }
}

int ObliczIloscTrafien()
{
    int Z=0;

    for(int i=0; i < 7; i++)
    {
        for(int j=0; j < 7; j++)
        {

            if(mapa[i][j]== 2) Z++;

        }
    }

    return Z;
}
int main()
{

    while(N <= 45 && ObliczIloscTrafien() < 10) // program koñczy siê po oddaniu 45 strza³ów, lub zatopieniu 4 statku o ³¹cznej wartoœci 4 pó³ (1-masztowiec, 2-masztowiec, 3-masztowiec, 4-masztowiec )
    {
        wczytanie_mapy();
        W=0;
        K=0;

        do
        {


            if(mapa[W][K]==0)
            {
                sprawdzenie();
                break; // W ten sposób podaje wspó³rzêdne do programu, który aktualizuje mape
            }
            else if(mapa[W][K]==9)
            {
                if(K>0)
                {
                    if(mapa[W][K-1]==1)
                    {
                        K--;
                        W++;
                    }
                    else if(K < 6) K++;
                    else
                    {
                        K=0;
                        W++;
                    }

                }
                else if(K < 6) K++;
                else
                {
                    K=0;
                    W++;
                }
            }
            else if(mapa[W][K]==1)
            {
                if(W>0)
                {
                    if(mapa[W-1][K]==1 || K==6) W++;
                    else K++;
                }
                else if(K < 6 )K++;
                else W++;
            }
            else
            {
                if(K<6) K++;
                else
                {
                    K=0;
                    W++;
                }
            }

            sprawdzenie();
        }
        while(mapa[W][K] != 0);

        N++;
        cout << W+1 << " " << K+1 <<endl;

    }
    return 0;
}

Heh, działa mi już :), jednak trochę muszę go przerobić bo średnio potrzebuje 30 strzałów by zatopić wszystkie statki - spróbuje walić co 2 kra

0

algorytm.png Ten sposób wydaje mi się bardziej efektywny od pierwszego . Mam tylko kilka wątpliwość nie wiem jak przejść z jednego typowania do kolejnych mam na myśli, gdy już wystrzelam wszystkie możliwe niebieskie pole, to aby program zaczął stzelać w czerwone, a jak i te wystrzala i nie znajdę 1-masztowca to, aby szedł od lewej do prawej jak w poprzedniej wersji. Mam jeszcze inny problem bo coś źle napisałem (podzieliłem program na funkcje, więc powinno być łatwiej rozczytać) i czasami podaje mi współrzędne, których nie ma na mapie np ujemne i się zacina . Przykład działania programu : mapa wzorcowa : (to są oznaczenia jakie przyjmuje program obsługujący mojego bota - 1 pole jednomasztowca , 2- pole 2 masztowca ...) A tutaj przykład strzałów mojego bota (mapa jest zakresu 1-7 x 1-7 )
1 1
1 2
1 3
1 4
1 5 <-- wytypowane współrzędne przez bota ( w takiej postaci program dostaje współrzędne)
1 6
1 7
2 1
2 2
2 4
2 5
0 5
0 5
...
0 0 0 0 0 0 0
0 1 0 0 4 0 0 <-- mapa wzorcowa
0 0 0 0 4 0 0
0 0 0 0 4 0 0
3 0 0 0 4 0 0
3 0 0 0 0 0 0
3 0 0 0 2 2 0

9 9 9 9 9 9 9
9 2 0 9 1 0 0
0 0 0 0 0 0 0 <-- mapa strzałów bota
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 9 0 0 0

Wydaje mi się, że robię coś źle w przesuwaniu się po mapie (mam na myśli od lewej do prawej)

void przesuniecie()
{
    do
    {
        if(mapa[W][K]==9)
        {
            if(K>0 && mapa[W][K-1]==1 )
            {
                K--;
                W++;

            }
            else if(K<6 && mapa[W][K+1]==1 && mapa[W][K+2]==9)
            {
                K--;
                W++;
            }
            else if(W>0 && mapa[W-1][K]==1)
            {
                do
                {
                    W++;
                }
                while(mapa[W][K]!= 0);

            }
            else if(W<6 && mapa[W+1][K]==1)
            {
                do
                {
                    W--;
                }
                while(mapa[W][K]!= 0);
            }
            else if(K<6) K++;
            else
            {
                K=0;
                W++;
            }


        }
        else if(mapa[W][K]==1)
        {
            if( (W>0 && mapa[W-1][K]==1) == true || (K==6 && mapa[W][K-1]!= 1)== true ) W++;
            else if(K < 6 )K++;
            else {W++; K=0;}

        }
        else if(mapa[W][K]==2)
        {
            if(K<6) K++;
            else
            {
                K=0;
                W++;
            }
        }

        sprawdzenie(1,-6); // funkcja sprawdzająca czy w pobliżu nie znajduje się juz zatopiony statek
    }
    while(mapa[W][K] != 0);
}

W- wiersze
K- kolumny

1

Napisz kilka strategii w excelu w postaci:
screenshot-20201223233645.png
Przekształć to na

struct { int x,y; } strategy[][49]=
{
/*strategy 0*/ {{3,3},{0,2},{0,5}, ... },
/*strategy 1*/ { ... },
...
/*strategy 9*/ { ... },
};

Do magicznej listy 0,1,2,9 dodaj wartość 8 - niemożliwe, oraz 7 - bardzo prawdopodobne.
Po każdym strzale jeżeli trafiony zamieniaj na mapie sąsiednie po przekątnej 0 na 8:
screenshot-20201223234659.png
Jeżeli zatopiony zamieniaj na mapie wszystkie sąsiednie 0 na 8:
screenshot-20201223234342.png
Na starcie wylosuj strategię i leć wg niej po kolei strzelając tylko w zera.
Jeżeli w wyniku strzału powstali 7-ki to strzelaj najpierw po nim w losowej kolejności.
Jeżeli skończyli się 7-ki to wracasz do kolejnego kroku w strategii.

0
int Z=0,N=0; //Z - liczba trafionych pól statku N-liczba wykonanych strzałów
int mapa[7][7]= {0};
int W,K; // W - numer wiersza K-numer kolumny
//oznaczenia liczbowe: 0 - obszar nie sprawdzony , 1 - trafione pole statku , 2 - pole zatopionego statku, 9 -pudło 

Jest wiele opcji błędu:

  1. Zmienna W jest mniejsza od 0 lub większa niż 6
  2. Zmienna K jest mniejsza od 0 lub większa niż 6
if(K>0 && mapa[W][K-1]==1 )
            {
                K--;
                W++;

            }

Jeżeli K == 0 próbujesz się odwołać do indeksu -1. Musisz na to uważać. To samo w reszcie warunków, np.

else if(K<6 && mapa[W][K+1]==1 && mapa[W][K+2]==9)
            {
                K--;
                W++;
            }

Tutaj mamy K+2. A jeżeli K==6 wychodzimy poza index tablicy i wyrzuca nam wyjątek

1

Dodaj sobie

do
    {
        if(mapa[W][K]==9)
        {
                   Console.WriteLine(W + " / " + K);

i obserwuj jakie Ci się wartości przypisują.
Możesz też zrobić zamiast void przesuniecie() metodę void przesuniecie(int K, int W)

public void przesuniecie(int K, int W)
{
     if(K< 0 || W < 0 || K >5 || W >6)
          throw new InavlidArgumentException("Coś poszło nie tak jak chciałem");
     // Tuttaj reszta metody
}
0

@Grzegorz Świdwa: Czy nie prościej użyć map[9][9] nie używać krawędzi za to nie bawić się w sprawdzenie zakresów?

2

Ponad to nie zajmuj sie wariantami jak oddać strzały tylko jak Twój program interpretuje komendy.
W funkcjach jak najczęściej staraj się nie zwracać void.
Twoje funkcje powinny realizować możliwie najmniejsze zadanie, czyli np. else if(K<6 && mapa[W][K+1]==1 && mapa[W][K+2]==9) da się ubrać w osobną funkcję

eFieldType GetFieldType(int Row, int Column)
{
}

Wtedy Twój warunek jest czytelny:

if(GetFieldType(K, W) == eFieldType.Zatopiony)
1

Dopiero teraz zauważyłem jak bardzo zapomniałem składni c++. Proszę niech mnie ktoś poprawi. Tutaj moja propozycja projektu aplikacji:

#include <iostream>
using namespace std;

int main()
{
	eFieldState mapa[7][7] = {  };
	StartHits(*mapa);
} 
// Mapa

// Stan pola na mapie
enum eFieldState
{
	Normal = 0,
	Checked = 1,
	Hit = 2,
	Sunk = 3
};
// Definicja punktu [y][x]
struct Point
{
	int x;
	int y;
};
// Pobiera wartość punktu "p" na mapie "map"
eFieldState GetFieldState(eFieldState* map, Point p)
{

}
// Zmienia w punkcie "p" na mapie "map" wartość na "state"
void UpdateMap(eFieldState* map, Point p, eFieldState state)
{

}
// Zwraca true, jeżeli punkt "p" na mapie "map" jest równy wartości "state"  
bool IsInState(eFieldState* map, Point p, eFieldState state)
{

}
// Zwraca true, jeżeli "bot" może uderzyć w pole "p" na mapie "map"
bool CanHitPoint(eFieldState* map, Point p)
{

}
// Pobiera ilość pól na mapie "map" które mają wartość "state"
int GetFieldCount(eFieldState* map, eFieldState state)
{

}

// Napierdziela w statki. Zwraca ilość strzałów
int CheckHits(int* map)
{
	int TotalChecked = 0; // ilość strzałów
	int TotalHits = 0;
	while (TotalChecked < 45)
	{
		for (int y = 0; y < 7; y++)
		{
			for (int x = 0; x < 7; x++)
			{
				if (CanHitPoint(*map, Point(){y, x})) // już zapomniałem jak się tworzy obiekty w c++. Niech mnie ktoś poprawi :(
				{
					eFieldState CurrentFieldState = GetFieldState(*map, Point(y, x));
					switch (CurrentFieldState)
					{
					case eFieldState.Normal:
						TotalChecked++;
						eFieldState HitResult; // Tutaj jakaś informacja w co się trafiło. Czy w wodę, czy w statek
						UpdateMap(*mapa, point[y][x], HitResult);
						break;
					case eFieldState.Checked:
						break;
					case eFieldState.Hit:
					case eFieldState.Sunk:
						break;
					default:
						break;
					}
				}
			}
		}
	}
}

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