-- IB015 2019 - Kostra řešení dvanácté domácí úlohy -- * V kostře nahraďte ‚undefined‘ vlastní implementací. -- * Definicím funkcí můžete přidávat formální parametry. -- * DULEŽITÉ: Zadané datové typy nemodifikujte. -- * DŮLEŽITÉ: Zadaným funkcím neměňte typové signatury. -- * DŮLEŽITÉ: Ke všem globálně definovaným funkcím uvádějte typovou signaturu. -- * Řešení si zkuste spustit na Aise s GHC 8.6. -- * Vyřešenou úlohu nahrajte do odevzdávárny své seminární skupiny. -- Před tento řádek nic nepřidávejte import Text.Read import Data.List (words) --------------------------------------------------- -- Z A D A N É D A T O V É T Y P Y -- --------------------------------------------------- -- loď se seznamem příslušných koordinátů s pravdivostní hodnotou -- podle toho, zda jsou zasaženy (True = zasažen, False = nezasažen) data Ship = Ship [(Coord, Status)] deriving (Eq, Show) -- moře jsou čtvercová data ShipsPlan = ShipPlan Int [Ship] deriving (Eq, Show) type Coord = (Int, Int) data ShipOrientation = Horizontal | Vertical deriving Show type ShipSize = Int data Status = AsNew | Damaged deriving (Eq, Show) data ShotResult = Ocean | Hit | Sunk deriving (Show, Eq) --------------------------------------------------- -- F U N K C E K I M P L E M E N T A C I -- --------------------------------------------------- isEmpty :: ShipsPlan -> Bool isEmpty = undefined toShip :: Coord -> ShipOrientation -> ShipSize -> Ship toShip = undefined placeShip :: Coord -> ShipOrientation -> ShipSize -> ShipsPlan -> Maybe ShipsPlan placeShip = undefined shoot :: Coord -> ShipsPlan -> (ShipsPlan, ShotResult) shoot = undefined printPlan :: ShipsPlan -> IO () printPlan = undefined game :: IO () game = undefined --------------------------------------------------- -- P O M O C N É F U N K C E -- --------------------------------------------------- -- Pomocná funkce pro zpracování řádku načteného pro zadání lodě. -- Funkce řeší pouze zpracování řádku zadávající loď a v případě, -- že je tento vstup validní, vrací zpracované parametry zabalené -- v Maybe. V opačném případě vrací Nothing. -- Možná vás překvapí do-notace bez IO. Ve skutečnosti tu využíváme -- toho, že Maybe je stejně jako IO tzv. monádou - podrobnosti pře- -- sahují rámec tohoto kurzu. Nám stačí vědět, že (stejně jako u IO) -- pokud nějaký z výpočtů selže (takže funkce z níž si vytahujeme -- hodnotu pomocí "<-" vrátí Nothing), tak selže celá funkce jako -- celek -> návratová hodnota bude Nothing. Můžete si zkusit volání -- vyhodnotit: parseShipInput "3 4 A 10" -- (Výsledkem bude Nothing - selže parseOrientation. Všimněte si, že -- není potřeba po každém volání kontrolovat, zdali volání funkce -- uspělo - o to se nám postará do-notace, resp. funkce (>>) a (>>=)). parseShipInput :: String -> Maybe (Coord, ShipOrientation, ShipSize) parseShipInput input = if length inputs /= 4 then Nothing else do x <- readMaybe str_x y <- readMaybe str_y orientation <- parseOrientation str_or size <- readMaybe str_size return ((x, y), orientation, size) where inputs = words input [str_x, str_y, str_or, str_size] = inputs parseOrientation "V" = Just Vertical parseOrientation "H" = Just Horizontal parseOrientation _ = Nothing -- Analogicky pomocná funkce pro zpracování řádku načteného pro zadání souřadnic -- pro střelbu. parseShootInput :: String -> Maybe Coord parseShootInput input = if length inputs /= 2 then Nothing else do x <- readMaybe str_x y <- readMaybe str_y return (x, y) where inputs = words input [str_x, str_y] = inputs -- při kompilaci pomocí `ghc zadani12.hs -o ` a následném -- spuštění výsledné binárky se nám automaticky zavolá funkce game main :: IO () main = game