Gra statki – pierwszy mały projekt

0

Witam bawię się Javą od 3 mies . Postanowiłem napisać sobie pierwszy mały projekcik. Gra statki to klasyczna gra w papierowe statki . Program rozstawia nam statki na planszy w sposób zupełnie losowy a zadaniem gracza jest je wszystkie wyeliminować . Jestem ciekaw co o tym myślicie .

Zaznaczę że jest to moja pierwsza tak duża "zbieranina" kodu i zdaje sobie sprawę że od strony technicznej sam kod i struktura programu są słabe .
Dużą satysfakcją dla mnie jest fakt że udało się z tym dojechać do końca nie pogubić w połowie i że efekt finalny się w ogóle kompiluje :)

Co wy o tym sądzicie ? Czy po trzech miesiącach progres jest odpowiedni ?

2

Czemu *.rar? Nie możesz tego wrzucić jak człowiek na jakiegoś Githuba? :)

1

Aplikacja według mnie całkiem porządnie wykonana (nie udało mi się jej jakoś specjalnie zepsuć, czy wywołać błędu),a to jak na brak wcześniejszego doświadczenia jest bardzo ok, niestety jeśli chodzi o sterowanie wyjątkowo nieprzyjazne (nie mogłem się zmusić by klikać wszystkie pola) :) Zamiast za każdym razem wybierać, nowe współrzędne można by klikać na pole, w które strzelamy (te pomalowane pola by działały jak przyciski) lub może sugerować graczowi kolejne wolne pole (skróciłoby czas sprawdzania aplikacji), Dodatkowo, oznaczyłbym zatonięte statki np innym kolorem, Obok zrobił listę z statkami jakie zostały do zatopienia. Jakbyś chciał dalej rozwijać aplikację, to nieuniknione będzie dodanie gracza komputerowego -> standardowe statki ale na przykład z broniami obszarowymi, lub rozgrywka online. Podsumowując jest ok :). Na minus brak informacji kiedy zatopię wszystkie statki. Jak mam porównać wynik z moim kolegą ?

0

@okon66113: wrzuc jakies screeny i gameplaya :)

1

Zapomniałem, dodać uwag do kodu. Całkiem w porządku jednak, pewne nawyki są do poprawienia. Nazewnictwo klas Support, Support1 z nazwy niech ktoś spróbuję zgadnąć za co są odpowiedzialne. Mieszanie polskich i angielskich nazw np.
boolean goodPio=false;
boolean goodPz=false;
boolean pionowo=false;
boolean poziomo=false;
Zakomentowane w kodzie funkcje , chyba w celu weryfikowania
// System.out.println("pionowo= "+pionowo+" poziomo= "+poziomo); //w
literowki w nazwach np. int numebrField;
Powtórzenia kodu kilkakrotnie (przynajmmniej 4 razy) np.
for(int i=0;i<st.numebrField;i++){
table[x+i][y]=st.numebrField;
}
Powinno znaleźć się w osobnej funkcji.
Nie wiem jak w Javie, ale w C# lepiej jakby tablica była [,] niż [][] . W sensie czytelniej jakby plansza była to tablica [x,y] (dwuwymiarowa) niż tablica składająca się z tablic [] (każda z tablic mogłaby mieć inne wymiary) .
Należy unikać używania stałych (liczb w funkcjach) np. Jak masz wielkość planszy,
marks=new String[]{"A","B","C","D","E","F","G","H","I","J"};
JLabel[]labelNumbers=new JLabel[11];
JLabel[]labelText=new JLabel[11];
To wyobraź sobie że chcesz zmienić rozmiar planszy na 20 na 18. W Twoim przypadku wymagane byłoby zmienienie w wielu miejscach wielu wartości. Liczby odpowiedzialne za wielkość powinny być przypisywane do zmiennej size=11 i później wykorzystywane.

0

Mam jeszcze jedno pytanie . Jak trudne jest opanowie java.net. Chodzi mi o stworzenie aplikacji która umożlwiała by grę dwóm graczom za pośrednictwem internetu ? Czy lepiej na początku nie zaprzątać sobie tym głowy . Zaznaczę że nie mam o tym bladego pojęcia .

1

Proszę o sprostowanie przez bardziej, doświadczonych użytkowników.
Niestety stworzenie całkowicie online aplikacji, może okazać się trudne ze względu na problem znalezienia Twojego komputera przez gracza z innej sieci (brak publicznego ip).
Natomiast gra w sieci LAN powinna działać bez problemów.
Musisz stworzyć aplikacje client-server ( tutoriale w googlu Java client-server mnóstwo krótkich filmów) . Komunikacja pomiędzy 2 aplikacjami nie jest specjalnie wymagająca jeśli weźmiemy pod uwagę przesyłania komend typu "A2" w formie tekstowej. Zarządzanie ponownym nawiązywaniu połączenia, dbanie o zgodność stanu planszy na 2 aplikacjach (turowość) może być trochę kłopotliwe. Przykładowy film pokazujący komunikacje przez Sockety . W Twoim przypadku zadbałbym o to by po każdej komendzie wysłanej z jednej aplikacji do 2 oczekiwać potwierdzenia (np "OK") w innym przypadku wysłać ponownie komendę, w celu wyeliminowania sytuacji gdzie 1 z graczy czeka na 2 drugiego który już wykonał swój strzał.

Podsumowując powinieneś stworzyć menu, w którym gracz miałby opcję typu stwórz pokój (aplikacja działa jako serwer i czeka na podłączenie klienta) , druga opcja podłącz (aplikacja działająca jako klient, w tym przypadku potrzebne wpisanie IP serwera do którego ma się podłączyć. Do testowania uruchamia się 2 razy aplikację (1 jako serwer a drugą jako klient) często w filmach wykorzystywane jest localhost/5000 oznacza komputer na którym jest uruchomiony na porcie 5000.

Sockety odpowiednie tworzysz po wybraniu trybu działania aplikacji. Kod rozgrywki może być 1 i ten sam dla klienta i serwera w tym przypadku . Należy pamiętać że gracz 1 strzela na plansze gracza 2 a gracz 2 na planszę gracza 1. (Da się to przesłać do funkcji przy tworzeniu rozgrywki). Po wystrzale pole jest przesyłane między aplikacjami . Druga aplikacja aktualizuje stan u siebie zwraca "trafiono" lub "nietrafiono" aktualizacja stanu w 1 aplikacji. Oczywiście czy aplikacje będą znały pozycję wroga po rozpoczęciu (wymienić się tymi danymi) aby uprościć działanie aplikacji to kwestia programisty 😅 wyżej opisałem jakby aplikację nawzajem nie wiedziały o rozstawieniu wroga. Końcem rozgrywki może być brak statków (trudniejsza implementacja) lub ilość trafień (jesteśmy wstanie wyliczyć ile trafień w statki trzeba by wszystkie były zniszczone)
Planszę gry (rozgrywkę) użytkownik widzi po podłączeniu się statków.

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