Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Tarefa1_2019li1g027 where
- import LI11920
- import System.Random
- -- * Testes
- -- | Testes unitarios da Tarefa 1.
- --
- -- Cada teste e um triplo (/numero de 'Pista's/,/comprimento de cada 'Pista' do 'Mapa'/,/semente de aleatoriedades/).
- testesT1 :: [(Int,Int,Int)]
- testesT1 = [(1,3,6),(2,1,4),(4,8,1),(10,12,6),(0,5,4),(9,6,0)]
- -- * Funcoes pre-definidas da Tarefa 1.
- geraAleatorios :: Int -> Int -> [Int]
- geraAleatorios n seed = take n (randomRs (0,9) (mkStdGen seed))
- -- * Funcoes principais da Tarefa 1.
- fazerPares :: [Int] -> [(Int,Int)]
- fazerPares [] = []
- fazerPares (h:b:t) = (h,b) : fazerPares t
- -- Divide a lista de pares em lista de lista de pares (pistas)
- dividirPistas :: [(Int,Int)] -> Int -> [[(Int,Int)]]
- dividirPistas [] _ = []
- dividirPistas l comp = take (comp-1) l : dividirPistas (drop (comp-1) l) comp
- retaterra0 :: [[(Int,Int)]] -> [[(Int,Int)]]
- retaterra0 [] = []
- retaterra0 (coluna1:colunas) = [((0,6):coluna1)] ++ (retaterra0 colunas)
- geraPiso :: Int -> Piso -> Piso
- geraPiso n a | n == 0 || n == 1 = Terra
- | n == 2 || n == 3 = Relva
- | n == 4 = Lama
- | n == 5 = Boost
- | otherwise = a
- pisoPecaAnt :: Peca -> Piso
- pisoPecaAnt (Rampa a _ _ ) = a
- pisoPecaAnt (Recta a _ ) = a
- altPecaAnt :: Peca -> Int
- altPecaAnt (Rampa _ _ a) = a
- altPecaAnt (Recta _ a) = a
- geraPeca :: (Int,Int) -> Peca -> Peca
- geraPeca (a,b) pecaAnt | b == 0 || b == 1 = Rampa (geraPiso a (pisoPecaAnt pecaAnt)) (altPecaAnt pecaAnt) ((altPecaAnt pecaAnt)+b+1)
- | b >= 2 && b <= 5 = if (altPecaAnt pecaAnt) > 0 && ((altPecaAnt pecaAnt)-(b-1)) < 0 then Rampa (geraPiso a (pisoPecaAnt pecaAnt)) (altPecaAnt pecaAnt) 0 else if (altPecaAnt pecaAnt) > 0 && ((altPecaAnt pecaAnt)-(b-1)) == 0 then Rampa (geraPiso a (pisoPecaAnt pecaAnt)) (altPecaAnt pecaAnt) 0 else if (altPecaAnt pecaAnt) == 0 && (altPecaAnt pecaAnt)-(b-1) < 0 then Recta (pisoPecaAnt pecaAnt) 0 else Rampa (geraPiso a (pisoPecaAnt pecaAnt)) (altPecaAnt pecaAnt) ((altPecaAnt pecaAnt)-(b-1))
- | otherwise = Recta (geraPiso a (pisoPecaAnt pecaAnt)) (altPecaAnt pecaAnt)
- geraPistas :: [(Int,Int)] -> Peca -> Pista
- geraPistas [] _ = []
- geraPistas ((a,b):t) n = (geraPeca (a,b) n) : geraPistas t (geraPeca (a,b) n)
- geraMapa :: [[(Int,Int)]] -> Mapa
- geraMapa [] = []
- geraMapa (h:t) = ([Recta Terra 0] ++ geraPistas h (Recta Terra 0)): geraMapa t
- umaPeca :: Int -> Mapa
- umaPeca 0 = []
- umaPeca npistas = if npistas == 1 then [[Recta Terra 0]] else [Recta Terra 0] : umaPeca (npistas-1)
- gera :: Int -> Int -> Int -> Mapa
- gera npistas comp semente | comp == 1 = umaPeca npistas
- | otherwise = (geraMapa (dividirPistas (fazerPares (geraAleatorios ((npistas*(comp-1))*2) semente)) comp))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement