Gra w statki, grafika

Gra w statki, grafika
FT
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:4
0

Witam,

programuję od niedawna i w ramach ćwiczenia postanowiłem napisać grę w statki, od strony logicznej gra działa ok, ale chciałbym również dołączyć grafikę i tu mam problem.
Plansza mojej gry ma wielkość 10 x 10. Więc dodałem 100 buttonów i teraz mam pytanie czy muszę do każdego przycisku dodawać odbiorcę zdarzeń i metodę actionPerformed osobno, a następnie w samej metodzie określać o jakie pole w mojej tablicy chodzi, jak niżej

Kopiuj
  public void actionPerformed(ActionEvent zdarzenie) {

        if(robol.statki[0][0] == 1){
            A1.setText("Trafiony");
            if(robol.statki[1][0] == 0 && robol.statki[0][1] == 0){
                A1.setText("Zatopiony");
            }
        }
        else{
            A1.setText("Pudło");
        }
    }

i tak dla każdego z przycisków osobno?. Czy istnieje jakiś szybszy sposób? Zastanawiam się czy jest możliwe, żeby przy tworzeniu przycisków w pętli automatycznie odwoływały się do odpowiednich pól mojej tablicy statki?Tak, żebym nie musiał tworzyć unikalnego kody w metodzie actionPerformed dla każdego przycisku.

Z góry dzięki za pomoc.

edytowany 1x, ostatnio: flowCRANE
nie100sowny
Czy stworzyłeś te 100 przycisków ręcznie jeden po drugim? :0
FT
nie, stwierdziłem, że lepiej najpierw się dopytać :)
nie100sowny
Aha by pisałeś w czasie przeszłym. "Dodałem 100 buttonów"
FT
Same przyciski tak, żeby były widoczne w ramce dodałem w pętli, ale nie obsługiwały żadnych zdarzeń.
krzysiek050
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:1272
0

Możesz w pętli dodawać eventHandler który wywoła metodę z pozycją przycisku

Kopiuj
for(int i = 0; i<10; ++i){
   for(int j = 0; j<10; ++j){
       Button btn = new Button();
       btn.setOnAction(ev -> buttonClicked(i, j));
   }
}

W metodzie buttonClicked(int i, int j) obsługujesz zdarzenie wciśnięcia konkretnego przycisku.

edytowany 2x, ostatnio: krzysiek050
FT
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:4
0

Dzięki, jednak nie bardzo wiem jak dodawać eventHandler, byłbym wdzięczny gdybyś wyjaśnił bardziej szczegółowo lub dał linka gdzie byłoby to pokazane

Haskell
  • Rejestracja:prawie 10 lat
  • Ostatnio:12 miesięcy
  • Postów:4700
0

Ziomuś, w kodzie powyżej już masz ustawiony event handler setOnAction. Weź ten kod i napisz metodę buttonClicked(int i, int j), to wszystko co musisz zrobić.


Zaglądali do kufrów, zaglądali do waliz, nie zajrzeli do d**y - tam miałem socjalizm. Czesław Miłosz
R1
  • Rejestracja:około 10 lat
  • Ostatnio:około 5 lat
  • Postów:208
0
farmer_tedd napisał(a):

Dzięki, jednak nie bardzo wiem jak dodawać eventHandler, byłbym wdzięczny gdybyś wyjaśnił bardziej szczegółowo lub dał linka gdzie byłoby to pokazane

to zależy bo np. @krzysiek050 podał przykład w JavaFX a z tego co widzę to Ty piszesz w Swing-u więc u Ciebie to powinno wyglądać mniej więcej tak

Kopiuj
 for(int i = 0; i<10; ++i){
   for(int j = 0; j<10; ++j){
       JButton btn = new JButton();
       btn.addActionListener(ev -> buttonClicked(i, j));
   }
}
FT
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:4
0

Dodałem tak jak napisałeś

Kopiuj
 
 public void dzialaj(){
        statki = new Statki();

        JFrame ramka = new JFrame();
        JPanel panel = new JPanel();

        for( int i = 0; i<10; i++){
            for(int j = 0; j<10; j++){
                btn = new JButton();
                btn.addActionListener(ev -> buttonClicked(i, j));
                panel.add(btn);
            }
        }

        ramka.getContentPane().add(BorderLayout.CENTER,panel);
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ramka.setSize(500,350);
        ramka.setVisible(true);

        statki.graj();
    }

i zdefiniowałem metodę buttonClicked

Kopiuj



public void buttonClicked(int i, int j){
        System.out.println(i + ", " + j);
        if(statki.robol.statki[i][j]==1){
            btn.setText("trafiony");
        }
        else{
            btn.setText("pudło");
        }
    }

i dostaję taki komunikat

local variables referenced from a lambda expression must be final or effectively final

odnośnie składowych 'i' i 'j' w pętli przy dodawaniu zdarzenia

Haskell
  • Rejestracja:prawie 10 lat
  • Ostatnio:12 miesięcy
  • Postów:4700
1

Jednym ze sposobów na rozwiązanie tego problemu jest przypisanie zmiennych do pól final i przekazanie ich do lambdy.


Zaglądali do kufrów, zaglądali do waliz, nie zajrzeli do d**y - tam miałem socjalizm. Czesław Miłosz
FT
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:4
0

mam jeszcze jedno pytanie, w metodzie buttonClicked chcę ustawić, żeby za każdym kliknięciem danego przycisku, przycisk ten został usunięty,a w jego miejsce został wstawiony plik jpg, i tu mam problem, bo jpg pojawia się dopiero po zminimalizowaniu okna, co zrobić ,żeby plik jpg uwidocznił się bezpośrednio po kliknięciu?

Kopiuj
public void buttonClicked(int i, int j) {
        int indeks = i*10 + j;
        panel2.remove(przyciski[i][j]);
        mojObraz = new JLabel(new ImageIcon(("C:\\Users\\Admin\\Desktop\\moje.jpg")));
        panel2.add(mojObraz, indeks);
        ramka.repaint();
    }
 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.