Wyjście Spis treści Poprzedni Następny
Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych. Autor: mgr Jerzy Wałaszek, wersja 3.0 |
©2008 mgr
Jerzy Wałaszek |
Algorytm gry rozwiążemy poznaną wcześniej metodą zstępującą. Na początku musimy zainicjować generator liczb pseudolosowych, ponieważ w grze korzystamy z tych liczb do generacji położenia malinek dla naszego węża. W języku Pascal wystarczy w tym celu wydać polecenie Randomize, które inicjuje generator liczb pseudolosowych wartością odczytaną z zegara systemowego.
W pętli głównej kolejno wyświetlamy stronę tytułową gry, generujemy planszę, po której będzie poruszał się wąż oraz gramy rozgrywkę, która zakończy się śmiercią węża.
Na końcu sprawdzamy, czy gracz chce zakończyć grę. Jeśli nie, pętla będzie kontynuowana.
Procedurę Strona Tytułowa pominiemy,
ponieważ była ona już wielokrotnie opisywana w poprzednich grach. Dokładnie
natomiast zajmiemy się pozostałymi trzema procedurami:
Plansza - procedura rysuje planszę gry oraz ustawia wartości początkowe wszystkich zmiennych wykorzystywanych przez grę
Graj - prowadzi rozgrywkę, aż do śmierci wiersza.
Koniec - tworzy animowany efekt śmierci
węża po uderzeniu w przeszkodę. Wyświetla napisy końcowe oraz upewnia się, że
gracz chce zakończyć grę. Zwraca wartość logiczną true, jeśli tak lub false w
sytuacji przeciwnej. Wartość zwracana przez tę funkcję jest wykorzystywana przy
kontynuacji lub przerwaniu pętli warunkowej.
Symbol | Przeznaczenie w algorytmie |
---|---|
kierunek | określa kierunek ruchu węża: 1 - w górę, 2 - w prawo, 3 - w dół i 4 w lewo |
głowa | struktura COORD zawierająca aktualne współrzędne głowy |
pk | wskaźnik początku kolejki |
kk | wskaźnik końca kolejki |
i | zmienna sterująca pętli |
Zadaniem tej procedury jest narysowanie na ekranie planszy gry, umieszczenie na niej węża złożonego początkowo z 5 segmentów oraz wygenerowanie w przypadkowej pozycji malinki.
Rozpoczynamy od narysowania tła planszy, które jest po prostu prostokątem zbudowanym z 22 wierszy po 78 kolumn każdy. Plansza powinna posiadać tło zielone.
Po narysowaniu prostokąta rysujemy barierkę ograniczającą w formie ramki wokół tego prostokąta.
Następnie inicjujemy zmienne wykorzystywane przez grę. Zmienną kierunek ustawiamy na 2, co oznacza ruch głowy węża w prawą stronę. Inicjujemy strukturę głowa na współrzędne 38 kolumny i 11 wiersza. Współrzędne te będą odnosiły się do początkowej pozycji ogona węża. Następnie ustawiamy wskaźniki kolejki pk i kk. Zwróć uwagę, iż wskaźnik pk wskazuje ostatni element struktury, a kk wskazuje pierwszy element. Jest to konieczne, ponieważ pierwszy zapis do kolejki powinien trafić do elementu o indeksie 0. Porusz sposób zapisu do kolejki, który umieściliśmy powyżej.
W pętli iteracyjnej wykonywanej 5 razy rysujemy kolejne segmenty węża przesuwając głowę w prawą stronę. Dokona tego procedura Ruch Głowy, którą opisujemy poniżej. Wąż pojawi się na polu gry.
Następnie wypisujemy pod polem gry długość węża za pomocą
procedury
Długość i generujemy malinkę, którą wąż się pożywi w
trakcie gry. Plansza jest gotowa.
Symbol | Przeznaczenie w algorytmie |
---|---|
kierunek | określa kierunek ruchu węża: 1 - w górę, 2 - w prawo, 3 - w dół i 4 w lewo |
głowa | struktura COORD zawierająca aktualne współrzędne głowy w polach X i Y |
z | zmienna zapamiętująca znak odczytany z okienka konsoli na pozycji głowy |
W zależności od zawartości zmiennej kierunek modyfikujemy odpowiednio współrzędne pozycji głowy węża na planszy gry. Następnie odczytujemy znak z okienka konsoli, który znajduje się na pozycji głowy węża. W zależności od kodu tego znaku algorytm gry rozpoznaje, czy wąż w coś uderzył swoim łbem. Odczytany znak umieszczamy tymczasowo w zmiennej pomocniczej z, którą zwrócimy jako wartość funkcji.
Współrzędne zawarte w strukturze głowa zapisujemy w kolejce za pomocą procedury Zapisz, której schemat blokowy podaliśmy na początku rozdziału. Zostaną one później wykorzystane do wymazania tego segmentu z okienka konsoli, gdy segment stanie się ogonem węża.
Na koniec wyświetlamy literkę O w kolorze żółtym na zielonym tle
na pozycji zawartej w zmiennej głowa. Ruch został
wykonany, zatem kończymy algorytm zwracając zawartość zmiennej
z, czyli znak, który znajdował się na planszy zanim
umieściliśmy w tym miejscu literkę O.
Symbol | Przeznaczenie w algorytmie |
---|---|
pk | wskaźnik początku kolejki |
kk | wskaźnik końca kolejki |
dk | długość kolejki cyklicznej, czyli długość węża |
N | ilość elementów struktury, wewnątrz której zawarta jest kolejka cykliczna |
Liczba segmentów węża jest po prostu długością kolejki
cyklicznej, którą obliczamy według metody opisanej na początku rozdziału. Po
wyznaczeniu długości w zmiennej dk wypisujemy ją wraz
z tekstem opisowym na spodzie okienka konsoli.
Symbol | Przeznaczenie w algorytmie |
---|---|
p | struktura COORD zawierająca pozycję malinki w obrębie okna konsoli |
Procedura generuje jedzenie dla naszego gada, czyli malinki. Malinka pojawia się w przypadkowym miejscu planszy. Na początku algorytmu generujemy w pętli warunkowej współrzędne malinki, które umieszczamy w zmiennej p. Warunkiem zakończenia pętli jest to, aby plansza na pozycji p była pusta, czyli zawierała znak spacji.
Gdy znajdziemy taką pozycję, to umieszczamy na niej malinkę,
czyli fioletową gwiazdkę i kończymy algorytm.
Symbol | Przeznaczenie w algorytmie |
---|---|
licznik | zmienna wykorzystywana wewnątrz pętli do zliczania obiegów |
c | przechowuje zawartość planszy na aktualnej pozycji głowy węża |
Rozgrywka jest prowadzona wewnątrz pętli warunkowej, która wykonuje się aż do momentu, gdy głowa węża uderzy w barierkę lub w segment samego węża. W takim przypadku znak z pozycji głowy na planszy nie jest spacją i pętla zostanie przerwana.
Na początku algorytmu ustawiamy licznik obiegów pętli na 0 oraz wstępnie znak c na spację i rozpoczynamy wykonywanie pętli warunkowej.
Wewnątrz pętli odczytujemy klawiaturę i jeśli został naciśnięty odpowiedni klawisz kursora, zmieniamy kierunek ruchu głowy węża. Następnie wprowadzamy małe opóźnienie i zwiększamy licznik obiegów o 1.
Jeśli licznik osiągnie wartość 15, to zerujemy go i wykonujemy ruch głową węża w kierunku zdefiniowanym przez zawartość zmiennej kierunek - porusz algorytm wykonywania ruchu głową, który opisaliśmy powyżej. Do zmiennej c trafia znak z planszy, który znajdował się na aktualnej pozycji głowy węża.
Jeśli znakiem tym była gwiazdka, to wąż właśnie zjadł malinkę, W takim przypadku wpisujemy do c znak spacji, aby pętla warunkowa wciąż była wykonywana. Generujemy nową malinkę oraz wypisujemy długość węża. Zwróć uwagę, iż ponieważ dokonaliśmy ruchu głową, to do kolejki trafiły nowe współrzędne, zatem wzrosła jej długość o 1.
Jeśli c nie zawiera gwiazdki, to musimy wykasować ostatni segment ogona węża, co da wrażenie ruchu. Dokonujemy tego za pomocą odpowiedniej procedury.
Na końcu pętli sprawdzamy warunek jej zakończenia i jeśli zachodzi, kończymy rozgrywkę - wąż w coś uderzył i musi zginąć. W przeciwnym razie pętla jest kontynuowana - wąż sunie po planszy.
Po zakończeniu pętli kończymy algorytm rozgrywki.
Symbol | Przeznaczenie w algorytmie |
---|---|
kierunek | zmienna określa kierunek ruchu głowy węża |
Procedura odczytu klawiatury jest bardzo prosta. Na początku sprawdzamy, czy został naciśnięty jakikolwiek klawisz. Jeśli nie, kończymy.
W przypadku naciśnięcia klawisza przez gracza odczytujemy jego
kod i sprawdzamy, czy jest to jeden z klawiszy kursora. Jeśli tak, to dokonujemy
odpowiedniej modyfikacji zmiennej kierunek i kończymy
procedurę.
Symbol | Przeznaczenie w algorytmie |
---|---|
p | struktura COORD zawierająca współrzędne końcowego segmentu węża |
Po ruchu głowy w dowolnym kierunku musimy wymazać ostatni segment
węża. Da to złudzenie, iż cały wąż porusza się po planszy. Wymazanie segmentu
jest bardzo proste, gdy stosujemy kolejkę cykliczną. W tym celu wystarczy
odczytać współrzędne z kolejki i umieścić je w zmiennej p.
Następnie ustawiamy pozycję wydruku wg odczytanych współrzędnych, kolor tła
wydruku zielony i drukujemy spację. Ostatni segment zostanie wymazany.
Symbol | Przeznaczenie w algorytmie |
---|---|
p | struktura COORD zawierająca współrzędne segmentów węża |
pk | wskaźnik początku kolejki cyklicznej |
kk | wskaźnik końca kolejki cyklicznej |
klawisz | przechowuje kod naciśniętego klawisza |
Procedura ta jest wykonywana na końcu gry, gdy wąż kierowany przez gracza uderzy w barierkę lub w samego siebie. Na początku dokonujemy prostej animacji - zastępujemy wszystkie literki O tworzące wizerunek węża (z wyjątkiem głowy, która pozostanie niezmieniona) przez białe literki X symbolizujące szkielet (przy pewnej dozie wyobraźni). Zadanie to realizujemy odczytując kolejne współrzędne segmentów węża z kolejki cyklicznej i umieszczając na tych współrzędnych literkę X. Odczyt przerywamy, gdy wskaźnik końca kolejki kk będzie równy wskaźnikowi jej początku pk.
Następnie wypisujemy napis o zakończeniu gry. Odczekujemy pół sekundy i sprawdzamy, czy w buforze klawiatury są jakieś kody klawiszy. Jeśli tak, odczytujemy je, lecz ignorujemy. Ten krok jest konieczny, ponieważ gracz mógł jeszcze naciskać klawisze kursora, gdy wąż uderzył w przeszkodę. Gdybyśmy nie wyczyścili bufora klawiatury, to program odczytałby te kody jako zakończenie całej gry - zobacz na koniec schematu blokowego.
Po wyczyszczeniu bufora klawiatury wypisujemy tekst z zapytaniem
o kontynuację dalszej gry. Jeśli gracz gracz naciśnie klawisz T, zwrócona
zostanie wartość logiczna false, co spowoduje powtarzanie pętli warunkowej w
programie głównym. Dowolny inny klawisz spowoduje zwrócenie wartości logicznej
true, zatem pętla warunkowa w programie głównym zostanie przerwana i program
zakończy się.
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe