[C++] Gra statki

Muszę napisać grę statki. Pisze w Visual Studio 2008. Nie mam pojęcia jak zabrać się za robienie tej gry. W programowaniu jestem początkujący. Na razie chcę zrobić player vs. cpu. Prosiłbym o jakieś wskazówki. Mi się wydaje żeby na początku zrobić 4 tablice… Tylko, nie wiem czy tak będzie dobrze. Proszę o jakieś wskazówki jak to ruszyć. Z góry dziękuję za pomoc.

Wystarczy jedna tablica: unsigned Statki[2][10];

Nie wytłumaczyłeś z czym masz problem.

Jedna tablica?

A nie będzie zadeklarowana tak int plansza [10][10]; i takie 2 tablice dla gracza i komputera.

Mam problem z ruszeniem tej gry. Z tymi tablicami… bo na resztę koncepcję mam ale zobaczymy jak to wyjdzie w praktyce :wink: Czas mam do końca listopada więc muszę się sprężyć.

Dla każdej klatki potrzebujesz dwie informacji:

  1. Czy jest tam jakiś statek

  2. Czy był dokonany strzał w to miejsce

te informacje da się zapisać w 2 bitach, liczba unsigned ma 32 bity, więc można w jednej liczbie unsigned zakodować wiersz planszy. Takich wierszy potrzebujesz 10 dla każdego gracza. Stąd wystarczy unsigned Statki[2][10];

Jednak tablica unsigned Statki[2][10]; nie wystarczy.

Moja koncepca jest taka że do tablicy przypisuje się wartośći:

0 - nie ma statku

1 - jest statek

2- statek trafiony

3- statek zatopiony

4- pole gdzie można dostawić kolejny element statku

5- pole zablokowane, nie mozna postawić żadnego elementu statku.

Jednak zrobiłem 2 tablice:

class tablica

int gracz[10][10]

int komputer[10][10]

zrobiłem w main obiekty clasy

int tab;

tab.gracz;

tab.komputer;

i jak mam te dwie tablice to mam problem żeby się odnieść do nich przy wywoływaniu metod.

np. polozenie::sprawdzanie(tablica &tab)

i jak zrobić żeby przy wywoływaniu metody/funkcji w nawiasie wpisać tylko nazwe gracz lub komputer zależnie dla kogo będzie ta metoda wywoływana.

Statek trafiony czy zatopiony można rozróżniać “w locie”. Podczas ustawiania statków tej informacji (trafiony/zatopiony) nie potrzebujesz. Gdzie można dostawiać kolejny element tez można określić w locie. Więc tak naprawdę potrzebujesz tylko informacji: statek - jest/niema, strzał - był/nie było.

Jesteś pewien że właśnie tak zrobiłeś (bo to się nie skompiluje)?

Nie sądzę aby na tym forum kręciło się dużo jasnowidzów, pokaż co masz i wtedy pytaj jak do tego coś dodać.

Obiekty miałem źle…

Problem nadal jest taki sam. Stworzyłem 2 tablice i obiekt do tych tablic. (mam nadzieje że teraz dobrze ;))

Jak zrobić żeby wywołanie funkcji zerowanie było dla jednej tablicy lub dla drugiej. np. tak jak mam w mainie.

Zrób specjalną klasę dla tablic.

Klasa zrobiona i pomogło :smiley:

Kolejny problem:

losuję w tablicy losowo jakąś pozycję i przypisuje wartość statku. I teraz jak zrobić żeby wylosować pozycje z współrzędnych [i-1][j], [i+1][j], [j-1]; [j+1]. (statki łamane, te wypisane współrzędne mają przypisaną wartość 4).

v=rand()%4;

tab[i+((v&1)\<\<1)-1][j+(v&2)-1]=1;

coś nie bardzo chce to działać… wybiera albo po skosie albo losowwą wartość w tablicy

idzie to rozpisać odzielnie na ‘i’ i ‘j’??

jest możliwe zrobić, żeby rozstawienie statków było zależne od wartości pola ==4, bo czasem może sie zdarzyć, że będzie można przypisać dodatkowy element tylko na trzy pozycje.

No rzeczywiście coś mi się nie to wymckneło :smiley:

v=rand()%4;v==3) tab[i-1][j]=1;v==2) tab[i+1][j]=1;v==1) tab[i][j-1]=1;tab[i][j+1]=1; [/code]



Na pewno można zapisać w sposób podobny do mojej poprzedniej propozycji, ale coś mi dziś już mózg odmawia posłuszeństwa.

Podziałało ale, ale teraz przy kompilacji wywala mi błąd, staje przy drugiej pętli while.

reszta ustawień jest analogiczna do tego.

Unhandled exception at 0x7760159e in statki_final_edition.exe: 0xC0000005: Access violation.

i wklejam z output:

Nie sprawdzasz czy i+1 nie jest przypadkiem większa 9. To samo dotyczy j+1.

Zrobiłem sprawdzanie i działa. Ten sam błąd wywala teraz przy rozstawieniu statków trzymasztowych, na pętli while…

Dodatkowo czasami wywala mi inne błędy:

To pokaż całość nie ma tu jasnowidzów

Dobrze użyłem switch case?? bo też zatrzymuje mi na tym i mi coś w tym nie pasuje…

Nie spamuj, proszę. :lol:

sami_10 , czy Ty programujesz Commodore w BASICU? Słyszałeś o czymś takim jak pętla?

Heh, po całym dniu pisania już głupoty zacząłem pisać :stuck_out_tongue: mam już napisane prawidłowo :stuck_out_tongue: W końcu naukę progamowania zaczynam od pisania projektu, który mam na czwartek ;D