Specyfikacja interfejsu turniejowego do gangsterów -------------------------------------------------- Pola, ruchy, itp. ----------------- Współrzędne pola na planszy jednoznacznie określa para liczb: współrzędna pozioma i pionowa. Współrzędna pozioma określa numer kolumny. Kolumny numerowane są od lewej do prawej liczbami od 1 do n. Współrzędna pionowa określa numer wiersza. Wiersze numerowane są od dołu do góry liczbami od 1 do m. Kierunek określa jedna liczba z zakresu od 0 do 7, tak jak na rysunku: 7 0 1 \ | / 6 --+-- 2 / | \ 5 4 3 Opis ruchu składa się z jednej lub czterech liczb. Pierwsza liczba oznacza kierunek przemieszczenia się kasetki. Jeśli w wyniku przemieszczenia się kasetki w podanym kierunku znajdzie się ona na miejscu parkingowym to jest to jedyna liczba opisująca ruch. W przeciwnym wypadku w opisie ruchu występują jeszcze trzy liczby. Druga i trzecia liczba jest współrzędną pola na planszy, na którym znajduje się samochód gangstera wykonującego ruch (najpierw kolumna, potem wiersz), czwarta liczba określa kierunek przemieszczenia się tego samochodu. Tak więc przykładowy ruch gangstera czerwonego z treści zadania określony jest liczbami 6 3 1 1. Jeśli opisu ruchu składa się z jednej liczby, oznacza to, że jest to ostatni ruch w tej partii, gdyż jest to ruch w wyniku, którego kasetka na zostaje umieszczona na miejscu parkingowym. Wymagania --------- Program do gry w gangsterów powinien czytać wyłącznie ze standardowego wejścia, a pisać wyłącznie na standardowe wyjście. Niedozwolony jest jakikolwiek inny rodzaj operacji wejścia/wyjścia, na przykład czytanie i pisanie do plików. W celu ograniczenia długości rozgrywki może być podane dodatkowe ograniczenie maksymalnej liczby ruchów, jakie może wykonać każdy z graczy. Jeśli każdy z graczy wykona zadaną maksymalną liczbę ruchów i sytuacja na planszy będzie nierozstrzygnięta, to grę uważa się za zakończoną, a wynikiem jest w takim przypadku remis. Ponadto program będzie miał ustalony czas na partię. Będzie to czas, który program może przeznaczyć na ,,myślenie'' sumarycznie w czasie całej partii. Schemat działania ----------------- Program powinien działać według następującego schematu: * wczytanie opisu planszy oraz parametrów gry; * jeśli gracz jest gangsterem czerwonym, to wykonuje ruch; * następnie w pętli: - wczytuje ruch przeciwnika, - wykonuje ruch. Wczytanie opisu planszy oraz parametrów gry ------------------------------------------- Opis planszy oraz parametrów gry wczytuje się ze standardowego wejścia. W pierwszej linii znajduje się jedna liczba - czas na całą partię w milisekundach. W drugiej linii dane są dwie liczby n i m - szerokość i wysokość planszy. W trzeciej linii będzie jedna liczba - 1 lub 2. Oznacza ona kolor gangstera, którym będziemy się poruszać: 1 - gangster czerwony, 2 - gangster zielony. W czwartej linii dane są dwie liczby - współrzędne pola (kolumna, wiersz), na którym umieszczona jest kasetka. W piątej linii jest jedna liczba - maksymalna liczba ruchów, którą może wykonać każdy z graczy. Zero oznacza brak ograniczenia liczby ruchów. W szóstej linii jest jedna liczba s - liczba słupów na planszy. W każdym z kolejnych s wierszy znajdują się dwie liczby - współrzędne pola (kolumna, wiersz), na którym znajduje się słup. Wykonanie ruchu --------------- Program generuje ruch i wypisuje opisujące go jedną lub cztery liczby na standardowe wyjście. Wczytanie ruchu przeciwnika --------------------------- Najpierw należy wczytać ze standardowego wejścia jedną linię, w której znajduje się jedna liczba - pozostały czas na partię w milisekundach. Następnie program wczytuje ze standardowego wejścia jedną linię zawierającą cztery liczby. Jest to opis ruchu przeciwnika. Pomiar czasu ------------ Czas ,,myślenia'' programu podczas wykonywania każdego ruchu jest mierzony od momentu rozpoczęcia wczytywania danych z wejścia (a podczas inicjalizacji od momentu uruchomienia programu) do momentu zakończenia wypisywania ruchu na wyjście. Czas na jedną partię będzie odwrotnie proporcjonalny do kwadratu liczby uczestników (wyniesie zapewne ok. 1 min.). Środowisko ---------- Konkurs będzie przeprowadzony w systemie Linux, programy grające będą kompilowane kompilatorem FPC. Program grający będzie miał do własnej dyspozycji 40MB RAM na dane i dodatkowo 8 MB na stos. Uwagi ----- Wszelkie liczby pojawiające się w jednej linii na standardowym wejściu będą oddzielane pojedynczymi spacjami. Program wypisując opis ruchu składający się z czterech liczb powinien porozdzielać liczby pojedynczymi spacjami. W następujących dodatkowych przypadkach działanie programu będzie uznawane za niewłaściwe, a co za tym idzie będzie uznawane za porażkę: * przekroczenie limitu czasu na partię, * nieoczekiwane zakończenie się programu, * wypisanie na standardowe wyjście opisu posunięcia nielegalnego lub niezgodnego ze składnią. Ponadto zabronione jest też wykorzystywanie jakichkolwiek dodatkowych modułów (poza modułem do pomiaru czasu udostępnianym na stronie przedmiotu w pliku timer.tgz); w szczególności używanie mechanizmów wątków, dodatkowych procesów, dodatkowych zasobów systemowych i wszelkiego innego rodzaju niesportowego wykorzystywania systemu operacyjnego i dostępnego środowiska.