[C++] Gra statki


(Sami 10) #1

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.


([alex]) #2

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

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


(Sami 10) #3

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ć.


([alex]) #4

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];


(Sami 10) #5

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.


([alex]) #6

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ć.


(Sami 10) #7

Obiekty miałem źle...

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

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


([alex]) #8

Zrób specjalną klasę dla tablic.


(Sami 10) #9

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).


([alex]) #10

v=rand()%4;

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


(Sami 10) #11

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.


([alex]) #12

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.

(Sami 10) #13

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:


([alex]) #14

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


(Sami 10) #15

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:


([alex]) #16

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


(Sami 10) #17

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


(Marcin 110) #18

Nie spamuj, proszę. :lol:


(somekind) #19

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


(Sami 10) #20

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