• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Gra w statki

Object Storage Arubacloud
+7 głosów
7,470 wizyt
pytanie zadane 14 października 2015 w Nasze projekty przez emSon Stary wyjadacz (10,480 p.)
edycja 17 października 2015 przez emSon

Cześć. Dziś mija dokładnie 1.5 miesiąca odkąd zacząłem się uczyć C++ oraz miesiąc i jeden dzień mojego bytu na tym forum. Projekt, który zamierzam wam przedstawić jest swoistym podsumowaniem tego, czego się przez ten czas zdążyłem dowiedzieć.

Jeśli ktoś nie czytał mojego pierwszego tematu, to znajduje się on tu -> https://forum.pasja-informatyki.pl/59794/co-mozna-by-poprawic.

Udało mi się przestawić na programowie obiektowe i pojąć większość związanych z nim pojęć. Nie jest to może jakiś fenomalny postęp, ale ważne ,że jest.

UPDATE:

  • teraz po planszy można przemieszczać się strzałkami, a strzał akceptuje się spacją
  • w przypadku wybrania błędnego pola lub trafienia strzał jest powtarzany
  • mocna refaktoryzacja kodu : - 900 linii!

Projekt zostaje oficjalnie zamknięty i schowany do tajemniczego folderu "C++"... Tak kończy się ta opowieść ;)

DOWNLOAD:

EXE: https://www.sendspace.com/file/nj2qe8

Kod źródłowy: https://www.sendspace.com/file/lwatpe

SCREEN:

 

5 odpowiedzi

+1 głos
odpowiedź 14 października 2015 przez radek024 Szeryf (77,160 p.)
Oby tak dalej ;) Dobrze sobie radzisz, jak na tak krótki okres. Może spróbuj stworzyć jakiś generator? Ja osobiście uważam tego typu programy za najbardziej rozwijające, ponieważ z reguły łączą dwie rzeczy <- tak właśnie uczyłem się na sieci komputerowe numerów portów, czy tworzenia tabel w htmlu. Przyjemne z pożytecznym ;)
+1 głos
odpowiedź 14 października 2015 przez pietrzakacper Mądrala (7,480 p.)
Muszę powiedzieć, że mnie jako również początkującego programiste zmotywował twój projekt. Robi wrażenie przedwszystkim pod względem czytelności kodu. Jak na 1.5 miesiąca nauki naprawdę imponujący program. Mógłbyś podać jakieś źródła z których czerpałeś wiedzę?
komentarz 14 października 2015 przez pietrzakacper Mądrala (7,480 p.)
Nawet jeśli w 100% rozumiesz swój kod to i tak po paru miesiącach jeżeli to nie jest hello world pozapominasz po co jest jakaś funkcja, a spojrzenie w taki komentarz potrafi momentalnie rozjaśnić o co chodzi.
komentarz 14 października 2015 przez adrian17 Ekspert (344,860 p.)
edycja 14 października 2015 przez adrian17
...poważnie?

Nie chodzi tu tylko czy ty "rozumiesz go teraz", ale też o to że jak kiedyś posadzisz kogoś innego przed tym kodem to żeby on też mógł go łatwo zrozumieć.

Działania algorytmu nie można przecież tak po prostu wywnioskować patrząc na nieskomentowany kod - gdyby tak było, artykuły o algorytmach na Wikipedii składałyby się tylko z kawałka "przejrzystego" kodu i tekstu "resztę wywnioskujcie sobie sami".

Patrz jak obszernie jest skomentowany kod GCC: https://github.com/gcc-mirror/gcc/blob/master/gcc/cp/friend.c#L535

