[C++][Konsola] Snake (gra)


(Harry127) #1

Witam

Napisałem sobie wczoraj prototyp gry Snake w konsoli.

Skompilowany plik EXE [Wrzuc.to]

Kod źródłowy [codepad.org]

Cały kod źródłowy jest opatrzony komentarzami.

Poziom trudności zerowy, bo program czeka przy każdym ruchu na naciśnięcie klawisza. Chciałem zrobić tak, jak jest w normalnej grze: im dłuższy wąż, tym szybciej będzie się poruszał. No i oczywiście miałby się sam poruszać. Z tym, że nie wiem, jak np. sprawdzać co sekundę, czy został naciśnięty klawisz. Ja używam takiej funkcji, która czeka na naciśnięcie. Można to jakoś inaczej rozwiązać?

Generalnie to chciałbym zrobić taką gierkę podobną do tego Snake'a z laboratorium funkcji GMail (Old Snakey autorstwa Dave C.). I jeszcze miałoby być coś takiego, że jak wąż porusza się z określoną prędkością, a gracz naciśnie szybko klawisze parę razy (np. szybko góra-prawo-góra-prawo-góra-prawo), to wąż wykona te wszystkie ruchy, lecz z właściwą sobie prędkością.

Nie oczekuję gotowego kodu, lecz tylko podpowiedzi.

Dziękuję z góry i pozdrawiam

Krzysiek


([alex]) #2

http://msdn.microsoft.com/en-us/library ... 85%29.aspx


(Harry127) #3

Jeśli dobrze rozumiem, ta funkcja "odpowie" także, jeśli klawisz zostanie naciśnięty po poprzednim, a przed aktualnym wywołaniem funkcji, tak?

No i co w przypadku, gdy w tym czasie (między poprzednim a aktualnym wywołaniem funkcji) użytkownik kilka razy naciśnie różne klawisze?


(etam) #4

To ja zaproponuję coś zupełnie innego:

Spróbuj pobawić się biblioteką Allegro. Jest bardzo prosta w obsłudze i pozwoli ci rozwiązać twój problem z prędkością.

Dobry tutorial: http://www.glost.eclipse.co.uk/gfoot/vivace/vivace.html

Spis wszystkich funkcji z opisami: http://www.allegro.cc/manual/

Gra w węża, którą napisałem mieści się w 250 liniach kodu.


(Harry127) #5

@etam: Dzięki. Znalazłem sobie polski tutorial i widzę, że naprawdę ciekawa biblioteka.

Tylko teraz problem... Poczytałem trochę i zmieniłem kod na zgodny z Allegro.

Kod źródłowy [codepad.org]

I niby wszystko się ładnie kompiluje, nawet pojawia się belka na pasku zadań, ale po chwili belka znika, a okno nawet na chwilę się nie pojawia.

Co zrobiłem źle?


(etam) #6

1) Porównaj rozmiar main w klasie board i pętle for w 78 linii

2) Przemyśl jeszcze raz sens "dir=key[KEY_UP];" (linia 91) (w liniach 92-94 analogicznie)

3) zamiast

if(key[KEY_UP]) {...}

if(key[KEY_LEFT]) {...}

if(key[KEY_RIGHT]) {...}

if(key[KEY_DOWN]) {...}

użyj

if(key[KEY_UP]) {...}

else if(key[KEY_LEFT]) {...}

else if(key[KEY_RIGHT]) {...}

else if(key[KEY_DOWN]) {...}

4) zamiast robić bitmapy bmapple i bmsnake i bawić się w kopiowanie ich na ekran skorzystaj z rectfill.

5) użyj double bufferingu http://wiki.allegro.cc/index.php?title=Double_buffering

6) zrób tak, żeby wciśnięcie klawisza zmieniało kierunek poruszania się węża, ale żeby wąż poruszał się zawsze (nie tylko gdy jest wciśnięta strzałka)

7) Opcjonalnie: do trzymania pozycji węża użyj kolejki (użyj deque żeby można było nią przeszukiwać)

-- Dodane 05.06.2010 (So) 10:24 --

I jeszcze jedno: użyj timerów do kontroli prędkości gry http://wiki.allegro.cc/index.php?title=Timers