Aplety - Kółko i krzyżyk
Aplety - Kółko i krzyżyk
No to napiszemy sobie grę, która może uatrakcyjnić naszą stronę internetową. Zanim zaczniemy powinieneś/powinnaś zapoznać się z podstawami pisania apletów. Grą tą będzie kółko i krzyżyk, więc zastanówmy się jakich obiektów potrzebujemy.
1. Na pewno musi być jakiś element, który będzie pokazywał jaki jest stan gry(czyja kolej, kto wygrał). Wykorzystamy do tego metodę paint(), która narysuje nam informację o tym.
2. Teraz plansza do gry podzielona na 9 pól. Zrobimy ją z 9 przycisków button.
3. Jeszcze przyda się opcja rozpoczęcia gry od nowa, czyli jeszcze jeden przycisk.
Takie założenia przyjąłem ja gdy postanowiłem napisać tą gierkę, więc myślę że na początek to wystarczy. Na samym początku należy importować dwie klasy, które są bardzo często używane w apletach, mianowicie:
import java.awt.event.*; // ta pozwala na obsługę zdarzeń
u mnie plik z grą to kik.class więc piszę:
Jest to niezbędne aby nasz program mógł reagować na zdarzenia(aby po kliknięciu pojawiło się na przycisku O lub X itd.). Teraz utworzymy zmienną, która będzie przechowywać stan gry:
Następnie należy zadeklarować obiekty - przyciski:
b2 = new Button(),
b3 = new Button(),
b4 = new Button(),
b5 = new Button(),
b6 = new Button(),
b7 = new Button(),
b8 = new Button(),
b9 = new Button(),
we = new Button("Nowa Gra");
chyba można się domyślić, które przyciski do czego służyć nam będą. Teraz z przycisków zrobimy planszę( wrzucimy je do kontenera):
GridLayout - rozmieszczenie siatkowe, polega na rozmieszczeniu komponentów w prostokątnej siatce o podanej liczbie kolumn i wierszy; wszystkie klatki tej siatki mają identyczne rozmiary,
{
Panel panel = new Panel();
panel.setLayout(new GridLayout(3,3));> // trzy kolumny i trzy wiersze(razem 9 pól)
panel.add(b1); panel.add(b2); panel.add(b3); //dodajemy przyciski
panel.add(b4); panel.add(b5); panel.add(b6);
panel.add(b7); panel.add(b8); panel.add(b9);
return panel;
}
Teraz wywołamy metodę paint(), która będzie nam pokazywać jaki jest stan gry:
{
g.drawString(user, 140, 70); // wyświetla wartość Stringa user
g.drawString("Stan gry/kolej:", 40, 70); //wyświetla napis do wartości user
} // aby gracz się nie pogubił ;)
Przyszła pora na inicjalizację apletu:
Panel panel = gridLayoutPanel();
setLayout(new BorderLayout());
add("South",panel);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
b6.addActionListener(this);
b7.addActionListener(this);
b8.addActionListener(this);
b9.addActionListener(this);
add("North",we);
we.addActionListener(this);
}
Na początku wrzucamy do apletu naszą planszę (panel), następnie każdy przycisk ustawiamy aby nasłuchiwał zdarzeń( aby mógł na nie reagować). Na końcu wrzucamy przycisk Nowa Gra i ustawiamy dla niego także ActionListener. Mamy już ustawione wszystko jeśli chodzi o interfejs graficzny naszej gry. Teraz należy oprogramować wciskanie przycisków. Do roboty:
public void actionPerformed(ActionEvent e) {
przesłonięcie metody actionPerformed, w tej części obsługuje się zdarzenia.
Tutaj pobieramy tzw. etykietę przycisku.
getSource() - informuje jaki przycisk został wciśnięty
getLabel() - informuje jaki jest napis na przycisku
dodam jeszcze bo się nam przyda:
setLabel() - ustawia teks na przycisku
Teraz obsłużymy ustawianie krzyżyka lub kółka na przycisku w zależności od graczy i tego czy na przycisku nie ma już jakiegoś znaku.
((Button)e.getSource()).setLabel("X"); //umieść na przycisku X
user = "O"; // zmień gracza na O
repaint(); } // przemaluj( bez tego nazwa zmiennej by się zmieniła ale napis nie)
if (((Button)e.getSource()).getLabel()=="" && user == "O") {
((Button)e.getSource()).setLabel("O");
user = "X";
repaint(); }
No i teraz zostało nam jedynie sprawdzanie czy ktoś nie wygrał oraz obsłużenie przycisku NOWA GRA.
b1.setLabel(""); b2.setLabel(""); b3.setLabel(""); b4.setLabel("");
b5.setLabel(""); b6.setLabel(""); b7.setLabel(""); b8.setLabel("");
b9.setLabel("");
user = "O"; repaint();
} // wyczyść napisy na przyciskach oraz ustaw wartość user na początkową
I teraz najdłuższa część. Należy sprawdzić wszystkie możliwości w jakich ktoś może wygrać:
user = "wygrał X"; repaint();
} else
if (b4.getLabel() == "X" && b5.getLabel() == "X" && b6.getLabel() == "X") {
user = "wygrał X"; repaint();
} else
if (b7.getLabel() == "X" && b8.getLabel() == "X" && b9.getLabel() == "X") {
user = "wygrał X"; repaint();
} else
if (b1.getLabel() == "X" && b5.getLabel() == "X" && b9.getLabel() == "X") {
user = "wygrał X"; repaint();
} else
if (b3.getLabel() == "X" && b5.getLabel() == "X" && b7.getLabel() == "X") {
user = "wygrał X"; repaint();
} else
if (b1.getLabel() == "X" && b4.getLabel() == "X" && b7.getLabel() == "X") {
user = "wygrał X"; repaint();
} else
if (b2.getLabel() == "X" && b5.getLabel() == "X" && b8.getLabel() == "X") {
user = "wygrał X"; repaint();
} else
if (b3.getLabel() == "X" && b6.getLabel() == "X" && b9.getLabel() == "X") {
user = "wygrał X"; repaint();
} else
if (b1.getLabel() == "O" && b2.getLabel() == "O" && b3.getLabel() == "O") {
user = "wygrało O"; repaint();
} else
if (b4.getLabel() == "O" && b5.getLabel() == "O" && b6.getLabel() == "O") {
user = "wygrało O"; repaint();
} else
if (b7.getLabel() == "O" && b8.getLabel() == "O" && b9.getLabel() == "O") {
user = "wygrało O"; repaint();
} else
if (b1.getLabel() == "O" && b5.getLabel() == "O" && b9.getLabel() == "O") {
user = "wygrało O"; repaint();
} else
if (b3.getLabel() == "O" && b5.getLabel() == "O" && b7.getLabel() == "O") {
user = "wygrało O"; repaint();
} else
if (b1.getLabel() == "O" && b4.getLabel() == "O" && b7.getLabel() == "O") {
user = "wygrało O"; repaint();
}
else
if (b2.getLabel() == "O" && b5.getLabel() == "O" && b8.getLabel() == "O") {
user = "wygrało O"; repaint(); }
else
if (b3.getLabel() == "O" && b6.getLabel() == "O" && b9.getLabel() == "O") {
user = "wygrało O"; repaint();
} else if (b1.getLabel() != "" && b2.getLabel() != "" && b3.getLabel() != "" &&
b4.getLabel() != "" && b5.getLabel() != "" && b6.getLabel() != "" &&
b7.getLabel() != "" && b8.getLabel() != "" && b9.getLabel() != "")
{ user ="REMIS !!!"; }
Na końcu jeżeli żaden z warunków nie jest spełniony, a jednak wszystkie przyciski są "zapisane" to wyskakuje słówko REMIS!!! To wszystko jest może długim kodem ale za to bardzo prostym. Jeśli trzy przyciski o tym samy napisie leżą w jednej linii to wtedy wyskakuje odpowiedni napis:
user = "wygrało O"; repaint();
użyto tu operatora && aby otrzymać informacje czy trzy przyciski tworzące jedną linię mają ten sam napis("O"). W przypadku jakiś wątpliwości proszę pisać do mnie.
Może na koncu podam cały kod tak na wszelki wypadek :).
( w dziale Kody źródłowe - Java)



