Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. module Tarefa1_2019li1g027 where
  2.  
  3. import LI11920
  4. import System.Random
  5.  
  6. -- * Testes
  7.  
  8. -- | Testes unitarios da Tarefa 1.
  9. --
  10. -- Cada teste e um triplo (/numero de 'Pista's/,/comprimento de cada 'Pista' do 'Mapa'/,/semente de aleatoriedades/).
  11. testesT1 :: [(Int,Int,Int)]
  12. testesT1 = [(1,3,6),(2,1,4),(4,8,1),(10,12,6),(0,5,4),(9,6,0)]
  13.  
  14. -- * Funcoes pre-definidas da Tarefa 1.
  15.  
  16. geraAleatorios :: Int -> Int -> [Int]
  17. geraAleatorios n seed = take n (randomRs (0,9) (mkStdGen seed))
  18.  
  19. -- * Funcoes principais da Tarefa 1.
  20.  
  21. fazerPares :: [Int] -> [(Int,Int)]
  22. fazerPares [] = []
  23. fazerPares (h:b:t) = (h,b) : fazerPares t
  24.  
  25. -- Divide a lista de pares em lista de lista de pares (pistas)
  26.  
  27. dividirPistas :: [(Int,Int)] -> Int -> [[(Int,Int)]]
  28. dividirPistas [] _ = []
  29. dividirPistas l comp = take (comp-1) l : dividirPistas (drop (comp-1) l) comp
  30.  
  31.  
  32. retaterra0 :: [[(Int,Int)]] -> [[(Int,Int)]]
  33. retaterra0 [] = []
  34. retaterra0 (coluna1:colunas) = [((0,6):coluna1)] ++ (retaterra0 colunas)
  35.  
  36.  
  37. geraPiso :: Int -> Piso -> Piso
  38. geraPiso n a | n == 0 || n == 1 = Terra
  39. | n == 2 || n == 3 = Relva
  40. | n == 4 = Lama
  41. | n == 5 = Boost
  42. | otherwise = a
  43.  
  44. pisoPecaAnt :: Peca -> Piso
  45. pisoPecaAnt (Rampa a _ _ ) = a
  46. pisoPecaAnt (Recta a _ ) = a
  47.  
  48.  
  49. altPecaAnt :: Peca -> Int
  50. altPecaAnt (Rampa _ _ a) = a
  51. altPecaAnt (Recta _ a) = a
  52.  
  53.  
  54. geraPeca :: (Int,Int) -> Peca -> Peca
  55. geraPeca (a,b) pecaAnt | b == 0 || b == 1 = Rampa (geraPiso a (pisoPecaAnt pecaAnt)) (altPecaAnt pecaAnt) ((altPecaAnt pecaAnt)+b+1)
  56. | 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))
  57. | otherwise = Recta (geraPiso a (pisoPecaAnt pecaAnt)) (altPecaAnt pecaAnt)
  58.  
  59. geraPistas :: [(Int,Int)] -> Peca -> Pista
  60. geraPistas [] _ = []
  61. geraPistas ((a,b):t) n = (geraPeca (a,b) n) : geraPistas t (geraPeca (a,b) n)
  62.  
  63.  
  64. geraMapa :: [[(Int,Int)]] -> Mapa
  65. geraMapa [] = []
  66. geraMapa (h:t) = ([Recta Terra 0] ++ geraPistas h (Recta Terra 0)): geraMapa t
  67.  
  68.  
  69. umaPeca :: Int -> Mapa
  70. umaPeca 0 = []
  71. umaPeca npistas = if npistas == 1 then [[Recta Terra 0]] else [Recta Terra 0] : umaPeca (npistas-1)
  72.  
  73. gera :: Int -> Int -> Int -> Mapa
  74. gera npistas comp semente | comp == 1 = umaPeca npistas
  75. | otherwise = (geraMapa (dividirPistas (fazerPares (geraAleatorios ((npistas*(comp-1))*2) semente)) comp))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement