Poruszanie snakiem.

0

Witam, mam problem z poruszaniem moim wężem (pierwsza gra w czystym c++ :D). Otóż, po naradzie z użytkownikami tego forum, dowiedziałem się że najłatwiejszym sposobem ruchu węża jest przesuwanie jego tyłu przed głowę, czyli tak jakby przemeblowanie ciała :P Na początku pomysł wydawał mi się doskonały i dużo lepszy niż mój własny. Tak więc przystąpiłem do realizacji zadania.
Klasy, które mają znaczenie:
klasa punkt - reprezentuje (na ekranie) jakiś punkt, np. fragment węża. Zawiera składniki: obiekt określający pozycję punktu na ekranie, typ wyliczeniowy określający nazwę fragmentu (np głowa) oraz znak za pomocą którego będziemy ten punkt pokazywać na ekranie;
klasa snake - wykorzystuje kontener vector z obiektami typu punkt. Reprezentuje naszego węża. Najważniejsza funkcja składowa to ruch(kierunki gdzie), zawierająca argument typu kierunki (typ wyliczeniowy z wartościami: prawo, lewo, gora, dol) oraz funkcja wyświetl odpowiadająca za wstawianie do ekranu, a właściwie do stringu później wyświetlanego na ekranie.

No więc, jak już powiedziałem, klasa snake ma funkcję składową ruch(kierunki gdzie). Oto jej definicja:

 void ruch(kierunki gdzie) // kierunki to typ wyliczeniowy enum
    {
        switch(gdzie)
        {
            case prawo: // jeśli mamy poruszyć wężem w prawo
                if(gdzie != kierunek_ruchu)
                {
                    // Będą tu instrukcje do skręcania
                }
                else
                {
                    punkt* cialo;

                    for(int i = 0; i < tablica_punktow.size(); i++)
                    {
                        if(tablica_punktow[i].segment == tyl) cialo = &tablica_punktow[i]; // Segment to składnik klasy punkt, jest typu wyliczeniowego z trzema wartościami - glowa, nic, tyl
                    }

                    cialo->pozycja += (tablica_punktow.size() - 1);

                    for(int i = 0; i < tablica_punktow.size(); i++)
                    {
                        if(tablica_punktow[i].segment == glowa) tablica_punktow[i].segment = tyl;
                    }

                    cialo->segment = glowa;

                    for(int i = 1; i < (tablica_punktow.size() - 1); i++)
                    {
                        tablica_punktow[i].segment = nic;
                    }
                }
            break;

            case lewo:
                //if(gdzie != kierunek_ruchu); itd...
            break;
 
            case gora:
                
            break;
            
            case dol:
            
            break;
        }

Składnik segment to obiekt typu wyliczeniowego enum. Jest on po to, żeby wiedzieć gdzie w danej chwili mamy głowę węża, gdzie tył, a gdzie nic ważnego (po prostu punkty pomiędzy). Po każdym przesunięciu fragmentu węża trzeba te wartości odpowiednio zmieniać, żeby odpowiadały obecnej sytuacji. Nie mam pojęcia, dlaczego program nie spełnia moich oczekiwań. Punkty przemieszczają się nie tak jak bym chciał, tzn pierwsze dwa punkty poruszają się tak, że raz pozostaje między nimi przerwa jednego znaku, a w następnej klatce są obok siebie. Posuwają się tak jak powinny, w prawo. Natomiast ostatni punkt stoi w miejscu, nic się z nim się dzieje. W razie potrzeby postaram się wrzucić zdjęcia/filmik. Możecie coś poradzić?

0

Nie mógłbyś wrzucić całości na pastebina? Umożliwiłoby to przetestowanie i szukanie na debuggerze

3

Nie rozumiem zbytnio Twojego pomysłu. Wąż ma jedną głowę, nie łatwiej uznać za nią po prostu pierwszy element kontenera punktów? Analogicznie z ostatnim dla końca kontenera. Wtedy wystarczy trzymać kierunek przodu węża i po kłopocie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1