Hru ,,Fotbal`` hrají dva hráči na čtverečkovaném papíře. Nakreslí se ,,hřiště`` libovolné velikosti a tvaru, vyznačí se počáteční bod a brány obou soupeřů.
Táhnout je možné osmi směry, tzn. do libovolného vrcholu kteréhokoliv ze čtyř čtverečků, které sdílí aktuální bod.
Nesmí se táhnout po čáře, kde již někdo táhl. To znamená, že jediným případem, kdy lze použít všech osm možností je první tah, v každém dalším tahu je pak vždy maximálně sedm možností.
Zeď můžeme v takovémto případě popsat tak, že zakázanou oblast vyplníme tahy.
Pokud hráč svým tahem dosáhne zdi nebo místa, kde již nějaký tah je, pokračuje ve hře (tzv. ,,odraz``).
Úkolem je dosáhnout soupeřovy brány nebo donutit soupeře se zablokovat, tzn. dojít do místa, z nějž již žádný další tah není možný.
Následující obrázek odpovídá situaci krátce po začátku hry. Celkové hřiště je nakresleno na obrázku výše (první obrázek).
Situace po tahu obou hráčů
Situace po tahu modrého
Situace po tahu červeného
Úkolem je napsat funkci, která podle aktuální situace vrátí následující tah. Funkce bude součástí knihovny. Jméno funkce i jméno knihovny bude mít jako prefix unikátní kód týmu.
Jedinou položkou v části interface (tzn. veřejnou) bude hlavička výsledné funkce, vše ostatní bude ukryto v části implementation. Knihovna může využívat globální proměnné, jiné knihovny, libovolé datové typy atd. Paměť je třeba využívat s rozvahou, algoritmy, které budou mít potíže s pamětí budou oproti ostatním znevýhodněny.
function <prefix>Tah(Hriste: PPole; dx, dy, x, y: Integer; BVlastni,
BSoupere: PBrana; Cas: LongInt): Integer;
Hriste: PPole
dx, dy: Integer
x, y: Integer
BVlastni, BSoupere: PBrana
Cas: LongInt
Pokud nenastane při zpracování chyba, vrátí funkce nastavený jeden bit podle vybraného tahu, pokud došlo k chybě, vrátí kód chyby podle následující tabulky
|
Pokud vás napadne nějaká další chyba, pošlete mi, prosím, mailem její přesnou specifikaci, bude zařazena a přidělím jí volný kód.
Přidělení bitů jednotlivým směrům je popsáno níže.
Všemi používané datové dypy budou definované v knihovně
Typy
, kterou budou používat všechny
vaše knihovny.
type PPole = Pointer;
Hřiště je popsáno dvourozměrným polem čísel typu
Byte
. Každý bit reprezentuje jeden směr z daného bodu. Je-li
bit 1, je tah obsazen, je-li 0, je tah volný.
Následující tabulka ukazuje rozdělení bitů mezi jednotlivé směry. Souřadnice jsou relativní vůči aktuální pozici (přičítají se k aktuální pozici)
|
Pole je uloženo po řádcích, tzn. vnitřním indexem je
x
a vnějším y
.
type PBrana = ^TBrana;
TBrana = record
x, y: Integer;
Predchozi, Dalsi: PBrana;
end;
Jedná se o oboustranně zřetězený cyklický seznam souřadnic jednotlivých bodů soupeřovy brány.
Ke konci semestru bude uspořádán turnaj (podle náročnosti buď každý s každým nebo jiným způsobem). Algoritmy se utkají na dvou (nebo více) hřištích různého tvaru, na každém hřišti se utkají celkem 4 krát. Každý bude hrát postupně na obě brány a jako první i jako druhý.
Na závěr bude vytvořena statistika ze všech utkání a srovnání všech algoritmů podle různých kritérií.