Wpisany przez Dominik Goździuk,
05 stycznia 2012 11:43
Snake – gra komputerowa, w której gracz za pomocą klawiszy strzałek steruje wężem. Wąż porusza się w zamkniętym prostokącie i nie może „uderzyć” w samego siebie. Zadaniem gracza jest zdobycie jak największej liczby punktów, poprzez karmienie węża pojawią cym się na ekranie pokarmem (przyjąłem, że są to jabłka).
Założenia gry:
Inicjalizacja gry
Inicjalizacja gry polega na utworzeniu planszy, ściany, ustawieniu węża na planszy, wylosowaniu współrzędnych pokarmu i wyświetlenie go na planszy oraz utworzenie obiektu klasy Timer, który steruje całym programem. Współrzędne każdego kawałka ciała węża przechowywane są w liście ArrayList, osobno współrzędna x i y (równie dobrze można użyć tablicy dwuwymiarowej). Potrzebne są również cztery zmienne logiczne, które będą przechowywały aktualny kierunek poruszania się węża. W danym momencie tylko jedna z tych zmiennych przyjmuje wartość prawda, a pozostałe mają wartość fałsz (wąż porusza się w jednym kierunku na raz ;) Przyda się również zmienna liczbowa, która będzie przechowywała liczbę elementów ciała węża. Ciało węża, pokarm i cegiełki ściany są obrazkami. Dla odróżnienia głowa i reszta ciała są innego koloru.
Sprawdzenie kolizji
Sprawdzenie kolizji odbywa się za pomocą metody checkCollision(). Metoda ta sprawdza czy którekolwiek dwa kawałki ciała węża nie mają tych samych współrzędnych. Następnie sprawdza czy wąż nie przekroczył którejkolwiek ze ścian. Jeśli jeden z tych warunków jest spełniony gra kończy się.
Poruszanie
Za poruszanie się węża odpowiada metoda move(). Metoda ta przypisuje każdemu kawałkowi ciała węża współrzędne elementu który znajduje się przed nim, oprócz głowy. (Załóżmy, że mamy w liście pięć elementów. Interesują nas indeksy od 1 do 4, ponieważ nie uwzględniamy głowy. Tak więc element o indeksie 4 otrzyma wartość elementu o indeksie 3, element o indeksie 3 otrzyma wartość elementu o indeksie 2 itd. ). Sprawa głowy jest nieco trudniejsza ponieważ musimy sprawdzić w którą stronę aktualnie porusza się wąż. (z pomocą przychodzą wcześniej wspomniane zmienne logiczne). W zależności od kierunku poruszania się węża odpowiednio zmieniamy współrzędne głowy. (dodajemy lub odejmujemy 10 pikseli do pierwszego elementu listy x lub y).
Wyświetlenie pokarmu
Jeśli wąż zjadł swój pokarm, należy wyświetlić następny. Odpowiada za to metoda locateApple(). W tym celu losujemy dwie wartości całkowite. Sprawdzamy czy na wylosowanej współrzędnej nie znajduje się ciało węża. Jeśli nie wyświetlamy w tym miejscu pokarm, w przeciwnym wypadku powtarzamy losowanie.
Zjedzenie pokarmu
Do sprawdzenia czy wąż zjadł swój pokarm służy metoda checkApple(). W metodzie tej sprawdzamy czy współrzędna głowy węża pokrywa się ze współrzędną pokarmu. Jeśli tak wyświetlamy nowy pokarm, powiększamy węża (zwiększamy o jeden liczbę jego elementów) i dodajemy 10 punktów do wyniku. W mojej implementacji całością programu steruje klasa Timer. Po naciśnięciu przycisku "Start" Timer jest uruchamiany. Klasa ta wykonuje podane w metodzie actionPerformed() działania co pewien podany okres czasu. Jest to kolejno:
Pliki źródłowe:
Założenia gry:
- Nie ma limitu czasowego
- Plansza jest ograniczona do prostokąta ograniczonego ścianami
- Wąż nie może uderzyć w samego siebie
- Wąż nie może uderzyć w ścianę
- Wąż porusza się ze stałą prędkością
- Jeden element ciała węża ma wielkość 10 pikseli.
- Po najechaniu na pokarm gracz otrzymuje 10 punktów, a jego waż staje się większy
- Wężem steruje się za pomocą strzałek
- Gra kończy się w momencie gdy wąż uderzy w samego siebie lub w ścianę
Inicjalizacja gry
Inicjalizacja gry polega na utworzeniu planszy, ściany, ustawieniu węża na planszy, wylosowaniu współrzędnych pokarmu i wyświetlenie go na planszy oraz utworzenie obiektu klasy Timer, który steruje całym programem. Współrzędne każdego kawałka ciała węża przechowywane są w liście ArrayList, osobno współrzędna x i y (równie dobrze można użyć tablicy dwuwymiarowej). Potrzebne są również cztery zmienne logiczne, które będą przechowywały aktualny kierunek poruszania się węża. W danym momencie tylko jedna z tych zmiennych przyjmuje wartość prawda, a pozostałe mają wartość fałsz (wąż porusza się w jednym kierunku na raz ;) Przyda się również zmienna liczbowa, która będzie przechowywała liczbę elementów ciała węża. Ciało węża, pokarm i cegiełki ściany są obrazkami. Dla odróżnienia głowa i reszta ciała są innego koloru.
Sprawdzenie kolizji
Sprawdzenie kolizji odbywa się za pomocą metody checkCollision(). Metoda ta sprawdza czy którekolwiek dwa kawałki ciała węża nie mają tych samych współrzędnych. Następnie sprawdza czy wąż nie przekroczył którejkolwiek ze ścian. Jeśli jeden z tych warunków jest spełniony gra kończy się.
Poruszanie
Za poruszanie się węża odpowiada metoda move(). Metoda ta przypisuje każdemu kawałkowi ciała węża współrzędne elementu który znajduje się przed nim, oprócz głowy. (Załóżmy, że mamy w liście pięć elementów. Interesują nas indeksy od 1 do 4, ponieważ nie uwzględniamy głowy. Tak więc element o indeksie 4 otrzyma wartość elementu o indeksie 3, element o indeksie 3 otrzyma wartość elementu o indeksie 2 itd. ). Sprawa głowy jest nieco trudniejsza ponieważ musimy sprawdzić w którą stronę aktualnie porusza się wąż. (z pomocą przychodzą wcześniej wspomniane zmienne logiczne). W zależności od kierunku poruszania się węża odpowiednio zmieniamy współrzędne głowy. (dodajemy lub odejmujemy 10 pikseli do pierwszego elementu listy x lub y).
Wyświetlenie pokarmu
Jeśli wąż zjadł swój pokarm, należy wyświetlić następny. Odpowiada za to metoda locateApple(). W tym celu losujemy dwie wartości całkowite. Sprawdzamy czy na wylosowanej współrzędnej nie znajduje się ciało węża. Jeśli nie wyświetlamy w tym miejscu pokarm, w przeciwnym wypadku powtarzamy losowanie.
Zjedzenie pokarmu
Do sprawdzenia czy wąż zjadł swój pokarm służy metoda checkApple(). W metodzie tej sprawdzamy czy współrzędna głowy węża pokrywa się ze współrzędną pokarmu. Jeśli tak wyświetlamy nowy pokarm, powiększamy węża (zwiększamy o jeden liczbę jego elementów) i dodajemy 10 punktów do wyniku. W mojej implementacji całością programu steruje klasa Timer. Po naciśnięciu przycisku "Start" Timer jest uruchamiany. Klasa ta wykonuje podane w metodzie actionPerformed() działania co pewien podany okres czasu. Jest to kolejno:
- Wyświetlenie pokarmu
- Sprawdzenie kolizji
- Ruch węża
- Wywołanie metody paint, która przeniesie węża na nową pozycję.
Pliki źródłowe:
- Widok.java – dziedziczy klasę JPanel. Jest to prostokąt w którym porusza się wąż. Zawiera wszystkie wyżej opisane algorytmy niezbędne do działania programu.
- KoniecGry.java – dziedziczy klasę JDialog. Okienko które wyskakuje gdy nastąpi koniec gry. Umożliwia wpisanie swojego imienia i zapisanie wyniku.
- OknoWyniki.java – dziedziczy klasę JDialog. Wyświetla 10 najlepszych wyników, które są przechowywane w pliku tekstowym.
- Snake.java – główna klasa programu, dziedziczy klasę JFrame.
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Dominik Goździuk | Java | .java | .java | ***** / 19 |
Poprawiony: 05 stycznia 2012 11:51
program może się więc zawieszać