Na początek, poczytaj sobie o LinkedList. Jest to najbardziej odpowiednia struktura danych do tego zadania, ponieważ ruch węża polega na zabraniu jednego klocka z końca i dołożenie nowego na początku. Cała reszta się nie zmieni.
- Stwórz enum Direction który będzie określał kierunek. Kierunek nie jest właściwością węża. Cała masa innych przedmiotów tez posiada kierunek i gdybyś chciał dodać inne do programu, to dublowałbyś kod. Dlatego dzielenie na klasy zacznij od zrobienia enuma z kierunkiem.
- Głowa nie jest osobnym bytem. Jest po prostu pierwszym elementem na liście. Jeżeli zmienisz strukturę danych na LinkedList, będziesz mógł łatwo pobrać pierwszy element. Czyli pole head odpadnie.
Po zastosowaniu się do powyższych wskazówek, zostaną Ci tylko 2 pola:
public class Snake {
public LinkedList<Point> body;
public Direction headDirection;
}
To jest stanem węża. Podstawie tego kodu, możesz określić gdzie jest każda część węża, oraz przewidzieć jaki będzie następny ruch. Do rysowania wystarczy samo ciało, więc stwórz metodę która je zwróci. Powinna to być kopia tej listy, tak żeby nikt z zewnątrz nie mógł sam zmienić stanu węża. Może on tylko zobaczyć w jakim stanie jest wąż.
Na początku wąż będzie jednak bez ciała. Musisz stworzyć konstruktor tego obiektu, który jakoś zainicjuje wszystkie wartości. Może przykładowo przyjąć listę punktów początkowych a kierunek przyjąć sam. Jeżeli to zrobisz, to będziesz mógł stworzyć i zobaczyć węża, ale nie będziesz mógł się nim ruszyć. Czas więc na to.
Po pierwsze, trzeba umożliwić graczowi zmianę kierunku. Wystarczy setter ustawiający pole, chociaż możesz go nazwać jakoś lepiej.
Po drugie, musisz zrobić metodę update(), która przesunie węża. Coś, co obecnie miało robić MoveHead(). Zauważ jednak że działa ona dobrze, tylko gdyby na polu była wisienka, bo nie usuwa ogona. To też musisz przerobić.
Kilka uwag na koniec.
- Musisz napisać własną klasę Point. Ta z AWT służy do określenia punktu w kontrolce, a nie punktu na Twojej planszy. Jeżeli kiedyś zechcesz przeportować tą grę na Androida, to pojawi się problem, bo tam tej klasy nie ma.
- Ustawiaj jak najmniejszy dostęp. Wszystkie pola powinny być prywatne. Wyobraź sobie, że masz zrobić obiekt węża na podstawie klasy którą napisałeś, dać go swojemu koledze, a on ma go zniszczyć w jakikolwiek sposób mając dostęp do Twojej klasy. Teraz możliwości ma mnóstwo. Może ustawić pusty lub zły (np. 400) kierunek, pododawać losowe punkty w ciele, lub nawet je usunąć ciało. Jeżeli dobrze napiszesz klasę, to będzie mógł co najwyżej go przesuwać według Twoich reguł, ale nic nie zepsuje. Serio zrób taki test.
- Żadna metoda w środku węża nie powinna niczego wypisywać na ekran. Jeżeli chcesz się dowiedzieć co się dzieje aktualnie z wężem, to pobierasz jego stan i wtedy możesz go wypisać na ekran.
- Metody w javie piszemy w camelCase, czyli zaczynasz małą literą.
Zrób węża z tymi 2 polami i 4 metodami i wklej tutaj. Tylko zanim zabierzesz się za pisanie przestudiuj czym jest i dokładnie w jaki sposób działa LinkedList. Nie musisz szukać tylko w javowych źródłach bo to ogólna struktura danych która znajduje się w prawie każdym języku.