Skip to content

Latest commit

 

History

History
135 lines (99 loc) · 7.19 KB

File metadata and controls

135 lines (99 loc) · 7.19 KB

Pacman

Disciplina: FGA0210 - PARADIGMAS DE PROGRAMAÇÃO - T01
Nro do Grupo: 03
Paradigma: Funcional

Alunos

Matrícula Aluno
20/2028211 Antônio Aldísio
19/0026243 Dafne Moretti Moreira
18/0122258 Igor Queiroz Lima
19/0030879 João Pedro Moura Oliveira
17/0080102 Lucas Gomes Lopes
18/0114093 Lucas Ursulino Boaventura
19/0019085 Rafael Cleydson da Silva Ramos
19/0020377 Thiago Sampaio de Paiva

Sobre

O projeto, como o próprio nome já diz, trata-se de um Pacman, em que o jogador deve coletar o máximo de moedas possíveis ao mesmo tempo que foge de seu inimigo mortal, os fantasmas. O motivo para a escolha desse tema, é em decorrência da complexidade por trás de toda a interface gráfica e dos algoritmos de busca em grafos. Portanto, como uma forma de se aprender uma linguagem funcional (haskell, nesse caso) e exercitar a lógica para resolução de problemas, esse trabalho foi concebido.
A ideia do projeto é baseada do projeto final de um dos integrantes do grupo: Labirinto do Hoglin

Screenshots

Instalação

Linguagens: haskell
Tecnologias: GHCI, cabal e haskell

Pré-requisitos

Haskell, GHCI e cabal

O haskell pode ser baixado em conjunto com o ghci (e o cabal) através dos links dispostos, ou através dos pacotes oficiais de cada distro, na página oficial do haskell

Docker

É possivel, também, executar o projeto utilizando o docker com o X11Forwarding para executar a solução gráfica.

$ make build
$ make run

Uso

O uso do projeto é bem simples graças ao empacotador de dependências cabal, porém alguns problemas de compatibilidades podem surgir. Assim, é altamente recomendado utilizar ambiente linux.

# Atualizando o cabal
$ cabal update

# Iniciando o projeto
$ cabal run

# Realizar o load de todos os módulos sem iniciar a main
$ cabal repl

Após isso, a aplicação irá abrir e o jogo estará pronto para ser executado. Basta escolher o modo de jogo (solo ou difícil), onde no solo é possível escolher qual algorítmo o fantasma estará utilizando.
Para se movimentar utilize as setinhas do teclado, e se divirta.

Problemas de Compatibilidade Conhecidos

Durante o desenvolvimento da aplicação alguns problemas de compatibilidades dos módulos extras foram encontrados, a seguir se encontram algum deles descritos:

  • Problemas de versionamento entre os módulos: A princípio esse problema foi corrigido com a sintaxe modulo ==X.*, porém, ainda assim podem ocorrer problemas. Caso isso aconteça, deve-se alterar o arquivo ProjetoPacman.cabal na seguinte posição
38    build-depends:
39        base ==4.*,
40        heap ==1.*,
- 41        gloss ==1.*,       <-- Ex.: gloss dando problemas de compatibilidade
+ 41        gloss ==1.1.5.2,
42        random ==1.*,
  • Problemas de compatibilidade com a biblioteca Random: Foi evidênciado por alguns integrantes que ao dar o run no projeto com a biblioteca Random, existiam problemas no download da mesma. Portanto, para se resolver esse problema deve-se fixar a versão do random em uma versão compatível com a biblioteca ghc (tentativa e erro). Além disso, é necessário alterar o seguinte código do arquivo app/Coins.hs
generateRandom :: StdGen -> (Int, Int) -> (Int, StdGen)
- generateRandom seed range = uniformR range seed
+ generateRandom seed range = randomR range seed

Vídeo

https://youtu.be/WezdMQSgur4

Participações

Nome do Membro Contribuição Significância da Contribuição para o Projeto (Excelente/Boa/Regular/Ruim/Nula)
Antonio Aldisio Algoritmo Dfs Boa
Rafael Ramos Algoritmo Bfs Excelente
Thiago Paiva Menu, Modos de jogo e Mapa Excelente
João Pedro Moura Algoritmo A*, Fluxo com a Tela Final e Colisões do player Excelente
Lucas Gomes Algoritmo de Djikstra Excelente
Lucas Boaventura Módulo de Moeda (Draw/Update) e pontuação Excelente
Dafne Moretti Módulo de Ghosts (Draw/Update) e slow Excelente
Igor Lima Módulo do Player (Draw/Update/Input) Excelente

Outros

Lições Aprendidas

Haskell é estaticamente tipado. Quando compila o programa, o compilador saberá quais partes do código é um número, o que é uma string e assim por diante. Ou seja, uma série de erros pode ser capturada em tempo de compilação. Se você tentar adicionar um número a uma string, o compilador irá se queixar de você.

O Haskell é fortemente tipado e foi bastante trabalhoso sempre que precisava resolver conflitos ao realizar um merge entre branches. É importantíssimo que a pessoa que estava trabalhando em uma branch mantesse ela o mais atualizada possível com a master.

Contribuições e Fragilidades

O projeto apresentada uma fragilidade no algoritmo Dfs (Depth-first search), pois ele não está adaptado corretamente. Como o DFS retorna o primeiro caminho que ele encontra e o grafo do mapa é circular e fechado, então o fantasma sempre vai para a primeira célula que ele analisa, impossibilitando a perseguição. Para resolver esse problema, teria que implementar estratégias para limitar a profundeza da análise de cada célula, que são complexas e levaria mais tempo do que o planejado. O problema pode ser visto no gif abaixo:

Melhorias Futuras do Trabalho

Diversas alterações e melhorias ainda podem ser feitas, e a equipe separou algumas interessantes:

  • Novas implementações de algoritmos de busca, diversificando a movimentação dos fantasmas.
  • Geração aleatória e automática de fases e labirintos (mapa).
  • Adição do super poder do Pacman e rotas de fuga dos fantasmas. Exemplo: Possibilidade de "comer" o fantasma.
  • Adição de estratégias mais complexas de perseguição.
  • Adaptação da implementação do Dfs.
  • Inclusão de diferentes pontuações para as moedas e novos modos de jogo.

Fontes