Gra Rycerze

Wraz z Pawłem Malinowskim i Rafałem Todorskim napisaliśmy super-extra grę rycerze!

Oczywiście, pomysł jest zadaniem zaliczeniowym:

I. Wstęp.
Za siedmioma górami, za siedmioma lasami starożytne królestwo nawiedził wielki i potężny Kamienny Smok. Wiele szkód uczynił: podpalał lasy i chłopskie chaty, porywał owce i dzieci (powiadano, że trafiały potem na jego stół). Wielu śmiałków próbowało już zgładzić potwora, żadnemu jednak nie udało się dotąd dotrzeć do jego legowiska, gdyż droga doń wiodła przez Labirynt. Niezwyczajny był to Labirynt – pełno w nim bezdennych przepaści, dziwnych, wybuchających miejsc i magii. Próbowano już wyburzać mury – ale po pewnym czasie odrastały jak przebiśniegi; zamurowywano przepaście, ale po pewnym czasie cegły rozsypywały się w proch. Aż wreszcie przybyła drużyna słynnych pięciu bohaterów pod twoim dowództwem aby zmierzyć się z Niebezpieczeństwem. Dla okolicznych mieszkańców po raz pierwszy zaświecił promień nadziei.

[adsense]

II. Opis.

1. Plansza
Plansza labiryntu jest podzielona na kwadraty – pola labiryntu. Gracz “chodzi” po labiryncie 5 rycerzami. W jednym ruchu gracz może przesunąć jednego z rycerzy na jedno z czterech pól mających wspólną krawędź z polem, na którym stoi przesuwany rycerz, pod warunkiem, ze nie jest to pole z murem (patrz opis pól labiryntu), że nie jest to pole zajęte przez innego rycerza i że pole mieści się na planszy. (Niektórzy rycerze poruszają się inaczej, patrz ich opis.) Numery pól planszy rosną w dół i w prawo.

Plansza labiryntu jest plikiem o formacie opisanym w punkcie 5.