public boolean isWinner(String s) {
if( (b[0].getLabel() == s && b[1].getLabel() == s && b[2].getLabel() == s) ||
(b[3].getLabel() == s && b[4].getLabel() == s && b[5].getLabel() == s) ||
(b[6].getLabel() == s && b[7].getLabel() == s && b[8].getLabel() == s) ||
(b[0].getLabel() == s && b[4].getLabel() == s && b[8].getLabel() == s) ||
(b[2].getLabel() == s && b[4].getLabel() == s && b[6].getLabel() == s) ||
(b[0].getLabel() == s && b[3].getLabel() == s && b[6].getLabel() == s) ||
(b[1].getLabel() == s && b[4].getLabel() == s && b[7].getLabel() == s) ||
(b[2].getLabel() == s && b[5].getLabel() == s && b[8].getLabel() == s) )
return true;
return false;
}
i wywołanie
if(isWinner(krzyzyk)) { napis = "wygrał "+krzyzyk; repaint(); } else
if(isWinner(kolko)) { napis = "wygrało "+kolko; repaint(); } else
for(int i=0; i<9; i++) {
if(b[i].getLabel() == "")
break;
if(i==8) napis ="REMIS !!!";
}
Cały program przy korzystaniu z tablic i małej optymalizacji zajmuje niecałe 70 linii
@Programista312 - jakie łatwiejsze sposoby niby są niż sprawdzanie tych raptem 8 warunków? Toż nawet stworzenie pętli, sprawdzającej czy tokeny są ustawione w rzędach lub kolumnach zajmie więcej niż 8 linii kodu.
jednak kod strasznie nadmiarowy - można to znacznie krócej napisać, np. używając tablic:
Button [] b = new Button[9];
i wszędzie stosować pętle:
for(int i=0; i<9; i++)
b[i] ...
sprawdzanie warunków też wtedy można znacznie uprościć
"import java.applet.*;"
i stworzyłem kik.html :
"<APPLET CODE="kik.class" WIDTH="250" HEIGHT="250"></APPLET>"
"Cannot find symbol. class Applet" (kompiluje pod NetBeans IDE 4.0 Beta 2), ale pod kompilatorem konsolowym tez sie nie chce i jest to samo
(dawciobiel@kozmianet.kom.pl)
dla mnie się przydał!
Na jego podstawie zaliczylem applet dla uniwerku.