Gra w statki w Javie

0

Witam.

Kiedyś napisałem taki bardzo prosty program do gry w statki w konsoli. Cóż za frajda, 9 pól które trzeba wpisywać ręcznie. Teraz już programuje GUI i postanowiłem, tak dla siebie, że te statki napiszę w graficzny sposób. Jeszcze nie umiem podmieniać tła, więc wszystko jest czysto schematycznie. Teraz czas na pytania:

  1. Gdzie umieścić losowe ustawianie statków w tablicy 9x9, zachowując jednocześnie zasady statków (nie mogą się stykać)? W konstruktorze okna? W main? Stworzyć JMenu i dać opcje "Nowa gra" i tam? Kod: https://dpaste.de/xRcb

  2. Jak się zabrać za napisanie takiego algorytmu, który by sam losował gdzie i w jaki sposób rozłożyć statek (w poziomie czy w pionie)?

  3. Jak zrobić tak, żeby na określony czas uniemożliwić graczowi naciskanie przycisków, nie chodzi mi tutaj o setEnabled (czy jakoś tak), chcę żeby jakoś to wyglądało. Ewentualnie na jakiś czas (fajnie byłoby jakby komputer udawał, że myślenie zajmuje mu około 1 sekundy) wyłączyć ActionListenera dla przycisków.

Z góry dzięki za odpowiedzi. Jeśli macie jakieś rady, przydatne funkcje etc. który by mi pomogły w tym "projekcie (?)" będę wdzięczny. Z góry dzięki za odpowiedź.

2
  1. Dobrze że starasz się odddzielić widok od logiki (klasa okna osobno i klasa która coś robi osobno).

  2. Odnośnie tej tablicy 9x9 to zrobiłbym klasę Board albo Plansza która trzymała by tą tablicę 9x9 oraz jej statki. Generowanie planszy przerzuciłbym do innej klasy np BoardGenerator albo coś takiego.

  3. W konstruktorze okna ani w main nie powinno być żadnej logiki (a więc generowania statków).

  4. W menu okna mogłoby faktycznie być "Nowa gra" i ono by robiło nową instancje Planszy z BoardGeneratora (czy jak sobie to tam nazwiesz).

  5. Algorytm na statki:
    5.1 Google?
    5.2 Może spróbuj napisać samemu? Wstawiać statki w losowej kolejności w dostępne miejsce.
    5.3 Przygotuj kilka predefiniowanych map i korzystaj z nich, a potem się tym zajmij?

  6. Nie wyłączaj actionListenera. Najprościej myślę byłoby ustawić jakąś flagę w Plansza że gracz nie może zmienić stanu.

Pierdołki:
Cpu brzmi jak procek. Może lepszą nazwą byłoby jakoś npc albo coś takiego?

Kod na razie nie wygląda tragicznie, więc +1 dla Ciebie. Tylko pamiętaj o zasadzie DRY (żeby nie wyszło Ci coś takiego jak np tutaj).

0

@TomRiddle Buttony, JLabel, JTextField itp powinno się tworzyć w klasie z oknem czy też gdzieś indziej? Na razie jedyne co zalicza się do logiki, to mi się wydaje, że jest ActionListener jako klasa prywatna. Nie tworzyłem osobnych klas, ze względu, że trzeba byłoby wszystkie tablice, zmienne które by używały ActionListenery dodać w konstruktorze innej klasy, dobrze myślę?

Edit: utworzyłem klasę Plansza i metodę która by mi tą planszę tworzyła. Plansza i okno . Teraz trzeba zrobić, mechanikę gry. To już w innej klasie tak? Ale rozmieszczenie statków nadal w tej z planszą?

1

Wzorcowo jedna klasa powinna robić jedną rzecz (innymi słowy powinna mieć jeden powód do zmiany), ale to raczej w takich bardziej "hardkorowych" projektach. U Ciebie, dopóki się połapiesz może być w jednej :) (ja bym zrobił PlanszaGenerator i tak, ale u Ciebie niech zostanie).

Noo, tworzenie JButtonów, JLabel i JTextFieldów mogłoby być w metodzie init okna, i ją w sumie mógłbyś wykonać w konstruktorze. ActionListener to też widok.

Nie trzeba przekazywać wszystkich tablic, wystarczy instancja klasy Plansza.

public class Plansza extends JFrame
{

Ty teraz zrobiłeś klasa plansza która jest oknem. Nie o to chodziło. Plansza miała nie mieć nic wspólnego z oknem. Trochę pomieszałeś znowu.

JButtony, JLabele i JTextFieldy powinny być generowane przez okno (albo jakaś klasa zależna od okna).

Wielkość planszy, pozycje statków etc. powinny być w klasie Plansza.

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