[C++]: Snake -> ruch węża

Awatar użytkownika
Peter Zof
Użytkownik
Użytkownik
Posty: 585
Rejestracja: 30 cze 2012, o 16:07
Płeć: Mężczyzna
Lokalizacja: Warszawa (MIMUW) / Pułtusk
Podziękował: 88 razy
Pomógł: 66 razy

[C++]: Snake -> ruch węża

Post autor: Peter Zof »

Witam!

Napisałem już wężyka, ale nadal nie mogę zbudować odpowiedniej pętli gry ponieważ nie wiem jak mam przypisywać wartość do zmiennej: kierunek_ruchu.
Chodzi o to, że wężyk się rysuje wszystko w porządku, jednak kiedy on sobie leci w stronę np. prawą (domniemanie) to nie mam możliwości zmiany kierunku, a gdy dam instrukcje wczytania to cała gra się zatrzymuje ponieważ program czeka aż użytkownik przypisze klawisz do zmiennej Proszę Was o jakiś pomysł jak to zrobić ponieważ nic od kilku dni nie przychodzi mi do głowy
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++]: Snake -> ruch węża

Post autor: Ser Cubus »

poczytaj o funkcji kbhit() z windows.h
Awatar użytkownika
Peter Zof
Użytkownik
Użytkownik
Posty: 585
Rejestracja: 30 cze 2012, o 16:07
Płeć: Mężczyzna
Lokalizacja: Warszawa (MIMUW) / Pułtusk
Podziękował: 88 razy
Pomógł: 66 razy

[C++]: Snake -> ruch węża

Post autor: Peter Zof »

A czy ona nie była czasem w conio.h ?

Tak ogólnie to już sobie poradziłem właśnie tą funkcją. Robiłeś może wężyka pod konsole?
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++]: Snake -> ruch węża

Post autor: Ser Cubus »

nie, a co do biblioteki, to rzeczywiście pomyliło mi się
Awatar użytkownika
Peter Zof
Użytkownik
Użytkownik
Posty: 585
Rejestracja: 30 cze 2012, o 16:07
Płeć: Mężczyzna
Lokalizacja: Warszawa (MIMUW) / Pułtusk
Podziękował: 88 razy
Pomógł: 66 razy

[C++]: Snake -> ruch węża

Post autor: Peter Zof »

Kurcze bo mam już sporo, ale nie wiem jak utworzyć tablicę która będzie przechowywała pozycje każdego punktu węża. Nie mogę jej zrobić jako składnika klasy bo musi mieć ona rozmiar \(\displaystyle{ 2 \cdot \text{snake\_length}}\) a to jest nie możliwe bo ta zmienna "długość węża" nie jest stałą
lemoid
Użytkownik
Użytkownik
Posty: 199
Rejestracja: 24 maja 2012, o 23:36
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 5 razy
Pomógł: 30 razy

[C++]: Snake -> ruch węża

Post autor: lemoid »

tablice dynamiczne-- 1 kwi 2013, o 14:29 --czyli <vector> i tak dalej
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++]: Snake -> ruch węża

Post autor: Ser Cubus »

vector ma stały rozmair o ile się nie mylę, jak go przekroczysz to trzeba kopiować całą tablicę do nowej większej

użyj listy

Kod: Zaznacz cały

#include <list>
Awatar użytkownika
Peter Zof
Użytkownik
Użytkownik
Posty: 585
Rejestracja: 30 cze 2012, o 16:07
Płeć: Mężczyzna
Lokalizacja: Warszawa (MIMUW) / Pułtusk
Podziękował: 88 razy
Pomógł: 66 razy

[C++]: Snake -> ruch węża

Post autor: Peter Zof »

Kurde nie robiłem jeszcze nic z tymi listami Pomyślałem, żeby może stworzyć dynamicznie alokowano tablicę statyczną. Do jej dwóch pierwszych elementów wpisałbym współrzędne głowy węża, a reszta obliczana by była na podstawie ruchu....jednak dynamiczne - statyczna tablica to chyba nic dobrego? Co o tym myślisz?
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++]: Snake -> ruch węża

Post autor: Ser Cubus »

mozesz zrobic tablicę, ale przemyśl jej rozmair, jeżeli będzie zbyt mała to program się wysypie, jeżeli będzie używał <vector> to po przekraczeniu określonego rozmaru (nie wiem jakiego) komputer przekopiuje wszytko do nowego większego wektora

lista będzie najlepszym rozwiązaniem, szybkie tworzenie, dodawanie i usuwanie elementów. I szczerze mówiąc to ni jest nic trudnego, będziesz używał tylko iteracji po kolejnych elementach listy oraz funkcji insert
lemoid
Użytkownik
Użytkownik
Posty: 199
Rejestracja: 24 maja 2012, o 23:36
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 5 razy
Pomógł: 30 razy

[C++]: Snake -> ruch węża

Post autor: lemoid »

Przecież vector z definicji jest to tablica dynamiczna i nie ma żadnego narzuconego rozmiaru.

Kod: Zaznacz cały

vector < int > tab;
Jeżeli wąż powiększa się po zjedzeniu punktu, to wtedy nic więcej co użycie tab.push_back, a współrzędne punktów możemy zmieniać poprzez iterację elementów tablicy, gdzie elementem granicznym jest .size()-1.

To jednak by zmuszało nas do reprezentacji współrzednych na zasadzie:
tab[0] = x1;
tab[1] = y1;
tab[2] = x2;
tab[3] = y2;
...
nie jest też to wielkim problemem, bo jak widać współrzędne x są pod parzystymi(łącznie z zerem) indeksami tablicy a odpowiadajace im współrzędne y to n+1.

Choć jak zasugerował Cubus, lista to też dobre rozwiązanie
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C++]: Snake -> ruch węża

Post autor: kadiii »

To jednak by zmuszało nas do reprezentacji współrzednych na zasadzie:
tab[0] = x1;
tab[1] = y1;
tab[2] = x2;
tab[3] = y2;
Oczywiście jeśli to C++ to zamiast vectora/listy intów lepiej dać vector obieków reprezentujących współrzędne, względnie struktur jeśli jest to program C-style.
Jeśli chodzi o samo rozwiązanie to można je zrobić albo w sposób przejrzysty od strony modelu albo "algorytmiczny" usuwając niepotrzebne dane i dodając optymalizacje(kosztem przejrzystości). Nie pierwszy rzut oka widać, że jest parę innych, alternatywnych rozwiązań, które niekoniecznie korzystają z listy współrzędnych. Warto trochę pokombinować, niezależnie jaką drogę finalnie wybierzesz.
Awatar użytkownika
Peter Zof
Użytkownik
Użytkownik
Posty: 585
Rejestracja: 30 cze 2012, o 16:07
Płeć: Mężczyzna
Lokalizacja: Warszawa (MIMUW) / Pułtusk
Podziękował: 88 razy
Pomógł: 66 razy

[C++]: Snake -> ruch węża

Post autor: Peter Zof »

Panowie, a co myślicie o czymś takim?

static int *tablica = new int [2 * rozmiar_wezyka ];

Sama się ładnie powiększa, a do tego jest statyczna :D Więc mam dostęp do 'starych współrzędnych'
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++]: Snake -> ruch węża

Post autor: Ser Cubus »

strzelam, że nie miałeś jeszcze klas, więc niech będzie struktura

ale wąż rośnie i co wtedy? kopiujesz całą tablicę? Wężyk naprawdę jest idealnym zastosowaniem listy, nawet interpretacja graficzna listy kojarzy się z wężykiem
Awatar użytkownika
Peter Zof
Użytkownik
Użytkownik
Posty: 585
Rejestracja: 30 cze 2012, o 16:07
Płeć: Mężczyzna
Lokalizacja: Warszawa (MIMUW) / Pułtusk
Podziękował: 88 razy
Pomógł: 66 razy

[C++]: Snake -> ruch węża

Post autor: Peter Zof »

Cały czas używam klas Jednak wydaje mi się, że gdy ta tablica byłaby statyczna to tylko przy powiększeniu wężyka niby te dynamiczne powiększanie dotyczyłoby dwóch nowych elementów o które już odpowiednio zadbam Chyba, że się mylę i chociaż ta tablica będzie statyczna to będzie traciła dane :S

@edit: właśnie list nie miałem, a wężyk ma być jakby projektem który łączy poznaną teorię z praktyką. Niby napisałem te kółko i krzyżyk bo tego wymaga Pani, ale mam ochotę na coś mocniejszego
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++]: Snake -> ruch węża

Post autor: Ser Cubus »

tak, ale tych danych nie dodasz raz...
poza tym nie wiem po co Ci akurat ta tablica statyczna, zrob sobie klasę

Kod: Zaznacz cały

class cialo
{
int x,y;
cialo przesun(&cialo);
}
i zrob tablice

Kod: Zaznacz cały

cialo tab[100]
, ale to rozwiązanie jest bardzo nie ładne

co do listy, nie musisz wiedzieć co to jest, ani dlaczego to działa. Ciebie interesowałaby tylko funkcja dodawania elementów i usunięcia wszytkiego.
ODPOWIEDZ