\documentclass{article}
\usepackage [polish]{babel}
\usepackage{latexsym}
\usepackage{t1enc}
\usepackage{polski}
\usepackage[latin2]{inputenc}
\usepackage{hevea}

% Odnośniki do załączników
\newcommand{\filename}[1]{\ahrefurl{#1}}
% Wygodny verbatim między \| |
\def\|{\verb|}
% Stopień kątowy
\def\deg{^\circ}
% Email autora
\newcommand{\authoremail}[0]{\mailto{mgajda@mimuw.edu.pl}}

% Nagłówek
\title{{\bf Eliksiry} \\ Zadanie zaliczeniowe z~Programowania~Obiektowego~2OO3/2OO4 \\ wersja 1.7, poprawiona 6 stycznia 2OO3}
\date{Warszawa, \today}
\author{Michał J.~Gajda \\ 
        \authoremail{}}

\begin{document}
\maketitle

Gra symuluje lekcję Eliksirów udzielaną w~szkole czarodziejów przez profesora Snape'a uczniom na roku Harry'ego Pottera.
Profesor Snape dzielił uczniów na grupy i~zlecał im sporządzenie odpowiedniego eliksiru.
Na lekcji byli obecni studenci z~dwóch różnych domów (akademików), między którymi
istniał silny duch konkurencji.
Zadaniem gracza jest pokierowanie parą uczniów przygotowujących swój eliksir
i~przeszkadzających w~stworzeniu eliksiru uczniowi z~domu konkurencyjnego.
Przeszkadzanie może polegać na blokowaniu dojścia do składników eliksiru lub podrzucaniu niewłaściwych
składników.

\section{Plansza}

Plansza składa się z~kwadratowych pól o~boku długości jednego metra.
Dwa pola nazywamy sąsiadującymi ze sobą, kiedy stykają się bokami lub rogami.
Dla uproszczenia odległość między dwoma polami możemy liczyć jako maksimum z~różnicy współrzędnych.

Występują poniższe rodzaje pól:
\begin{itemize}
\item pusta przestrzeń,
\item mur,
\item pojemnik ze składnikiem.
\end{itemize}

\section{Czarodziejki i~czarodzieje występujący w~grze}

Każdy z~czarodziejów (tzn. uczniów i~profesora Snape'a)
występujących w~grze zajmuje dokładnie jedno pole
(tzn. nie może być dwóch na jednym polu w~tym samym momencie).
Poruszają się kolejno, przechodząc przez co najwyżej $ n $ sąsiadujących pól nie zajętych przez innych.
(Parametr $ n $ jest określony w~pliku konfiguracyjnym.)
Czarodzieje nie mogą przechodzić przez ściany, ani pojemniki ze składnikami.

\subsection{Uczniowie}

Uczniowie profesora Snape'a mają kociołki, w~których jest tylko jeden rodzaj składnika lub mieszanki naraz.
Każdy uczeń widzi zawartość swojego kociołka i~kociołków uczniów sąsiadujących. 

Każdy uczeń należy do jednego z~dwóch domów: Gryffindoru i~Slytherinu. Studenci należący do tego samego domu
są przyjaźni wobec siebie: jeżeli ktoś z~tego samego domu próbuje wejść na pole zajmowane przez studenta,
to studenci zamieniają się miejscami.

Uczniowie po ruszeniu się mogą w~każdej turze wykonać jedną z~następujących akcji:
\begin{itemize}
\item dodać do kociołka składnik, przy którego pojemniku stoją,
\item wrzucić lub wlać całą zawartość własnego kociołka do kociołka sąsiada,
\item pokazać zawartość kociołka profesorowi do sprawdzenia (Snape musi być na polu sąsiadującym).
\end{itemize}

Zamiast poruszania się w~danej turze uczniowie mogą zakrywać swój kociołek.
Nie można nic wrzucić do zakrywanego kociołka, ani zobaczyć jego zawartości.
Efekt zakrywania trwa do momentu, gdy uczeń się ruszy lub wykona jakąś inną akcję.

\subsection{Zwykli uczniowie}

Dla uproszczenia nie symulujemy tworzenia eliksiru przez większość uczniów,
a~tylko przez wyróżnionych.

Zwykli uczniowie nie mają w~grze żadnego celu; ich strategią może być losowe poruszanie się po planszy.
Nie próbują też przepychać (zamieniać się miejscami) z~innymi uczniami, ani z~nauczycielem.
Nie próbują też oddawać wyników swojej ,,pracy'' nauczycielowi.

\subsection{Malfoy i~jego kumple}

Trzech uczniów należących do Slytherinu: Malfoy, Crabbe i~Goyle, konkuruje z~parą Harry'ego.
Malfoy próbuje przy użyciu dowolnej strategii (według uznania implementatora) stworzyć eliksir,
a~Crabbe i~Goyle aktywnie szukają destruktywnych składników i~próbują je wrzucić do kociołków
przenoszonych przez parę Harry'ego.
Składnik uważa się za destruktywny, jeśli jego wrzucenie na jednym z~etapów pracy
uniemożliwi stworzenie eliksiru i/lub uszkodzi studenta.

\subsection{Para Harry'ego}

Gracz w~dowolnie wybrany przez siebie sposób steruje parą uczniów należących do Gryffindoru: Hermioną i~Harrym Potterem.

\subsection{Profesor Snape}
Profesor Snape stara się pilnować, żeby uczniowie uczciwie pracowali nad eliksirem, zamiast sobie przeszkadzać.
Porusza się losowo, a~kierunek w~którym spogląda jest kierunkiem w~którym się poruszał,
wchodząc na ostatnie pole w~danej turze.
Profesor obserwuje wszystkich niezasłoniętych przez ściany studentów pod kątem $\pm 45\deg$ od kierunku w~którym patrzy.

Przykładowo:  jeśli profesor jest zwrócony na zachód, to obserwuje wszystkich uczniów pomiędzy przekątną
północno-zachodnią i~południowo-zachodnią.

Jeżeli profesor zauważy, że Harry lub Hermiona wrzucają coś do cudzego kociołka, to zmusza niegrzecznego studenta
do tłumaczenia się przez 3 tury. Przez ten czas niegrzeczny student nie może się poruszyć, ani zakryć kociołka.
Profesor Snape faworyzuje uczniów Slytherinu i~nie zwraca im uwagi, gdy wrzucają coś do kociołków studentów z~Gryffindoru.
Nie karci też Hermiony za wlewanie czegoś do kociołka Harry'ego i odwrotnie.

\section{Eliksiry}

Kolejność łączenia składników ma znaczenie.
Wrzucanie czegoś do mieszanki, w~której to coś już jest zawarte, nie daje żadnego efektu.
(Relacja zawierania jest przechodnia.)
Wrzucanie czegoś w~kolejności innej, niż opisana w~pliku konfiguracyjnym ,,psuje'' eliksir.
Dodawanie następnych składników do ,,zepsutego'' eliksiru nadal daje ,,zepsuty'' eliksir.
Każdy rodzaj składnika i~eliksiru ma opis, umożliwiający rozróżnienie między niektórymi rodzajami.
Nie posiadają opisu tylko eliksiry, które natychmiast po powstaniu ulegają zniszczeniu.
Gracz może oglądać opis eliksiru pary Harry'ego, jak i~opisy eliksirów przenoszonych w~odległości jednego pola
od pary Harry'ego.

Dla uproszczenia gry nie przejmujemy się proporcjami między poszczególnymi składnikami.

\subsection{Składniki}

Każdy składnik jest dostępny w~wyznaczonym miejscu na planszy w~ilości nieograniczonej.
Uczeń może przenosić tylko jeden rodzaj składnika lub mieszanki składników naraz.

\subsection{Efekty}

Po zmieszaniu składnika z~eliksirem mogą nastąpić różne ciekawe efekty:
\begin{itemize}
\item Wybuch może wysłać wszystkich uczniów w~promieniu kilku metrów do skrzydła szpitalnego.
Ranieni w~ten sposób studenci nie mogą już uczestniczyć w~tej lekcji.
(Profesor Snape, jako doświadczony czarodziej, potrafi się łatwo obronić przed skutkami wybuchu.)
\item Intensywne musowanie eliksiru może rozchlapać eliksir w~promieniu kilku metrów.
      Daje to podobny efekt, jak dodanie tego eliksiru do wszystkich eliksirów w~niezakrytych kociołkach
	  na tym obszarze. Twórca traci rozchlapany eliksir. 
	  Jeżeli rozchlapywany eliksir trafia do pustego kociołka, to staje się zepsuty.
	  Próba zakrywania musującego eliksiru się nie udaje.
\item Eliksir może być szkodliwy dla zdrowia lub nie.
      Zmienia to zachowanie profesora Snape'a i~studenta w~czasie oddawania mu eliksiru.
\item Eliksir może zacząći reagować, by po $ n $ turach przemienić się w~inny eliksir.
      Dla uproszczenia, jeżeli wrzucimy coś do eliksiru przed zakończeniem reakcji,
	  to zachowuje się on jakby wrzucono to coś na początku reakcji.
\end{itemize}

Składniki w~pojemnikach są zabezpieczone przed powyższymi efektami.
Zarówno wybuch, jak i~rozchlapanie wpływają tylko na uczniów i~zawartość kociołków niezasłoniętych przez ścianę.

\subsection{Oddawanie eliksiru}
Sposobem zwycięskiego zakończenia gry jest przekazanie właściwego eliksiru profesorowi.
Podczas oddawania eliksiru mogą się zdarzyć trzy przypadki:
\begin{enumerate}
\item Eliksir pokazany profesorowi przez studenta jest właściwym eliksirem. Wtedy gra się kończy zwycięstwem
tej strony, której reprezentant dostarczył ten eliksir.
\item Eliksir pokazany profesorowi przez studenta jest niewłaściwym eliksirem, a~właściwy eliksir byłby szkodliwy
dla zdrowia -- wtedy profesor mówi uczniowi, że ten przygotował zły eliksir.
\item Pokazany eliksir jest niewłaściwy, a~właściwy eliksir nie jest szkodliwy dla zdrowia -- wtedy profesor
wymaga od studenta ,,spróbowania'' tego eliksiru. Jeśli podawany eliksir jest szkodliwy (\|poisons|),
to student spędzi pozostałą część lekcji poza planszą (w~skrzydle szpitalnym szkoły).
\end{enumerate}
Gra kończy sie remisem, gdy cała trójka: Malfoy, Hermiona, jak i~Harry dostaną się do skrzydła szpitalnego.

\section{Plik konfiguracyjny}
Plik konfiguracyjny ma składnię kodu w~Smalltalku, którego wynikiem ma być obiekt opisujący scenariusz gry.
Występujące w~nim konstrukcje mają następujące znaczenie: \\
\|Ingredient new: | \emph{nazwa} \| mark: | \emph{oznaczenie na planszy} -- wprowadza nowy składnik.
Nazwa składnika jest widoczna na pojemniku.\\
\emph{x} \| description: | \emph{opis} -- dodaje opis do składnika lub mieszanki. Dwa obiekty o~tym samym opisie są nierozróżnialne dla czarodziejów.\\
\emph{a} \| + | \emph{b} -- mieszanka tworzona przez dodanie składnika \emph{b} do \emph{a}. \\
\emph{a} \| poisons | -- zaznacza, że \emph{a} jest szkodliwy dla zdrowia. \\
\emph{a} \| explodes: | \emph{zasięg} -- mieszanka \emph{a}~powstała w~kociołku natychmiast eksploduje,
raniąc studentów w~promieniu \emph{zasięg} metrów. \\
\emph{a} \| splash: | \emph{zasięg} -- stworzona mieszanka \emph{a}~powstała w~kociołku gwałtownie musuje,
rozchlapując się w~promieniu \emph{zasięg} metrów. \\
\emph{r} \| := | \emph{a} \| after: | \emph{liczba tur} -- po kilku turach mieszanka \emph{a} zamienia się w~\emph{r}.
\emph{a} \| wins | -- celem scenariusza jest stworzenie eliksiru \emph{a}. \\
\|GameLevel map: | \emph{mapa}
  \| ingredients: | \emph{tablica}
  \| speed: | \emph{liczba} -- tworzy poziom z~podaną \emph{mapą},
  składnikami podanymi w~\emph{tablicy} (aby wiadomo było jak interpretować symbole na mapie)
  i~podaną szybkością poruszania się czarodziejów.

Mapa poziomu jest tablicą Stringów, w~których kolejne znaki oznaczają:\\
\|A|-\|Z| i~\|0|-\|9| -- składniki;\\
\|#| -- ścianę;\\
\emph{spacja} -- pustą przestrzeń;\\
\|@| -- Harry'ego lub Hermionę;\\
\|!| -- profesora Snape'a;\\
\|&| -- Malfoya;\\
\|%| -- kolegów Malfoya (Crabbe i~Goyle); \\
\|+| -- zwykłych studentów Gryffindoru; \\
\|*| -- zwykłych studentów Slytherinu. \\


\par UWAGA:
\begin{itemize}
\item konstrukcja \|GameLevel map:|\ldots powinna być ostatnią konstrukcją w~pliku konfiguracyjnym --
      dzięki temu zwracana przez nią wartość
	  będzie również wartością pliku konfiguracyjnego, po obliczeniu jej przez Smalltalka;
\item mapa poziomu powinna mieć te same wymiary we wszystkich wierszach;
\item w~przypadku wystąpienia błędu semantycznego w~pliku konfiguracyjnym należy wypisać zrozumiały komunikat
      umożliwiający łatwe znalezienie błędu;
\item w~przypadku znalezienia błędu syntaktycznego w~pliku konfiguracyjnym wystarczą komunikaty Smalltalka.
\end{itemize}
% Przykładowy plik konfiguracyjny
% Graf pokazujący sposób tworzenia eliksiru

Poniżej widać przykładowy plik konfiguracyjny:

\begin{verbatim}
| hair bezoar blood juice
  silvery murky red muddy muddyRed white
  dryIngredients elixir
  ingredients levelMap |
"Opisy są po angielsku, aby uniknąć konieczności
 dodawania rodzaju gramatycznego i odmiany."
hair   := Ingredient new: 'Unicorn hair'									
                      mark: '1'.
bezoar := Ingredient new: 'Bezoar'										
                     mark: '2'.
blood  := Ingredient new: 'Dragon blood'								
                     mark:'3'.
juice  := Ingredient new:
  'Juice from blueberries gathered at full moon'
                     mark:'4'.

hair    description:		'Silver hair'.
bezoar  description:		'Stone'.
blood   description:		'Red potion'.
juice	description:		'Purple potion'.

silvery := juice + hair.
silvery	description:		'Silvery potion'.
silvery poisons.

blood + hair explodes: 3.

murky   := blood + bezoar.
murky   description: 'Murky red potion'.

red     := murky after: 6.
red	    description: 'Red potion'.

muddyRed := red + juice.
muddyRed description: 'Muddy red potion'.
muddyRed + hair splash: 1.

muddy   := murky + juice.
muddy   description: 'Muddy white potion'.

white   := muddy after: 2.
white   description: 'White potion'.

muddy + hair splash: 2.

dryIngredients := hair + bezoar.
dryIngredients description: 'Stone and hair'.

(Array with: blood with: juice with: murky) do:
	[ :x |	(hair + x) splash: 1 ].
(Array with: red with: silvery with: murky with: muddy) do:
	[ :x |	(dryIngredients + x) splash: 1.
    		(x + dryIngredients) explodes: 3  ].

elixir  := white + hair.
elixir  description: 'Silvery potion'.
elixir  wins.

levelMap := Array new.
levelMap add: '###############'.
levelMap add: '#      1      #'.
levelMap add: '#             #'.
levelMap add: '#             #'.
levelMap add: '# #    ####   #'.
levelMap add: '# # +++@@++++ #'.
levelMap add: '# # ++     ++ #'.
levelMap add: '#4# ++     ++2#'.
levelMap add: '# # ** !   ** #'.
levelMap add: '# # **     ** #'.
levelMap add: '# # ***%&%*** #'.
levelMap add: '#             #'.
levelMap add: '#             #'.
levelMap add: '#      3      #'.
levelMap add: '###############'.

GameLevel map: levelMap
          ingredients: (Array with: blood with: juice with: hair with: bezoar)
          speed: 6
\end{verbatim}

\section{Kryteria oceniania}
Wykonanie zadania zaliczeniowego będzie oceniane według następujących kryteriów:
\begin{itemize}
\item jasności i~precyzyjności projektu programu,
\item poprawności programu,
\item metodologicznie (obiektowo) poprawnej architektury programu,
\item przejrzystości i~efektywności kodu programu,
\item zgodności ze specyfikacją,
\item zgłoszonych sprzeczności i~niejasności w specyfikacji,
\item ergonomii interfejsu użytkownika.
\end{itemize}

Następujące kryteria nie powinny mieć wpływu na ocenę zadania:
\begin{itemize}
\item zgodne ze specyfikacją rozszerzenia nieuzgodnione z~prowadzącym,
\item uroda interfejsu użytkownika.
\end{itemize}
Zakłada się, że jeśli specyfikacja jest niejasna lub sprzeczna i~implementator nie odkryje tego,
to jest to zaniedbanie implementatora (jako osoby zobowiązującej się do wykonania specyfikacji).


Wątpliwości będą rozwiązywane zgodnie z~zasadą wzajemnej życzliwości obu stron (przy czym niezbywalnym
celem prowadzących jest zarówno prawidłowo działający program, jak i~poprawnie wyedukowani studenci).

\end{document}

