Ja choć kodu nie śledziłem (i pewnie do końca bym go nie zrozumiał) to zakładam, że problemem jest obsługa wszystkich wciśniętych klawiszy, zamiast tylko jednego, pomiędzy danymi klatkami;
Nie wiem za bardzo jak wygląda buforowanie klawiszy w Javie, jednak rozwiązaniem będzie obsługa jednego (pierwszego lub ostatniego w buforze), po czym bufor powinien zostać wyczyszczony (jeśli takie coś się stosuje w Javie); Dzięki temu pomiędzy danymi klatkami, wąż będzie mógł skręcić tylko raz i w jednym kierunku;
Niestety kodu nie podam, bo nie programuję w Javie - chodzi mi o samo założenie, które pomogą Ci zaimplementować użytkownicy, znający Javę w wystarczającym stopniu;
Spróbuj zrobić tak:
- w każdej iteracji głównej pętli gry:
- pobierz z bufora jeden klawisz,
- wyczyść bufor klawiatury (?),
- rozpoznaj nowy kierunek węża na podstawie pobranego z bufora klawisza:
- jeśli kierunek jest ten sam co aktualny lub jemu przeciwny - zignoruj jego obsługę "skęcania",
- zaktualizuj dane węża (nowy kierunek, nowa pozycja itd.),
- wykonaj wszystkie dodatkowe operacje (np. obsługę walnięcia w barierkę, zjedzenia owoca itd.),
- jeśli wąż nie przywalił w barierkę - narysuj na ekranie nową klatkę;
To ogólny algorytm poruszania się węża.