Wąż - algorytm


Podrozdziały:

 

obrazek

 

 

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.

Tworzenie planszy gry

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
obrazek

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.

Ruch głowy węża

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
obrazek

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.

Wypisywanie długości węża

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
obrazek

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.

Generowanie malinek

Symbol Przeznaczenie w algorytmie
p struktura COORD zawierająca pozycję malinki w obrębie okna konsoli
obrazek

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.

Rozgrywka

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
obrazek

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.

Odczyt klawiatury

Symbol Przeznaczenie w algorytmie
kierunek zmienna określa kierunek ruchu głowy węża
obrazek

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ę.

Usunięcie ogona węża

Symbol Przeznaczenie w algorytmie
p struktura COORD zawierająca współrzędne końcowego segmentu węża
obrazek

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.

Koniec rozgrywki

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
obrazek

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   
im. Kazimierza Brodzińskiego
w Tarnowie

©2021 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

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