Untitled

 avatar
unknown
plain_text
2 months ago
9.8 kB
4
Indexable
module Desenhar where

import Graphics.Gloss
import ImmutableTowers



desenha :: ImmutableTowers -> Picture
desenha (ImmutableTowers m b) = Pictures $ desenhaterreno (mapaCoord (0.5,0.5) m) m ++ desenhaBase posBase

  where

    desenhaterreno :: [(Terreno, Posicao)] -> Mapa -> [Picture]
    desenhaterreno [] _ = []
    desenhaterreno ((t,(x,y)):r) mapa
     |t == Terra && aguacimabaixo (x,y) mapa = desenhapontehorizontal (x,y) ++ desenhaterreno r mapa
     |t == Terra && aguaesqdir (x,y) mapa = desenhapontevertical (x,y) ++ desenhaterreno r mapa
     |t == Terra = desenhaterra (x,y) ++ desenhaterreno r mapa
     |t == Relva = desenharelva (x,y) ++ desenhaterreno r mapa
     |otherwise = desenhaagua (x,y) ++ desenhaterreno r mapa

    
    desenhaterra :: Posicao  -> [Picture]
    desenhaterra (x,y) = [desenhaterradireita (x,y)] ++ [desenhaterraesquerda (x,y)] ++ [desenhaterramain (x,y)]
    desenhaterramain :: Posicao -> Picture 
    desenhaterramain (x,y) = Color (makeColorI 186 140 93 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h) $ polygon [(-w/2,0), (0,h/2), (w/2,0), (0,-h/2)]
    desenhaterradireita :: Posicao -> Picture
    desenhaterradireita (x,y) = Color (makeColorI 129 96 62 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(w/2,0), (w/2,-h/4), (0,-h/2-h/4), (0,-h/2)]
    desenhaterraesquerda :: Posicao -> Picture
    desenhaterraesquerda (x,y) = Color (makeColorI 167 125 83 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,0), (-w/2,-h/4), (0,-h/2-h/4), (0,-h/2)]

    desenhaagua :: Posicao  -> [Picture]
    desenhaagua (x,y) = [desenhaaguadireita (x,y)] ++ [desenhaaguaesquerda (x,y)] ++ [desenhaaguamain (x,y)]
    desenhaaguamain :: Posicao -> Picture 
    desenhaaguamain (x,y) = Color (makeColorI 154 209 221 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,0), (0,h/2), (w/2,0), (0,-h/2)]
    desenhaaguadireita :: Posicao -> Picture
    desenhaaguadireita (x,y) = Color (makeColorI 121 194 210 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(w/2,0), (w/2,-h/4), (0,-h/2-h/4), (0,-h/2)]
    desenhaaguaesquerda :: Posicao -> Picture
    desenhaaguaesquerda (x,y) = Color (makeColorI 143 204 217 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,0), (-w/2,-h/4), (0,-h/2-h/4), (0,-h/2)]

    desenharelva :: Posicao  -> [Picture]
    desenharelva (x,y) = [desenharelvadireita (x,y)] ++ [desenharelvaesquerda (x,y)] ++ [desenharelvamain (x,y)]
    desenharelvamain :: Posicao -> Picture 
    desenharelvamain (x,y) = Color (makeColorI 91 142 80 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,0), (0,h/2), (w/2,0), (0,-h/2)]
    desenharelvadireita :: Posicao -> Picture
    desenharelvadireita (x,y) = Color (makeColorI 61 97 53 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(w/2,0), (w/2,-h/4), (0,-h/2-h/4), (0,-h/2)]
    desenharelvaesquerda :: Posicao -> Picture
    desenharelvaesquerda (x,y) = Color (makeColorI 81 127 71 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,0), (-w/2,-h/4), (0,-h/2-h/4), (0,-h/2)]


    desenhapontehorizontal :: Posicao  -> [Picture]
    desenhapontehorizontal (x,y) = [desenhapontemain (x,y)] ++ [desenharailpontedirh (x,y)] ++ [desenharailponteesqh (x,y)] ++ [desenhaponteaguadireita (x,y)] ++ [desenhaponteaguaesquerda (x,y)] ++ [desenhapontedireita (x,y)] ++ [desenhaponteesquerda (x,y)] 
    desenhapontemain :: Posicao -> Picture 
    desenhapontemain (x,y) = Color (makeColorI 161 157 158 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,0), (0,h/2), (w/2,0), (0,-h/2)]
    desenharailponteesqh :: Posicao -> Picture
    desenharailponteesqh (x,y) = Color (makeColorI 77 46 28 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(0,3*h/4), (0,h/2), (w/2,0), (w/2,h/4)]
    desenharailpontedirh :: Posicao -> Picture
    desenharailpontedirh (x,y) = Color (makeColorI 77 46 28 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,h/4), (-w/2,0), (0,-h/2), (0,-h/4)]
    desenhaponteesquerda:: Posicao -> Picture
    desenhaponteesquerda (x,y) = Color (makeColorI 103 104 109 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,0), (-w/2,-h/8), (0,-h/2-h/8), (0,-h/2)]
    desenhaponteaguaesquerda :: Posicao -> Picture
    desenhaponteaguaesquerda (x,y) = Color (makeColorI 143 204 217 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,0), (-w/2,-h/4), (0,-h/2-h/4), (0,-h/2)]
    desenhapontedireita :: Posicao -> Picture
    desenhapontedireita (x,y) = Color (makeColorI 103 104 109 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(w/2,0), (w/2,-h/8), (0,-h/2-h/8), (0,-h/2)]
    desenhaponteaguadireita :: Posicao -> Picture
    desenhaponteaguadireita (x,y) = Color (makeColorI 121 194 210 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(w/2,0), (w/2,-h/4), (0,-h/2-h/4), (0,-h/2)]


    desenhapontevertical :: Posicao  -> [Picture]
    desenhapontevertical (x,y) = [desenhapontemain (x,y)] ++ [desenharailpontedirv (x,y)] ++ [desenharailponteesqv (x,y)] ++ [desenhaponteaguadireita (x,y)] ++ [desenhaponteaguaesquerda (x,y)] ++ [desenhapontedireita (x,y)] ++ [desenhaponteesquerda (x,y)] 
    desenharailponteesqv :: Posicao -> Picture
    desenharailponteesqv (x,y) = Color (makeColorI 77 46 28 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [(-w/2,h/4), (-w/2,0),(0,h/2), (0,3*h/4)]
    desenharailpontedirv :: Posicao -> Picture
    desenharailpontedirv (x,y) = Color (makeColorI 77 46 28 255) $ translate (x*w/2 - y*w/2) (-x*h/2 - y*h/2 + 4*h)  $ polygon [ (w/2,0), (w/2,h/4), (0,-h/4), (0,-h/2)]

    desenhaBase :: Posicao -> [Picture]
    desenhaBase pos = desenhaBase1 pos ++ desenhaBase2 pos ++ desenhaBase3 pos ++ desenhaBase4 pos ++ desenhaTelhado1 pos ++ desenhaTelhado2 pos ++ desenhaBandeiraPole pos ++ desenhaBandeira pos


    desenhaBase1 :: Posicao -> [Picture]
    desenhaBase1 (x, y) = [
        translate (x * w / 2 - y * w / 2) (-x * h / 2 - y * h / 2 + 4 * h) $
        Color (makeColorI 174 184 174 255) $
        Pictures [polygon [(-w/2, 0), (-w/2, h/8), (0, -h/2 + h/8), (0, -h/2)], 
                  polygon [(-w/2 + w/8, h/2), (-w/2 + w/8, h/2 + h/8), (0, h/4), (0, h/8)]]
      ]

    desenhaBase2 :: Posicao -> [Picture]
    desenhaBase2 (x, y) = [
        translate (x * w / 2 - y * w / 2) (-x * h / 2 - y * h / 2 + 4 * h) $
        Color (makeColorI 207 218 206 255) $
        polygon [(-w/2, h/8), (-w/2 + w/8, h/2), (0, h/8), (0, -h/2 + h/ 8)]
        ]

    desenhaBase3 :: Posicao -> [Picture]
    desenhaBase3 (x, y) = [
        translate (x * w / 2 - y * w / 2) (-x * h / 2 - y * h / 2 + 4 * h) $
        Color (makeColorI 135 142 134 255) $
        Pictures [polygon [(w/2, 0), (w/2, h/8), (0, -h/2 + h/8), (0, -h/2)], 
                  polygon [(w/2 - w/8, h/2), (w/2 - w/8, h/2 + h/8), (0, h/4), (0, h/8)]]
      ]

    desenhaBase4 :: Posicao -> [Picture]
    desenhaBase4 (x, y) = [
        translate (x * w / 2 - y * w / 2) (-x * h / 2 - y * h / 2 + 4 * h) $
        Color (makeColorI 182 191 181 255) $
        polygon [(w/2, h/8), (w/2 - w/8, h/2), (0, h/8), (0, -h/2 + h/ 8)]
      ]

    desenhaTelhado1 :: Posicao -> [Picture]
    desenhaTelhado1 (x, y) = [
        translate (x * w / 2 - y * w / 2) (-x * h / 2 - y * h / 2 + 4 * h) $
        Color (makeColorI 213 101 101 255) $
        polygon [(-w/2 + w/8, h/2 + h/8), (0, h), (0, h/ 4)]
      ]

    desenhaTelhado2 :: Posicao -> [Picture]
    desenhaTelhado2 (x, y) = [
        translate (x * w / 2 - y * w / 2) (-x * h / 2 - y * h / 2 + 4 * h) $
        Color (makeColorI 188 88 88 255) $
        polygon [(w/2 - w/8, h/2 + h/8), (0, h), (0, h/ 4)]
      ]

    desenhaBandeiraPole :: Posicao -> [Picture]
    desenhaBandeiraPole (x, y) = [
        translate (x * w / 2 - y * w / 2) (-x * h / 2 - y * h / 2 + 4 * h) $
        Color (makeColorI 139 69 19 255) $
        polygon [(-h/64, h-h/32), (-h/64, 5*h/4), (h/64, 5*h/4), (h/64, h-h/32)]
      ]

    desenhaBandeira :: Posicao -> [Picture]
    desenhaBandeira (x, y) = [
        translate (x * w / 2 - y * w / 2) (-x * h / 2 - y * h / 2 + 4 * h) $
        Color red $
        polygon [(-h/64, 9*h/8), (-h/64, 5*h/4), (-h/4, 5*h/4), (-h/8, 19*h/16), (-h/4, 9*h/8)]
      ]

    posBase = posicaoBase b

w = 100
h = w/2


mapa01 :: Mapa
mapa01 =
    [ [t,t,a,r,r,r,r,r],
      [a,t,a,a,r,t,t,t],
      [a,t,a,a,r,t,r,a],
      [a,t,a,a,r,t,r,a],
      [t,t,a,a,r,t,t,t],
      [t,a,a,a,r,r,r,t],
      [t,a,t,t,t,t,t,t],
      [t,t,t,a,r,r,r,a]
                      ] 
    where
        t = Terra
        r = Relva
        a = Agua


contaCol :: Mapa -> Int
contaCol ([] : b) = 0
contaCol ((a : b):ab) = 1 + contaCol (b:ab)

contaLinh :: Mapa -> Int
contaLinh [] = 0
contaLinh ((a : b):ab) = 1 + contaCol ab

mapaCoord :: Posicao -> Mapa -> [(Terreno,Posicao)]
mapaCoord _ [] = []
mapaCoord (x, y) ([] : b) = mapaCoord (0.5, y + 1) (b)
mapaCoord (x, y) ((a : b):ab) = (a,(x, y)) : mapaCoord (x + 1, y) ((b) : ab)


aguacimabaixo :: Posicao -> Mapa -> Bool
aguacimabaixo (x,y) mapa = length ((filter (==(Agua, (x,y-1)))(mapaCoord (0.5, 0.5) mapa)) ++ (filter (==(Agua, (x,y+1)))(mapaCoord (0.5, 0.5) mapa))) == 2 

aguaesqdir :: Posicao -> Mapa -> Bool
aguaesqdir(x,y) mapa = length ((filter (==(Agua, (x+1,y)))(mapaCoord (0.5, 0.5) mapa)) ++ (filter (==(Agua, (x-1,y)))(mapaCoord (0.5, 0.5) mapa))) == 2 


main :: IO ()
main = display
            (InWindow "Immutable Towers" (((round w)+10)*(contaCol mapa01),((round h)+10) * (contaLinh mapa01)) (500, 250))
            black
            (desenha (ImmutableTowers mapa01 (Base 100 (7.5,1.5) 0)))
Leave a Comment