Żeby kontynuować tajemnice węża do Wigilii Świąt Bożego Narodzenia, mam jeszcze jedną małą zagwozdkę, nie mogę wymyślić dlaczego zawracanie węża o długości równej lub większej od 3 wywołuje koniec gry, a węża o długości równej 2 już nie.. Poniżej 2 metody:
public void step() {
int x = (int) Math.round(Math.random() * 20); // zmienne do losowania współrzędnych dla jedzenia
int y = (int) Math.round(Math.random() * 20);
setDirection(direction); // ustawiam kierunek
setFood(food); // ustawiam jedzenie
this.headX += direction.getDx(); // Dla każdego z kierunków jest zdefiniowana zmiana pozycji węża w poziomie i pionie po wykonaniu ruchu w danym kierunku
this.headY += direction.getDy();
if (this.getHeadX() == food.getX() && this.getHeadY() == food.getY()) // Jeżeli wąż zjadł pożywienie
{
snakeLength++; // zwiększam jego długość
points++; // zwiększam ilość zdobytych punktów
this.food = new SnakeFood(x, y); // ustawiam jedzenie na nowej pozycji (narazie nie sprawdzam, czy stworzy się "na" wężu
setFood(food); // ustawiam jedzenie
gsl.gamePointsChanged(); // informuje słuchacza zdarzeń o zmianie punktów
snakeElement.add(snakeLength-1, new SnakeElement(this.headX, this.headY)); // Dodaje element na koniec listy
}
snakeElement.add(0, new SnakeElement(this.headX, this.headY));// Tworzę głowę (jej nową pozycję) na 0 miejscu listy
snakeElement.remove(snakeElement.size()-1); // usuwam stary element
if (gameIsOver())
{
gsl.gameFinished(); // informuje słuchacza zdarzeń, że skończyłem grę
}
}
public boolean gameIsOver() {
if (headX < 0 || headX > heigth || headY < 0 || headY > width) // Jeżeli snake wyleciał poza planszę
{
return true;
}
for (int i = 1; i < snakeLength; i++)
{
if (snakeElement.get(0).getX() == snakeElement.get(i).getX() && snakeElement.get(0).getY() == snakeElement.get(i).getY()) // jeżeli snake ugryzł sam siebie no i... jeżeli zawrócił co niestety nie działa..
{
gsl.gameFinished();
}
}
return false;
}