2. Rycerze.
Każdy uczestnik wyprawy należy do jednej z 4 kategorii:
rycerz Nadzwyczajny
Nie posiada żadnych wyróżniających zdolności, poza wyjątkowym uporem w dążeniu do celu.
rycerz Zjadacz
Posiada specjalną, stalową Sztuczną Szczękę, pozwalającą przegryzać niektóre typy murów. Niestety posiada ona ograniczoną liczbę zębów, a zjedzenie jednego muru powoduje utratę jednego z nich. Liczba zębów którą posiada Zjadacz na początku gry zależy od planszy – labiryntu; zużyte zęby może sobie wymienić na nowe w specjalnym polu – magazynie dentystycznym (patrz opis pól labiryntu). Niestety, w żadnym momencie gry Szczęka nie może posiadać więcej zębów, niż na początku planszy.
rycerz Budowniczy
Nie rozstaje się nigdy z workiem pełnym cegieł. Jego specjalnością jest zamurowywanie Bezdennych Przepaści. Nowe cegły może otrzymać w magazynie budowlanym. Niestety, pojemność jego worka jest ograniczona (ograniczenie zależy od planszy i jest wyznaczone przez liczbę cegieł posiadanych po uruchomieniu planszy).
rycerz Skoczek
Potrafi przeskoczyć nad jednym polem labiryntu, niezależnie od tego, jakiego rodzaju jest to pole. Często bywa wykorzystywany jako zwiadowca, co niestety czasem kończy się jego niespodziewaną śmiercią (jeśli wpadnie do dziury lub na minę – gracz nie zawsze widzi pole na które skacze Skoczek). Zgodnie z ogólnymi zasadami nie może skoczyć na pole znajdujące się poza labiryntem, pole z innym rycerzem lub z murem.
3. Pola labiryntu
pole zwykłe
Pole, na które rycerz może wejść, nie mające żadnych własności dodatkowych.
pole mur
Można spotkać dwa rodzaje murów: mury jadalne i wieczne. Mury wieczne są to pola, na które gracz nigdy nie może wejść. Nie można ich zjeść; nie zniszczy ich nawet mina. Mury jadalne są to pola, na które rycerz nie może wejść, chyba że usunie mur poprzez zjedzenie go lub wybuch miny. Zburzenie takiego muru jest tylko czasowe – mur odrasta po 20 jednostkach czasu. Jeżeli na tym polu stoi w tym momencie rycerz, to ginie.
pole z miną
Jeśli rycerz wejdzie na pole z miną, mina wybucha. W polu rażenia miny znajduje się pole, na którym mina była umieszczona oraz wszystkie pola, które miały wspólną krawędź z tym polem. Wszystkie mury jadalne znajdujące się w polu rażenia miny ulegają zburzeniu, a wszyscy rycerze giną. Pod wpływem czarów działających w labiryncie po 20 jednostkach czasu od wybuchu miny na polu tworzy się nowa mina.
pole teleport
Każdy rycerz, który znajdzie się na tym polu, zostanie przeteleportowany na inne pole znajdujące się na planszy. Na szczęście jeden teleport może przenosić tylko w jedno miejsce. Jeśli miejsce docelowe jest zajęte (mur, inny rycerz), to teleport nie działa.
pole dziura
Rycerz, który stanie na to pole wpada w przepaść bez dna i ginie. Każda dziura ma swój rozmiar – jest to liczba cegieł, której potrzebuje rycerz Budowniczy do jej zamurowania. Jeśli rycerz ma za mało cegieł, nawet o jedną, to niestety ginie. Nikną też jego cegły (dziura się nie zmniejszyła). Po zamurowaniu można bezpiecznie przechodzić przez pole z dziurą dopóki pod wpływem czarów działających w labiryncie cegły użyte do zamurowania nie rozsypią się w proch, co następuje po 30 jednostkach czasu. Jeśli jakiś pechowiec stoi akurat na tym polu w momencie rozsypania się cegieł, to ginie.
pola magazyny
Na początku gry każdy magazyn ma pewną, określoną liczbę zasobów (magazyn dentystyczny – zębów, a magazyn budowniczy – cegieł), która jest równa pojemności magazynu. Od momentu, w którym liczba zasobów w magazynie stanie się mniejsza niż jego pojemność, alchemicy rozpoczynają produkcję nowego zasobu. Niestety, czas produkcji jednego zasobu to aż 50 jednostek czasu. Alchemicy zaprzestają produkcji, jeśli skończy się wolne miejsce w magazynie. Magazyny są dwóch typów:
pole magazyn cegieł
Na tym polu rycerz Budowniczy może uzupełnić worek z cegłami. Ładowanie cegieł do worka odbywa się w momencie wejście rycerza na pole z magazynem cegieł. Oczywiście tylko wtedy, gdy rycerz jest budowniczym – w przeciwnym przypadku nic się nie dzieje.
pole magazyn dentystyczny
Na tym polu rycerz Zjadacz może uzupełnić brakujące zęby w Stalowej Szczęce. Uzupełnianie odbywa się w momencie wejścia na pole; jeśli na pole wejdzie rycerz o innej specjalności niż Zjadacz, nic się nie dzieje.
pole legowisko smoka
To tu mają dotrzeć rycerze. Jeśli rycerz dojdzie do legowiska smoka, to ukrywa się tam, czekając na resztę towarzyszy (liczba rycerzy, którzy muszą dojść do tego miejsca jest określana w pliku z danymi). Wynika stąd, że gracz nie może go już przesuwać.

