Disciplina: FGA0210 - PARADIGMAS DE PROGRAMAÇÃO - T02
Nro do Grupo (de acordo com a Planilha de Divisão dos Grupos): 02
Paradigma: Funcional
Matrícula | Aluno |
---|---|
180099353 | Cibele Freitas Goudinho - @CibeleG |
190108011 | Guilherme Brito Vilas Boas - @dev-brito |
170105342 | Irwin Schmitt - @irwinschmitt |
180103792 | Júlia Farias Sousa - @julisous |
180104390 | Lameque Fernandes Azevedo - @LamequeFernandes |
201000379 | Leonardo Milomes Vitoriano - @leonardomilv3 |
180078224 | Thaís Rebouças de Araujo - @Thais-ra |
200028367 | Victor Hugo Oliveira Leão - @victorleaoo |
A fim de praticar os conhecimentos do Paradigma Funcional, foi desenvolvido o jogo de cartas UNO na linguagem Haskell.
Para aqueles que não conhecem o jogo, ele funciona, basicamente, da seguinte maneira:
- Cada jogador recebe, inicialmente, 7 cartas de um monte de cartas composto por cartas de 0-9 separadas entre as cores azul, vermelho, amarelo e verde, além de cartas especiais (bloqueio, reverter a ordem, comprar 2 ou 4 cartas e mudar a cor da carta do topo).
- Uma carta de topo é colocada e, assim, os jogadores tem que jogar, por rodada, uma de suas cartas que são válidas ou de cor ou de número/tipo, atualizando a carta de topo pelas suas jogadas. Caso a carta tenha algum efeito especial, ele também é acionado.
- O jogador pode comprar cartas do monte de cartas, caso ele não possua nenhuma válida.
- Quando um jogador só possuí uma carta, ele deve sinalizar UNO.
- Ganha (e acaba com o jogo) aquele jogador que não tiver posse de nenhuma carta antes de todos os outros.
Imagem de exemplo dos tipos de cartas presentes no jogo UNO:
Linguagens: Haskell
Tecnologias: GHCi (versão 9.2.7) e Cabal (3.6.2.0).
Com as tecnologias acima citadas instaladas, para rodar o jogo/projeto, siga os seguintes passos:
- Rode os comandos
sudo apt install cabal-install
ecabal update
. - Instale as dependências e rode o jogo com
cabal run
.
A partir dos passos acima, o jogo já estará sendo executado, assim, só seguir as instruções na tela para jogar. Se divirta! :)
Link para o vídeo no Youtube https://youtu.be/DLZ7Eg6vu2k
Nome do Membro | Contribuição | Significância da Contribuição para o Projeto (Excelente/Boa/Regular/Ruim/Nula) |
---|---|---|
Cibele Freitas Goudinho - @CibeleG | Desenvolvimento da validGame em dupla com a Julia. Desenvolvimento da função selectValidCard na logica geral em pareamento com Leonardo e Victor. | Excelente |
Guilherme Brito Vilas Boas - @dev-brito | Desenvolvimento de Lógica para Cartas Especiais, Integração da lógica de Cartas Especiais para a Lógica Geral do Jogo | Excelente |
Irwin Schmitt - @irwinschmitt | Configuracão do repositório com o cabal ; Desenvolvimento da interface de seleção de cartas (app/UI/). |
Excelente |
Júlia Farias Sousa - @julisous | Desenvolvimento da validGame em dupla com a Cibele | Boa |
Lameque Fernandes Azevedo - @LamequeFernandes | Desenvolvimento das funções presentes no UI.hs, AuxCards.hs e de algumas presentes no Utils.hs; Integração de parte do "frontend" com a lógica do projeto. | Excelente |
Leonardo Milomes Vitoriano - @leonardomilv3 | Desenvolvimento da logicaGeral em dupla com o membro Victor: - Leitura dos jogadores e distribuição da mão deles - Parte da implementação da função playGame e playTurn: verificar se o jogador está de UNO; encerrar o jogo; validar mão do jogador e carta jogada no topo |
Excelente |
Thaís Rebouças de Araujo - @Thais-ra | Desenvolvimento de Lógica para Cartas Especiais | Boa |
Victor Hugo Oliveira Leão - @victorleaoo | Desenvolvimento da logicaGeral em dupla com o membro Leonardo: - Criação do monte de cartas (deck) e seu embaralhamento - Parte da implementação da função playGame e playTurn: funcionamento inicial da lista rotativa de jogadores; comprar carta do monte; manipulação (selecionar e retirar) carta jogada pelo jogador. |
Excelente |
(i) Lições Aprendidas:
- Como desenvolver um projeto com base no Paradigma Funcional. Assim, a manipulação de listas (variáveis imutáveis) e recursividade foram elementos muito explorados, elementos muitas vezes negligenciados quando trabalhando com outros paradigmas e linguagens não similares ao Haskell, por exemplo.
- Iteração Vs. Recursão -> Em outros paradigmas e linguagens o uso de loops é comum nos programas, mas sabemos que toda iteração pode ser transformada em uma Recursão. No Haskell, o lado recursivo dos Loops é muito encorajado. Logo, nesse trabalho foi exercitado essa tradução de Algoritmos Iterativos em Recursivos, como por exemplo na função responsável pela compra de cartas do topo 'n' vezes
(ii) Percepções:
- Por estarem condicionados e acostumados com o Paradigma Procedural, muitas vezes, de primeira, era complexo ver uma solução totalmente voltada ao Paradigma Funcional.
(iii) Contribuições e Fragilidades:
- Verificar e validar entradas do usuário.
- Funcionalidades de diferentes modos de jogadas, como, por exemplo, jogar sequências.
- Jogo condicionado ao caminho feliz, não tem muitos tratamentos e validações, seria interessante adição desses tratamentos
(iV) Trabalhos Futuros:
- Modo de jogo por LAN (jogadores na mesma rede, mas em computadores diferentes).