Witam!
Piszę snake'a i znów mam problem. Otóż mam klasę snake, która reprezentuje gracza na ekranie. Niezbędna do jej działania jest klasa punkt - tak naprawdę to jej obiekty są wyświetlane na ekranie. W klasie snake mam zatem dynamiczną tablicę vector, w której mieszczę owe punkty. Jest w niej także funkcja "skrec", która przesuwa snake'a w którymś z kierunków (prawo, lewo, góra, dół - są reprezentowane przez enum) i korzysta z funkcji "przesun" w klasie punkt (mówię to tylko na marginesie). Oto ona:
void snake::skrec(kierunki gdzie)
{
if(kierunek_ruchu != gdzie)
{
for(int i = 0; i < tablica_punktow.size(); i++)
{
tablica_punktow[i].kierunek = gdzie;
for(int m = 0; m < tablica_punktow.size(); m++) tablica_punktow[m].przesun(tablica_punktow[m].kierunek);
wyswietl(); // Wyświetla snake'a na ekranie
Sleep(50);
}
kierunek_ruchu = gdzie; // Koñcowe poprawki
}
else for(int i = 0; i < tablica_punktow.size(); i++) tablica_punktow[i].przesun(tablica_punktow[i].kierunek);
}
Jak widać, jej działanie jest całkiem proste. Sprawdza, czy kierunek, który sobie zażyczyliśmy (argument) jest inny niż aktualny i wykonuje skręt. Jeśli nie, to nie ma przecież potrzeby skręcania. Wtedy po prostu przesuwamy snake w "starym" kierunku.
W sumie wszystko działa, poza dwoma usterkami, nad którymi już długo się zastanawiałem, i nie mogłem znaleźć przyczyny. Pierwszą (i ważniejszą) z nich jest to, że skręt w górę jest wykonywany nie tak jak trzeba. Powód właściwie znam - po instrukcji " tablica_punktow[i].kierunek = gdzie;" indeksy w vectorze się jakby odwracają. Tzn. głowa zamiast indeksu zerowego ma ostatni. Tak mi się wydaje. I w dodatku dzieje się tak tylko dla skrętu w górę. Oprócz tego pozostaje jeszcze drobnostka - kiedy snake'a podąża w kierunku innym niż prawo (domyślny) poszczególne punkty są oddalone od siebie jedną spacją. Nie mam pojęcia, o co chodzi z tymi dwoma sprawami, dlatego zwracam się tu o pomoc.
[EDIT]: klasa punkt:
class punkt // Klasa, która bêdzie reprezentowaæ punkty na ekranie, na przyk³ad fragmenty wê¿a
{
public:
int pozycja; // Pozycja punktu na ekranie
char znak; // Znak reprezentuj¹cy punkt na ekranie
kierunki kierunek; // Soecjalnie dla wê¿a. Reprezentuje kierunek poruszania siê konkretnego fragmentu
punkt() : pozycja(0), znak('*'), kierunek(prawo) {} // Konstruktor domniemany
void wyswietl() // Funkcja "wrzucaj¹ca" punkt na ekran
{
string wypis;
wypis += znak;
ekran.insert(pozycja, wypis);
}
void przesun(kierunki gdzie); // Funkcja pozwala na przemieszczanie punktu po ekranie
};
- jeszcze jej klasy (osobny plik cpp)
void punkt::przesun(kierunki gdzie)
{
switch(gdzie)
{
case prawo:
pozycja++;
break;
case lewo:
pozycja--;
break;
case gora:
pozycja -= 80;
break;
case dol:
pozycja += 80;
break;
}
}
===========================================================================================
Na prośbę @twonek udostępniam cały kod:
Plik main.cpp : http://pastebin.com/R0SC2sDp
Plik Menu.cpp : http://pastebin.com/mxLDQLeg
Plik Gra.cpp : http://pastebin.com/kabWR7SH
Plik Punkt.h : http://pastebin.com/QDpKWsUr
Plik Punkt.cpp : http://pastebin.com/MKijDNhA
Plik Snake.h : http://pastebin.com/QHVd14Zh
Plik Snake.cpp : http://pastebin.com/gXSMDUPF
Plik Enum.h : http://pastebin.com/0DPvzvn9