Pololetní projekt GymVod 2019/2020

tato aplikace slouží jako podpora pro Vaše pololetní projekty.

Vaším cílem je naprogramovat knihovnu (DLL), která bude implementovat předepsané rozhraní na známou hru lodě.

Rozhraní si můžete stáhnout zde. Celý tento projekt zde na GitHubu. Termín odevzdání je 2. 4. 2020.
Jméno rozhraní je GymVod.Battleships.Common.IBattleshipsGame a vypadá následovně:

  • Metodu NewGame zavolá herní engine vždy při začátku nové hry. Účelem je rozmístění lodí, inicializace potřebných polí apod. Metoda je zavolána s argumentem typu GameSettings, kde je určena výška a šířka hracího pole a typy lodí, které máte rozmístit.

    Pro zjednodušení jsou všechny lodě pouze "rovné" o délce 1 - 5, žádná loď není "do L". Každý typ lodě může být zadán vícekrát (typicky menší lodě). Loď může být umístěna horizontálně i vertikálně. Orientaci určíte nastavením enumu Orientation. Možné typy lodí jsou:

    • Submarine - loď o délce 1
    • Destroyer - loď o délce 2
    • Cruiser - loď o délce 3
    • Battleship - loď o délce 4
    • Carrier - loď o délce 5
    Battleship types

  • Metodu GetNextShotPosition engine zavolá na začátku vašeho kola. Vaším úkolem je určit, kam chcete vystřelit a vrátit datový typ Position s umístěním střely (souřadnice X, Y), indexováno od 0. Tzn. [0,0] znamená levý horní roh. Lodě se nesmí dotýkat okraje.
  • Metodu ShotResult zavolá herní engine po vyhodnocení, zda vaše střela zasáhla nepřátelskou loď, a případně, zda ji potopila. Tuto informaci využijete pro určení střelby v dalších kolech.

Pravidla hry

Věřím, že hru všichni znáte, ale pro jistotu pravidla uvádím níže (můžou se drobně lišit od těch, které znáte).

  • Nejdříve oba hráči rozmístí své lodě do herního plánu a oznámí své rozmístění hernímu enginu. Jak velký je herní plán a kolik jakách lodí máte rozmístit je dáno v argumentu metody.
  • Začíná první hráč (v každém turnaji se pořadí vždy střídá, takže nikdo nebude mít výhodu prvního výstřelu) a určí, kam chce vystřelit.
  • Herní engine určí, zda jste zasáhli nepřátelskou loď a v případě, že ano, zkontroluje, zda jste ji potopili.
  • Herní engine oznámí prvnímu hráči, zda zasáhl (a potopil) nepřátelskou loď.
  • Pokud všechny lodě jsou již potopené, první hráč vyhrál a hra končí.
  • V opačném případě hraje druhý hráč, dokud jeden z hráčů nepotopí všechny nepřátelské lodě. Explicitně upozorňuji na odchylku od běžných pravidel, že po zásahu nepokračuje hráč, který zasáhl, ale následuje druhý hráč.

Podmínky

  • Loď může být umístěna kdekoli na herním plánu, ale nesmí se dotýkat krajů.
  • Žádná loď se nesmí dotýkat jiných lodí jinak, než rohem.
  • V případě, že rozmístění lodí při začátku hry není dle pravidel, hráč automaticky prohrává.
  • V případě, že střela je mimo hranice hracího pole, hráč automaticky prohrává.
  • Pokud ve Vaší metodě vznikne neošetřená výjimka, hráč automaticky prohrává.
  • Všechny Vaše metody by měly doběhnout do 1s. Momentálně na to není implementována žádná kontrola, ale pokud s tím bude problém, hráč automaticky prohraje, pokud vaše metoda poběží příliš dlouho.
  • Neměli byste se pokoušet žádným způsobem měnit ani přistupovat k žádným hodnotám v paměti, ani jinak ovlivňovat jiný kód, než pouze Vaši knihovnu.

V aplikaci došlo k chybě. Obnovte stránku. Načíst 🗙