This repository has been archived by the owner on Nov 22, 2017. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMain.hs
56 lines (47 loc) · 1.92 KB
/
Main.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
module Main where
-- Motor principal do jogo
import Data.Maybe
import Graphics.Gloss
import Graphics.Gloss.Interface.Pure.Game
import Basico
import Dinamica
import Graficos
-- Definindo o estado inicial do jogo
estadoInicial :: Estado
estadoInicial = Estado
{ _quadro = limites largura altura
, _jogador = [ (-(largura `div` 4)+1, 0)
, (-(largura `div` 4) , 0)
, (-(largura `div` 4)-1, 0)
]
, _pontuacao = 3
, _alvo = (largura `div` 4, 0)
, _direcAtual = [Dir,Dir]
, _semente = 0
} where largura = (fst tamJanela `div` round (fst tamBloco))
altura = (snd tamJanela `div` round (snd tamBloco))
-- Usando Gloss.play como motor
glossPlay = play
{-janela-} (InWindow "Snake" tamJanela (20, 20))
{-cor-} white
{-fps-} pont2vel
{-mundo-} estadoInicial
{-render-} renderizar
{-evento-} atualizaDir
{-passo-} atualizaJogo
where pont2vel = round . (*20) . (/log 10) . log . fromIntegral
$ _pontuacao estadoInicial
-- Atualizar estado do jogo
atualizaJogo :: Float -> Estado -> Estado
atualizaJogo dt s = (movimentoAuto dt) . (detectParede estadoInicial)
. (detectCauda estadoInicial) . detectPonto $ s
-- Funcao para atualizar direcao segundo entrada do jogador
atualizaDir :: Event -> Estado -> Estado
atualizaDir acao mundo = maybe mundo atualiza (lerUsuario acao)
where atualiza d = if (validarDir atual d == True) && (validarDir ultim d == True)
then mundo {_direcAtual = [d, atual]}
else mundo
atual = head $ _direcAtual mundo
ultim = head $ tail $ _direcAtual mundo
main :: IO ()
main = glossPlay