Edit: Clang jeszcze lepszym przykładem: https://github.com/llvm-mirror/clang/blob/master/lib/AST/Decl.cpp#L742
komentarz 14 października 2015 przez emSon Stary wyjadacz (10,480 p.)
Faktycznie, masz rację. Od teraz będę komentował algorytmy i bardziej skomplikowane funkcje programu ;)
komentarz 14 października 2015 przez niezalogowany
@emSon - chciałbym cię tylko ostrzec, że przykłady kodu w tej książce (,,Czysty kod. Podręcznik dobrego programisty." Robert'a C. Martin'a) są pisane w Javie, co było powodem natychmiastowego zwrotu książki do księgarni. Niby chodzi po prostu o teorię i to wszystko da się przenieść na inny język, ale irytowałoby mnie, że wielu przykładów nie zrozumiem. A do tego autor książki programuje także w C++ i dlatego nie pomyślałem, że książka będzie pisana w Javie... Ale jak ci nie będzie to przeszkadzało, to książke raczej polecam :)
komentarz 14 października 2015 przez emSon Stary wyjadacz (10,480 p.)
Mam nadzieję, że nie będzie mi to przeszkadzać, a jak będzie to i tak jakoś przez to przebrnę.
+1 głos
odpowiedź 14 października 2015 przez Rogargol Pasjonat (16,600 p.)
Wspomniales o ksiazce "czysty kod" i moge Ci ja polecic bo faktycznie moglbys wiele poprawic pod wzgledem "elegancji" kodu.

Jak juz wspomnieli inni, funkcje krotsze, nazwy zmiennych powinny mowic nam o nich jak najwiecej, zreszta niekotre zmienne tak nazywasz, wiec wystarczy wiecej konsekwencji.

Tak czy inaczej gratuluje napisania takiej gierki, na pewno sie przy tym duzo nauczyles.

Osobiscie z takich kosmetycznych zmian, dodalbym mozliwosc poruszania sie strzalkami po polach i np oddawania strzalu spacja.
komentarz 14 października 2015 przez emSon Stary wyjadacz (10,480 p.)
Dobry pomysł! Wdrożenie go na pewno zajmie mi trochę czasu, ale na pewno nauczy mnie kilku nowych rzeczy.
komentarz 14 października 2015 przez Rogargol Pasjonat (16,600 p.)
To nie powinno byc trudne. Jakbys utknal w jakims momencie to dawaj znac :)
+1 głos
odpowiedź 14 października 2015 przez criss Mędrzec (172,590 p.)
Całkiem przyjemna gierka :D Ale jak wspomniał rogargol, wybór pola strzałkami dobrze by wyglądał, a trudne to nie jest do zrobienia.

Swoją drogą - nawet nie analizowałem, co właściwie robi set_ship(), bo no... wygląda strasznie, ale nie dało się tego jakoś uogulnić, żeby nie pisać takiego olbrzyma dla każdej klasy z osobna? :P I bodajże get_damage, mamy taką wirtualną metode w Ship a nie widze takich w klasach dziedziczących.
komentarz 14 października 2015 przez emSon Stary wyjadacz (10,480 p.)

set_ship() jest od ustawiania statków na planszy. Masa if'ów. Nie wiem czy dałoby się zrobić jedną metodę dla trzech klas. Przykładowo dla czteromasztowca należy sprawdzić czy 3 pola w prawo są wolne. Dla trójmasztowca tylko 2, a dla dwumasztowca 1. Nawet jeśli by się dało, pewnie byłoby to strasznie nieczytelne.

get_damage() powstał z myślą o komunikatach "Statek został zatopiony". Metoda ta istnieje dla każdej klasy dziedziczącej, co więcej - każda klasa ma swoją.

komentarz 14 października 2015 przez criss Mędrzec (172,590 p.)
Aha, to się nie doszukałem po prostu (btw - troche dziwnie masz pogrupowane metody po plikach; niby twoja sprawa, ale warto się uczyć dobrych nawyków).

Co do set_ship() - tu też się zastanawiałem dlaczego to po prostu nie są tablice, a kilka oddzielnych zmiennych. Mógłbyś w klasie przechowywać wielkość tablicy (najlepiej jako static int) a w kontruktorze dynamicznie tworzyć tablice o rozmiarze n. Dzięki temu nawet nie musiałbyś przeładowywać  set_ship() w dziedziczących klasach, wystarczy żeby pobierała sobie n i robiła to co musi n razy. Przynajmniej tak mi sie wydaje, nie jestem pewien jak to u ciebie dokładnie działa.
komentarz 14 października 2015 przez emSon Stary wyjadacz (10,480 p.)