4. Inne
Rycerz, który zginął w labiryncie, znika z planszy. Jedna jednostka czasu w labiryncie to jeden ruch – czyli jedno przesunięcie rycerza (pod wpływem działania magii czas utracił swoją ciągłość). Gracz widzi pola, na których stoją rycerze, pola, które mają wspólną krawędź z jednym z pól, na których stoją rycerze, oraz wszystkie pola, które widział do tej pory. “Widzenie” pola oznacza, że gracz wie, jakiego typu ono jest, oraz zna pewne jego parametry:
w przypadku pola dziury, jest to jej szerokość, czyli liczba cegieł, potrzebna do jej zamurowania;
w przypadku magazynu, wie ile i jakie zasoby magazyn posiada w danej chwili.
Nie widzi jednak:
dokąd prowadzi teleport;
ile jeszcze czasu pozostało do odrośnięcia muru, do odnowienia się dziury lub miny.

5. Format pliku z labiryntem.
Liczba całkowita dodatnia (w), podana w pierwszym wierszu pliku jest wysokością labiryntu. W drugim wierszu znajduje się liczba równa szerokości labiryntu (s). W następnych w wierszach znajduje się zakodowany opis pól planszy – w każdym wierszu znajduje się opis s pól. (Opis pola labiryntu o współrzędnych (i,j) znajduje się więc w i+2 wierszu i jest to j-ty z kolei symbol). Symbole kodujące pola planszy są oddzielone średnikami. Lista symboli:

Z (pole zwykłe)
J (mur jadalny)
W (mur wieczny)
M (pole z miną)
Tn,m (teleport przenoszący rycerza na pole o współrzędnych (n,m), gdzie 1<=n<=w, 1<=m<=s)
Dk (pole dziura, k jest liczbą całkowitą dodatnią opisującą, jaka jest szerokość dziury, czyli ile potrzeba cegieł, aby ją zamurować)
Cp (magazyn cegieł, p jest liczbą całkowitą dodatnią określającą pojemność magazynu)
Mp (magazyn dentystyczny, p jest liczbą całkowitą dodatnią określającą pojemność magazynu)
L (legowisko smoka, takie pole jest na planszy dokładnie jedno)

W następnym wierszu znajduje się para liczb całkowitych oddzielona średnikiem. Są to współrzędne wejścia do labiryntu (wiersz, kolumna). W kolejnym wierszu znajduje się 5 symboli (oddzielonych średnikami) opisujących drużynę rycerzy:
N (Rycerz Nadzwyczajny)
Zn (Rycerz Zjadacz; n jest liczbą całkowitą dodatnią opisującą liczbę zębów, jaką posiada on w swojej Stalowej Szczęce)
Bn (Rycerz Budowniczy; n jest liczbą całkowitą dodatnią opisującą liczbę cegieł znajdujących się w jego worku)
S (Rycerz Skoczek)
W ostatnim wierszu znajduje się liczba całkowita dodatnia nie większa od 5, określająca, ilu rycerzy musi dojść do legowiska smoka, aby gracz został uznany za zwycięzcę.

Ponieważ na jednym polu labiryntu może stać tylko jeden rycerz (oczywistym wyjątkiem jest legowisko smoka), to rycerze na polu startowym pojawiają się pojedynczo (gdy jeden zejdzie z tego pola wchodzi tam następny – o ile jeszcze jest oczywiście – kolejność jest zadana kolejnością w danych).

Można założyć poprawność danych.

Przykładowy plik z planszą może więc wyglądać w ten sposób:
4
3
Z;L;W
T1,2;Z;J
C2;D1;Z
M1;Z;W
4;2
N;S;B3;Z2;S
3

III. Zadanie.
Napisz program umożliwiający przeprowadzenie pojedynczej rozgrywki. Program ma na początku wczytać planszę, potem ma ją wyświetlić i umożliwić graczowi wykonywanie poszczególnych ruchów. Interfejs powinien być graficzny (przyciski, mysz) i sensownie wygodny.

A tu printscreen:

Screen Gry Rycerze

A to rozwiązanie:

Gra Rycerze i Kod źródłowy

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s