Java snake poruszanie się

Witam, mam problem z poprawną implementacją poruszania się snake w tablicy dwuwymiarowej, ruch snake polega na zamiane wartościami w tablicy, problem mam gdy długość węża jest większa niż 1, wtedy nie występuje poprawna zamiana wartościami w tablicy, cały wąż przesuwa się w górę lub dół lub też w lewo się przesuwa wydłużając się. To jest link do repozytorium na gicie z moim programem: https://github.com/marcinkk/projekty_ja … SnakeSwing

Snake w tej chwili jeszcze nie porusza się sam czyli z użyciem wątków tylko każdy ruch to jedno kliknięcie strzałkami.

Pozdrawiam i proszę o uwagi i sugestie dotyczące programu.

Nie przechowuj tablicy w której 1-wąż jest, 0-węża nie ma, bo nie znajdziesz końca.

Wąż jest kolejką punktów - dodajesz na przód, usuwasz z tyłu, gdy dodajesz, a wąż osiągnął już swoją długość. Użyj więc Queue (np. LinkedList) do przechowywania tych punktów.

W tej chwili jeszcze nie umiem poprawnie użyć kolejki do przechowywania węża, dlatego w moim programie wąż to wartość 1, ściana planszy to -1, a puste pole to 0.

Zagadka: Które 1 to głowa, a które ogon? :wink:

Jak nie chcesz użyć kolejki to mógłbyś nadawać poszczególnym częściom węża różne numery, np. 1 to głowa, a kolejne numery to kolejne części węża; przy przesuwaniu zwiększasz pola >0 o 1, wstawiasz w odpowiedniej komórce 1 (w zażeności od kierunku, obok poprzedniej pozycji głowy), jeśli wąż nie ma się wydłużyć to zerujesz komórkę z największą liczbą (stary ogon).

A co stoi na przeszkodzie, żebyś się nauczył? Interfejs List ma raptem 5-6 najważniejszych metod. Z listą (najlepiej LinkedList, bo ta służy do szybkiej iteracji) ruch węża jest bardzo prosty do zaimplementowania. Przenosisz gdzieś samą głowę, a każdemu następnemu segmentowi nadajesz pozycję, jaką we wcześniejszej turze miał poprzednik.

możemy w tej chwili pominąć problem głowy?? robiłem zamianę miejsc i bardzo dobrze działa gdy długość węża wynosi 1, ale jak zrobić żeby gdy np wąż ma długość 5 wąż jest poziomo i głowa ma przesunąć się do góry o jedną kratkę, w moim programie wtedy cały wąż się przesuwa o jedną kratkę do góry zamiast przesunąć w poziomie zmniejszyć się o jedną kratkę i przesunąć również o jedną kratkę do góry. obecnie do rysowania używam for-a

Dodane 13.07.2013 (So) 16:54

przepraszam że tak uparłem się na tablice ale wydaje mi się że nawet gdy używam kolejki do przechowywania współrzędnych węża to i tak muszę odpowiednią wartość wstawić w tablice żeby później narysować węża.

Bo nadal nie rozumiesz algorytmu poruszania się węża… Wszystkim segmentom próbujesz nadać ten sam ruch co głowie, a nie tak to ma być.

możesz więc wyjaśnić prawidłowy algorytm poruszania się węża??

Dodane 14.07.2013 (N) 16:12

umiem napisać żeby gdy poruszam się w lewo ostatni element przechodził na początek i był głową. myślę że z poruszaniem w prawo również sobie poradzę, ale to wszytko tylko wtedy gdy wąż jest w jednej linii.

  1. [*:3e16kgpa]Przesuwasz głowę na nowe miejsce, a każdy następny element na miejsce poprzedniego. Jeśli wąż ma się wydłużyć to na starym miejscu ostatniego elementu dodajesz nowy. Żeby wiedzieć, który element następuje po którym, musisz znać ich kolejność :wink: [*:3e16kgpa]Na nowym miejscu głowy dodajesz nowy element. Jeśli wąż ma się nie wydłużyć, usuwasz ostatni element. Żeby wiedzieć, który element jest ostatni, musisz znać kolejność elementów (jak usuniesz ostatni element to nowym ostatnim elementem będzie stary przedostatni, itd., więc musisz znać kolejność wszystkich).

Obie metody są właściwie równoważne, obie wymagają pamiętania kolejności elementów.

Przykładowy snake http://speedy.sh/XQEVT/snake.rar. Sterowanie: WSAD, wyjście Q.

Co prawda napisany w C, ale kod jest w miarę prosty, więc nie powinieneś mieć problemów, najważniejsze jest w funkcjach go, move, findHead i findEnd :smiley:

Przypomniało mi się że kiedyś na wykładzie się nudziłem:

Przyspieszone 2 lub 4x, mało FPSów żeby oszczędzać energię. Nie ma reklam więc możesz puścić w zwolnionym tempie (YT na HTML5 na to pozwala)

~1:20 zaczynam pisać implementację klasy Snake. Użyłem ArrayDeque.

a jakieś uwagi odnośnie kodu który mam na githubie a link wkleiłem w pierwszym poście??

Jak już chcesz mieć całość w tej tablicy, to musiałbyś wyszukiwać nr poprzedni i zamieniać z obecnym. A samą głową poruszałbyś w kierunku wg zmiennej zmienianej po naciśnięciu klawisza kierunku

Dodane 15.07.2013 (Pn) 16:35

Jak już koniecznie chcesz tablicę, to zrób sobie strukturę zamiast typu liczbowego, możesz sobie wtedy zapisać współrzędne elementu następnego :slight_smile:

mój problem to to że części ciała węża poruszają się w tym samym kierunku co głowa zamiast zamieniać tylko się miejscami. umiem się dostać do ostatniego elementu i nadać odpowiedni kierunek głowie, niestety gorzej z prawidłowym poruszaniem węża gdy skręca. przeanalizuje posty wyżej.