Nie zbyt dobrze cię zrozumiałem, ale wpadłem na pomysł. 

ile = 4; // dla czteromasztowca należy sprawdzić trzy pola w bok, 
		// więc skoro pętla zaczyna od 1, to należy jej ustawić                           //wartość 4

for(int i=1; i>ile; i++)
{
	if(r+i >= 0)
	{
		if(pole[r+i].zajete == false)
		{
			wolne = true;
		}
		else
		{
			wolne = false;
            break;
		}
	}
}

Ile mogłaby przybierać wartość w zależności od klasy, do której należy podany obiekt. Dla dwumasztowca pętla wykona się raz, dla trójmasztowca dwa, a dla czteromasztowca trzy. Sprawdzi ona czy pole[wylosowana liczba + i] nie jest czasem zajęte przez inny statek. Jeśli jest to zakończ pętle, a jeśli nie to sprawdź dalej. Genialny pomysł!

O to ci chodziło?

komentarz 14 października 2015 przez criss Mędrzec (172,590 p.)
No.. też. Mówiłem też o tablicy zamiast kilku booli, ale tak - takim podejściem oszczędzisz maaase kodu.
komentarz 14 października 2015 przez emSon Stary wyjadacz (10,480 p.)
900 lini pójdzie w niepamięć ;). jutro to zrobię. a dziś dobranoc :)
+1 głos
odpowiedź 15 października 2015 przez Muminek Dyskutant (8,650 p.)
edycja 15 października 2015 przez Muminek

Małe spostrzeżenia:

  • gdy gracz strzela jeszcze raz w to samo pole jego tura przepada. Spotykałem się z wersjami, sam tak grałem ze strzał po prostu jest powatarzany :)  
  • chociaż na pewno powinnien być ponowny strzał gdy się wpisze co innego niż numer pola. 
  • po trafieniu w statek powinien być dodatkowy strzał. Nie spotkałem się z inną zasadą
  • pola wokól trafionego statku mogłyby zmienić kolor na szar
  • całkowicie zatopione statki moglyby miec delikatnie inny kolor zielonego
  • po zakończonej grze mogłaby być wyswietlona plansza w którą strzelalismy + wszystkie statki wroga

Poza tym spoko, tylko strasznie pola z cyferkami się zlewają... Ale gratuluję pomysłu :)

komentarz 15 października 2015 przez emSon Stary wyjadacz (10,480 p.)
Dzięki za sugestie, na pewno wdroże przynajmniej niektóre ;)
komentarz 19 października 2015 przez Muminek Dyskutant (8,650 p.)
i jak, jakieś zmiany? :-)
komentarz 20 października 2015 przez emSon Stary wyjadacz (10,480 p.)
A nie widzisz :) ? Wyszła nowa wersja, która poprawia mechanikę gry i zrefaktoryzowała kod.
komentarz 20 października 2015 przez Muminek Dyskutant (8,650 p.)
A nie widzisz... Mój błąd, jakoś nie zauważyłem w pierwszym poście :) W każdym razie dobra robota, pewnie wiele się przy tym nauczyłeś! ;-)
komentarz 20 października 2015 przez emSon Stary wyjadacz (10,480 p.)
O tak, takie własne projekty naprawdę sporo dają.

Podobne pytania

0 głosów
2 odpowiedzi 1,279 wizyt
pytanie zadane 16 stycznia 2019 w Nasze projekty przez Mavannkas Bywalec (2,290 p.)
0 głosów
3 odpowiedzi 1,792 wizyt
pytanie zadane 20 maja 2016 w C i C++ przez mat07 Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 469 wizyt
pytanie zadane 13 listopada 2018 w C i C++ przez Mariusz Maik Nowicjusz (220 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...