never executed always true always false
1 {-# LANGUAGE PatternGuards #-}
2
3 module Tarefa3_2017li1g180 where
4
5 import LI11718
6 import Tarefa2_2017li1g180
7 import Test.QuickCheck.Gen
8 import Data.List
9 import Data.Maybe
10 import Safe
11
12 testesT3 :: [(Tabuleiro,Tempo,Carro)]
13 testesT3 = unitTests
14
15 randomizeCarro :: Tabuleiro -> Double -> Carro -> Gen Carro
16 randomizeCarro tab delta c = do
17 suchThat genC (validaCarro tab)
18 where
19 (x,y) = posicao c
20 genC = do
21 dx <- choose (0,delta)
22 dy <- choose (0,delta)
23 let x' = x + dx
24 let y' = y + dy
25 return c { posicao = (x',y') }
26
27 ranksT3 :: [(Tabuleiro,Tempo,Carro)]
28 ranksT3 = unitTests
29
30 -- Nuno/Hugo's simpler version
31 -- ranksT3Nuno :: [(Tabuleiro,Tempo,Carro)]
32 -- ranksT3Nuno = [(tab1,5,carro1)]
33 -- where
34 -- tab1 = [[Peca Lava altLava, Peca Lava altLava, Peca Lava altLava, Peca Lava altLava, Peca Lava altLava]
35 -- ,[Peca Lava altLava, Peca (Curva Norte) 2,Peca Recta 2,Peca (Curva Este) 2, Peca Lava altLava]
36 -- ,[Peca Lava altLava, Peca Recta 2,Peca Lava altLava,Peca Recta 2, Peca Lava altLava]
37 -- ,[Peca Lava altLava, Peca (Curva Oeste) 2,Peca Recta 2,Peca (Curva Sul) 2, Peca Lava altLava]
38 -- ,[Peca Lava altLava, Peca Lava altLava, Peca Lava altLava, Peca Lava altLava, Peca Lava altLava]
39 -- ]
40 -- carro1 = Carro (3,3) 30 (2,1.5)
41
42 solutionsT3 :: [((Tabuleiro,Tempo,Carro),Maybe Carro)]
43 solutionsT3 = zip ranksT3 (map aux ranksT3)
44 where
45 aux x@(tab,tempo,carro) = movimenta tab tempo carro
46
47 compareT3Solutions :: Double -> Maybe Carro -> Maybe Carro -> Double
48 compareT3Solutions distance Nothing Nothing = 100
49 compareT3Solutions distance Nothing (Just y) = 0
50 compareT3Solutions distance (Just x) Nothing = 0
51 compareT3Solutions distance (Just x) (Just y) = (pos+dir+vel) / 3
52 where
53 pos = if distance == 0 then 100 else (1 - dist (posicao x) (posicao y) / distance) * 100
54 dir = (1 - (normAngulo (abs (direcao x - direcao y))) / 360) * 100
55 vel = if distance == 0 then 100 else (1 - dist (velocidade x) (velocidade y) / distance) * 100
56
57 normAngulo x = if x >= 360 then normAngulo (x - 360) else x
58
59 genTempo :: Gen Tempo
60 genTempo = choose (0,30)
61
62 validaCarro :: Tabuleiro -> Carro -> Bool
63 validaCarro tab carro = validaPonto (posicao carro) tab && (not $ derrete tab (posicao carro))
64
65 derrete :: Tabuleiro -> Ponto -> Bool
66 derrete t p = derrete' tp a
67 where
68 (i,j) = ponto2Pos p
69 a = denorm p (i,j)
70 Peca tp _ = (atNote "derrete" (atNote "derrete" t j) i)
71 derrete' :: Tipo -> Ponto -> Bool
72 derrete' Lava _ = True
73 -- hpacheco: mudei para incluir parede
74 derrete' (Curva Norte) (x,y) = x < (1-y)
75 derrete' (Curva Este) (x,y) = x > y
76 derrete' (Curva Sul) (x,y) = x > (1-y)
77 derrete' (Curva Oeste) (x,y) = x < y
78 derrete' _ _ = False
79
80 movimenta :: Tabuleiro -> Tempo -> Carro -> Maybe Carro
81 movimenta m t c = case (colideLocal m v (a,b) i) of
82 Nothing -> Nothing
83 Just (p',v') -> Just $ c { posicao = p', velocidade = v' }
84 where a = posicao c
85 v = velocidade c
86 b = a .+. (t .*. v)
87 i = ponto2Pos a
88
89 bounce :: (Double,Double) -> (Double,Double) -> (Double,Double)
90 bounce (d,a1) (1,a2) = componentsToArrow $ (arrowToComponents (d,a1)) .+. (-x,-y)
91 where dp = 2 * (arrowToComponents (d,a1) .$. arrowToComponents (1,a2))
92 (x,y) = dp .*. (arrowToComponents (1,a2))
93
94 colideLocal :: Tabuleiro -> Velocidade -> (Ponto,Ponto) -> Posicao -> Maybe (Ponto,Velocidade)
95 colideLocal e v ab ij = case colideLocalAcc [] e v ab ij of
96 (l,Just v) -> Just (last l,v)
97 (_,Nothing) -> Nothing
98
99 colideLocalAcc :: [Ponto] -> Tabuleiro -> Velocidade -> (Ponto,Ponto) -> Posicao -> ([Ponto],Maybe Velocidade)
100 colideLocalAcc ps m v (a,b) (i,j) | morto = (ps++[a,b],Nothing)
101 | colideInterno = colideLocalAcc (ps++[a]) m iVel iPos (i,j) -- se houverem colisões internas (diagonais), da prioridade e volta a aplicar novo vector
102 | dentroPeca (a,b) (i,j) g = (ps++[a,b],Just v) -- caso contrario, se estiver dentro da peça pode parar
103 | colideExterno = colideLocalAcc (ps++[a]) m eVel ePos (i,j) -- se passar para fora da peça mas houver parede, colide na parede e volta a aplicar novo vector
104 | otherwise = colideLocalAcc (ps++[a]) m v (aPos,b) ij' -- se passar para fora da peça mas não houver parede, chama na peça seguinte
105 where (_,g) = componentsToArrow (b.-.a)
106
107 morto = (isJust int && isNothing (fromJust int)) || (colideExterno && not (fromJust $ temParede m (i,j) (fromJust ext)))
108
109 int = colisaoInterna (atNote "colideLocalAcc" (atNote "colideLocalAcc" m j) i) (i,j) (a,b)
110 colideInterno = isJust int && isJust (fromJust int) && colisaoRelevante (a,b) (fromJust (fromJust int))
111 (iPos,iVel) = inv v (a,b) (fromJust int)
112
113 ext = atravessaOnde (i,j) (a,b)
114 colideExterno = isJust ext && (isJust . temParede m (i,j)) (fromJust ext)
115 (ePos,eVel) = inv v (a,b) (Just (norm (fst (fromJust ext)) (i,j),snd (fromJust ext)))
116
117 (aPos,aVel) = (norm (fst (fromJust ext)) (i,j), snd (fromJust ext))
118 ij' = atravessa aVel (i,j)
119
120
121 norm (x,y) (i,j) = (x+toEnum i,y+toEnum j)
122 denorm (x,y) (i,j) = (x-toEnum i,y-toEnum j)
123
124 -- dada uma velocidade e um deslocamento, inverte ambos dada uma colisão
125 inv :: Velocidade -> (Ponto,Ponto) -> Maybe (Ponto,Double) -> ((Ponto,Ponto),Velocidade)
126 inv v ab Nothing = (ab,v)
127 inv v ab (Just (c,g)) = ((c,d),arrowToComponents (vd,v'))
128 where (_,d,v') = inverte ab c g
129 (vd,_) = componentsToArrow v
130
131 inverte :: (Ponto,Ponto) -> Ponto -> Double -> (Ponto,Ponto,Double)
132 inverte (a,b) c g = (c,d,v')
133 where (z,v') = bounce (componentsToArrow (b .-. c)) (1,g)
134 d = c .+. arrowToComponents (z,v')
135
136 -- dada uma peça e um segmento (relativo à peça), detecta colisoes e devolve angulo da normal
137 -- colisões internas apenas acontecem em diagonais e no maximo uma
138 colisaoInterna :: Peca -> Posicao -> (Ponto,Ponto) -> Maybe (Maybe (Ponto,Double))
139 colisaoInterna (Peca (Curva d) al) ij (a,b) | d == Norte || d == Sul = f (intersecta ab ((1,0),(0,1))) (135 + dlt)
140 | otherwise = f (intersecta ab ((0,0),(1,1))) (45 + dlt)
141 where f :: Maybe Ponto -> Double -> Maybe (Maybe (Ponto,Double))
142 f Nothing _ = Nothing
143 f (Just a) b | al < altLava = Just $ Just (norm a ij,b)
144 | otherwise = Just Nothing
145 dlt = if d == Norte || d == Este then 180 else 0
146 ab = (denorm a ij, denorm b ij)
147 colisaoInterna _ _ _ = Nothing
148
149 -- se o movimento mantem-se dentro da peça
150 dentroPeca :: (Ponto,Ponto) -> Posicao -> Double -> Bool
151 dentroPeca (a,b) (i,j) g = belongs b
152 where belongs (x,y) = (x == toEnum i+1 || floor x == i) && (floor y == j || y == toEnum j+1)
153
154 -- dado um segmento (relativo à peça), calcula pontos de interceção e angulos das normais
155 -- entre 0 e 2 no caso extremo (segmento que começa em cima da linha e atravessa outra)
156 atravessaOnde :: Posicao -> (Ponto,Ponto) -> Maybe (Ponto, Double)
157 atravessaOnde ij (x,y) | null rel = Nothing
158 | length rel == 1 = Just (head rel)
159 | otherwise = Just (last rel) --error $ "Duas travessias: "++(show rel)
160 where rel = filter (colisaoRelevante (x,y)) $ normalize $ zip is [0,270,90,180]
161 is = [intersecta xy ((i,i),(toEnum j,toEnum $ (j+1)`mod`2)) | i <- [0,1], j <- [0,1]]
162 normalize = catMaybes . map (\(a,b) -> if (isJust a) then Just (fromJust a,b) else Nothing)
163 xy = (denorm x ij, denorm y ij)
164
165 -- para uma peça e uma aresta, testa se vai haver colisão
166 temParede :: Tabuleiro -> Posicao -> (Ponto,Double) -> Maybe Bool
167 temParede m (i,j) c | t == Lava = Just (a1 < altLava)
168 | snd c == 270 && (t == Curva Sul || t == Curva Oeste) = Just (a1 < altLava)
169 | snd c == 180 && (t == Curva Norte || t == Curva Oeste) = Just (a1 < altLava)
170 | snd c == 90 && (t == Curva Norte || t == Curva Este) = Just (a1 < altLava)
171 | snd c == 0 && (t == Curva Sul || t == Curva Este) = Just (a1 < altLava)
172 | middle && mwall t0 (fst c) && aa > aa' = Just True
173 | middle && mfall t0 (fst c) && aa < aa' = Just False
174 | a2 > a1 = Just True
175 | a2 < a1 = Just False
176 | otherwise = Nothing
177 where (i',j') = atravessa (snd c) (i,j)
178 Peca t aa = atNote "temParede" (atNote "temParede" m j') i'
179 Peca t0 aa' = atNote "temParede" (atNote "temParede" m j) i
180 isR (Rampa _) = True
181 isR _ = False
182 (a1,a2) = normAlturas (atNote "temParede" (atNote "temParede" m j) i) (atNote "temParede" (atNote "temParede" m j') i')
183 middle = case t of (Rampa x) -> t0 == (Rampa (toEnum (((fromEnum x) + 2) `mod` 4))) && (abs $ aa-aa') == 1
184 otherwise -> False
185 mwall (Rampa Oeste) (x,y) = x >= 0.5
186 mwall (Rampa Este) (x,y) = x <= 0.5
187 mwall (Rampa Norte) (x,y) = y >= 0.5
188 mwall (Rampa Sul) (x,y) = y <= 0.5
189 mfall r p = not $ mwall r p
190
191 normAlturas :: Peca -> Peca -> (Altura,Altura)
192 normAlturas (Peca (Rampa _) a1) p@(Peca _ a2) | a2 > a1 = normAlturas (Peca Recta (a1+1)) p
193 | otherwise = normAlturas (Peca Recta a1) p
194 normAlturas p@(Peca _ a1) (Peca (Rampa _) a2) | a2 < a1 = normAlturas p (Peca Recta (a2+1))
195 | otherwise = normAlturas p (Peca Recta a2)
196 normAlturas (Peca _ a1) (Peca _ a2) = (a1,a2)
197
198 -- dado o angulo de travessia, da a nova posiçao
199 atravessa :: Double -> Posicao -> Posicao
200 atravessa 270 (i,j) = (i,j-1)
201 atravessa 90 (i,j) = (i,j+1)
202 atravessa 0 (i,j) = (i-1,j)
203 atravessa 180 (i,j) = (i+1,j)
204
205 -- dado o deslocamento e o ponto de colisão com o angulo da normal, testa de é relevante
206 -- é relevante se a diferença de angulos > 90º
207 colisaoRelevante :: (Ponto,Ponto) -> (Ponto,Double) -> Bool
208 colisaoRelevante ((a1,a2),(b1,b2)) ((x,y),a) = diff > 90 && diff < 270
209 where (_,a') = componentsToArrow (b1-a1,b2-a2)
210 diff = f (a-a')
211 f x | x < 0 = f (x+360)
212 | x > 360 = f (x-360)
213 | otherwise = x
214
215
216 -- geometry
217
218 -- copiado do Gloss para Double
219 intersecta :: (Ponto,Ponto) -> (Ponto,Ponto) -> Maybe Ponto
220 intersecta (p1,p2) (p3,p4) | Just p0 <- intersectaL p1 p2 p3 p4
221 , t12 <- closestPontoOnL p1 p2 p0
222 , t23 <- closestPontoOnL p3 p4 p0
223 , t12 >= 0 && t12 <= 1
224 , t23 >= 0 && t23 <= 1
225 = Just p0
226 | otherwise
227 = Nothing
228
229 -- copiado do Gloss para Double
230 intersectaL :: Ponto -> Ponto -> Ponto -> Ponto -> Maybe Ponto
231 intersectaL (x1, y1) (x2, y2) (x3, y3) (x4, y4)
232 = let dx12 = x1 - x2
233 dx34 = x3 - x4
234 dy12 = y1 - y2
235 dy34 = y3 - y4
236
237 den = dx12 * dy34 - dy12 * dx34
238
239 in if den == 0
240 then Nothing
241 else let det12 = x1*y2 - y1*x2
242 det34 = x3*y4 - y3*x4
243 numx = det12 * dx34 - dx12 * det34
244 numy = det12 * dy34 - dy12 * det34
245 in Just (numx / den, numy / den)
246
247 -- copiado do Gloss para Double
248 closestPontoOnL :: Ponto -> Ponto -> Ponto -> Double
249 closestPontoOnL p1 p2 p3 = (p3 .-. p1) .$. (p2 .-. p1) / (p2 .-. p1) .$. (p2 .-. p1)
250
251 (.*.) :: Double -> (Double,Double) -> (Double,Double)
252 (.*.) x (a,b) = ((x*a),(x*b))
253
254 (.+.) :: (Double,Double) -> (Double,Double) -> (Double,Double)
255 (.+.) (x,y) (a,b) = ((x+a),(y+b))
256
257 (.-.) :: (Double,Double) -> (Double,Double) -> (Double,Double)
258 (.-.) (x,y) (a,b) = ((x-a),(y-b))
259
260 -- the dot product between two (Double,Double)s
261 (.$.) :: (Double,Double) -> (Double,Double) -> Double
262 (.$.) (d1,a1) (d2,a2) = (x1*x2) + (y1*y2)
263 where (x1,y1) = (d1,a1)
264 (x2,y2) = (d2,a2)
265
266 radians th = th * (pi/180)
267 degrees th = th * (180/pi)
268
269 arrowToComponents :: (Double,Double) -> Ponto
270 arrowToComponents (v,th) = (getX v th,getY v th)
271 where getX v th = v * cos (radians (th))
272 getY v th = v * sin (radians (-th))
273
274 componentsToArrow :: Ponto -> (Double,Double)
275 componentsToArrow (x,0) | x >= 0 = (x,0)
276 componentsToArrow (x,0) | x < 0 = (abs x,180)
277 componentsToArrow (0,y) | y >= 0 = (y,-90)
278 componentsToArrow (0,y) | y < 0 = (abs y,90)
279 componentsToArrow (x,y) = (hyp,dir angle)
280 where
281 dir o = case (x >= 0, y >= 0) of
282 (True,True) -> -o
283 (True,False) -> o
284 (False,False) -> 180 - o
285 (False,True) -> 180 + o
286 hyp = sqrt ((abs x)^2 + (abs y)^2)
287 angle = degrees $ atan (abs y / abs x)
288
289 dist :: Ponto -> Ponto -> Double
290 dist (x1,y1) (x2,y2) = sqrt ((x2-x1)^2+(y2-y1)^2)
291
292
293 --------------
294
295 testeMapa =
296 [[Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0
297 ,Peca Lava 0,Peca Lava 0,Peca Lava 0]
298 ,[Peca Lava 0,Peca (Curva Norte) 0,Peca (Rampa Este) 0,Peca Recta 1,Peca (Rampa Oeste) 0,Peca Recta 0,Peca Recta 0,Peca (Rampa Oeste) (-1),Peca Recta (-1)
299 ,Peca (Rampa Este) (-1),Peca (Rampa Este) 0,Peca (Rampa Oeste) 0,Peca (Rampa Oeste) (-1),Peca (Curva Este) (-1),Peca Lava 0]
300 ,[Peca Lava 0,Peca (Curva Oeste) 0,Peca (Rampa Este) 0,Peca (Rampa Oeste) 0,Peca (Rampa Este) 0,Peca Recta 1,Peca (Rampa Oeste) 0,Peca (Rampa Oeste) (-1)
301 ,Peca Recta (-1),Peca (Rampa Oeste) (-2),Peca (Rampa Oeste) (-3),Peca (Rampa Este) (-3),Peca (Rampa Este) (-2),Peca (Curva Sul) (-1),Peca Lava 0]
302 ,[Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0
303 ,Peca Lava 0,Peca Lava 0,Peca Lava 0]]
304 -- 00011110000009999001100999
305 -- ..//>>[]<<[][]<<[]>>>><<<<\\..
306 -- ..\\>><<>>[]<<<<[]<<<<>>>>//..
307 -- 00011001111009999887788999
308
309 testeCurvas =
310 [[Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0]
311 ,[Peca Lava 0,Peca (Curva Norte) 0,Peca (Rampa Oeste) (-1),Peca (Curva Este) (-1),Peca Lava 0,Peca (Curva Norte) 0,Peca (Curva Este) 0
312 ,Peca Lava 0,Peca (Curva Norte) 1,Peca (Curva Este) 1,Peca Lava 0]
313 ,[Peca Lava 0,Peca (Rampa Sul) 0,Peca Lava 0,Peca (Curva Oeste) (-1),Peca (Rampa Este) (-1),Peca (Curva Sul) 0,Peca (Curva Oeste) 0
314 ,Peca (Rampa Este) 0,Peca (Curva Sul) 1,Peca Recta 1,Peca Lava 0]
315 ,[Peca Lava 0,Peca (Curva Oeste) 1,Peca (Rampa Oeste) 0,Peca Recta 0,Peca (Rampa Oeste) (-1),Peca Recta (-1),Peca (Rampa Este) (-1)
316 ,Peca (Rampa Este) 0,Peca Recta 1,Peca (Curva Sul) 1,Peca Lava 0]
317 ,[Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0,Peca Lava 0]]
318
319 -- ..//<<\\..//\\..//\\..
320 -- ..\/..\\>>//\\>>//[]..
321 -- ..\\<<[]<<[]>>>>[]//..
322
323 unitTests :: [(Tabuleiro,Tempo,Carro)]
324 unitTests = [
325 --- apenas um passo recursivo
326 -- rectas: passa percurso
327 (testeMapa , 1.2, Carro (5.5,1.5) 0 (0.9,0.1))
328 -- rectas: cai adjacente
329 , (testeMapa , 1.2, Carro (5.5,2.5) 0 (0.1,-0.9))
330 -- rectas: passa adjacente
331 , (testeMapa , 1.2, Carro (8.5,1.5) 0 (0.1,0.9))
332 -- rectas: choca adjacente
333 , (testeMapa , 1.2, Carro (5.5,1.5) 0 (0.1,0.9))
334 -- rectas: cai lava
335 , (testeMapa , 1.2, Carro (3.5,1.5) 0 (0.1,-0.9))
336 -- rectas: passa lava (mesma altura)
337 , (testeMapa , 1.2, Carro (5.5,1.5) 0 (0.1,-0.9))
338 -- rectas: choca lava
339 , (testeMapa , 1.2, Carro (8.5,1.5) 0 (0.1,-0.9))
340 -- curva: choca lava
341 , (testeMapa , 1.2, Carro (13.4,1.5) 0 (0.3,-0.1))
342 -- curva: cai lava (mesma altura)
343 , (testeMapa , 1.2, Carro (1.6,1.5) 0 (-0.3,-0.1))
344
345 -- recta->curva: cai
346 , (testeCurvas , 1.2, Carro (8.5,3.5) 0 (0.1,-0.9))
347 -- recta->curva: lava
348 , (testeCurvas , 1.2, Carro (5.5,3.5) 0 (0.1,-0.9))
349 -- recta->curva: choca
350 , (testeCurvas , 1.2, Carro (3.5,3.5) 0 (0.1,-0.9))
351
352 --- dois+ passos recursivos
353 -- rectas: passa percurso 2
354 , (testeMapa , 1.2, Carro (3.6,1.5) 0 (-1.6,0.1))
355 -- rectas: passa percurso 3
356 , (testeMapa , 1.2, Carro (4.6,1.5) 0 (-2.6,0.1))
357 -- curvas: cai lava (mesma altura) 3
358 , (testeMapa , 1.2, Carro (3.6,1.5) 0 (-2.6,0.1))
359 -- rectas: adjacente + cai lava (mesma altura) 10
360 , (testeMapa , 5.5, Carro (12.5,1.2) 0 (-2.1,0.1))
361 -- rectas: adjacente + choca lava 2
362 , (testeMapa , 1.2, Carro (8.5,1.5) 0 (0.1,1.9))
363 -- rectas: choca lava + adjacente 2
364 , (testeMapa , 1.2, Carro (8.5,2.5) 0 (0.1,1.9))
365 -- rectas: choca lava + adjacente + choca lava 3
366 , (testeMapa , 1.2, Carro (8.5,2.5) 0 (0.1,2.3))
367 -- rectas: choca lava + adjacente + choca lava + adjacente 4
368 , (testeMapa , 1.2, Carro (8.5,2.5) 0 (0.1,3.3))
369 -- rectas: choca adjacente + cai lava (mesma altura) 2
370 , (testeMapa , 1.2, Carro (5.5,1.5) 0 (0.1,1.9))
371 -- curvas: adjacente + choca lava 3
372 , (testeMapa , 1.2, Carro (11.6,1.5) 0 (2.1,0.1))
373 -- curva: adjacente + cai lava 2
374 , (testeMapa , 1.2, Carro (1.6,2.5) 0 (-0.1,-1.1))
375 -- curva: choca lava 2
376 , (testeMapa , 1.2, Carro (12.5,1.5) 0 (2.8,-0.1))
377 -- curva: cai 2 (passa a lava) -- @nmm nao percebo a particularidade deste teste!
378 , (testeMapa , 1.2, Carro (1.6,2.5) 0 (-0.3,-0.1))
379
380 ----- PLANO NOVO (cai se queda >= 1, choca se degrau >= 1, passa se diff. entre 1 e -1)
381 -- rampas: cai
382 , (testeMapa , 1.2, Carro (10.5,1.5) 0 (-0.1,0.9))
383 -- rampas: choca
384 , (testeMapa , 1.2, Carro (10.5,2.5) 0 (0.1,-0.9))
385 -- rampas: passa (igual)
386 , (testeMapa , 1.2, Carro (2.5,1.5) 0 (0.1,0.9))
387 -- rampas x2: passa (um pouco maior)
388 , (testeMapa , 1.2, Carro (4.5,1.5) 0 (0.1,0.9))
389 -- rampas x2: passa (um pouco menor)
390 , (testeMapa , 1.2, Carro (4.5,1.5) 0 (-0.1,0.9))
391 ---- casos difíceis (sobe/desce Bom Jesus)!
392 -- rampas: choca (tricky)
393 , (testeMapa , 1.2, Carro (9.5,2.5) 0 (0.1,-0.9))
394 -- rampas: não choca (tricky)
395 , (testeMapa , 1.2, Carro (9.5,2.5) 0 (-0.1,-0.9))
396 -- rampas: passa (tricky)
397 , (testeMapa , 1.2, Carro (9.5,1.5) 0 (0.1,0.9))
398 -- rampas: não passa (tricky)
399 , (testeMapa , 1.2, Carro (9.5,1.5) 0 (-0.1,0.9))
400 -- rampas: choca rés-vés (tricky x2)
401 , (testeMapa , 1.2, Carro (9.5,2.5) 0 (0,-0.9))
402 -- rampas: choca lava
403 , (testeMapa , 1.2, Carro (9.5,2.5) 0 (0.1,0.9))
404 -- rampas: cai lava
405 , (testeMapa , 1.2, Carro (9.5,1.5) 0 (0.1,-0.9))
406 ------
407
408 ----- PLANO ANTIGO (cai se altura maior, choca se menor, passa se igual)
409 -- -- rampas: cai
410 -- , (testeMapa , 1.2, Carro (6.5,2.5) 0 (0.1,-0.9)) -- oracle: (6.6,1.4), got Noth
411 -- -- rampas: passa
412 -- , (testeMapa , 1.2, Carro (2.5,1.5) 0 (0.1,0.9))
413 -- -- rampas: choca
414 -- , (testeMapa , 1.2, Carro (3.5,2.5) 0 (0.1,-0.9)) -- oracle: (_.1.5), got (_,2.6)
415 -- -- rampas x2: choca
416 -- , (testeMapa , 1.2, Carro (4.5,1.5) 0 (0.1,0.9)) -- oracle (_.2.5), got (_,1.4)
417 -- -- rampas x2: cai
418 -- , (testeMapa , 1.2, Carro (4.5,1.5) 0 (-0.1,0.9)) -- oracle (4.4,2.6), got Noth
419 -- -- rampas x2: bónus - passa?
420 -- , (testeMapa , 1.2, Carro (4.5,1.5) 0 (0,0.9))
421 -------------
422 ]
423
424
425