Nesse projeto desenvolveremos inicializaremos o desenvolvimento de um pequeno jogo baseado em Prolog. Para tal, utilizaremos o Tau Prolog, um interpretador Prolog totalmente escrito em JavaScript e que portanto roda facilmente em qualquer navegador.
Nosso jogo será então baseado em Prolog + HTML + CSS, no entanto as partes em HTML e CSS já serão fornecidas, e você só precisará trabalhar no código Prolog.
Teremos algumas fases de desenvolvimento, com atividades a serem desenvolvidas em cada uma delas.
O projeto pode ser desenvolvido em grupos de até 4 pessoas.
Você precisará de:
- Git
- Python 3.x (usaremos apenas como servidor web local, você não precisará programar em python.)
- Um editor de texto de sua preferência
Etapas:
- Clone este repositório:
git clone https://github.com/srmq/projeto-bomber-doge.git
- Entre no diretório com o código:
cd projeto-bomber-doge
- Execute o servidor http do python:
python -m http.server
(por padrão, o servidor rodará na porta 8000, se precisar de outro número de porta, passe como parâmetro o número após o http.server) - Abra seu navegador no site http://localhost:8000/doge.html
Pronto, o jogo já está rodando, divirta-se!
Esta fase, ao contrário das demais, deve ser feita de forma individual. O objetivo dela é você se familiarizar mais com prolog (e com sua encarnação Tau-Prolog), bem como com o código básico do jogo.
Você deverá analisar o código prolog do esqueleto do jogo fornecido,
no arquivo main.pl
, recorrendo à documentação do Tau-Prolog, sempre
que necessário. Então responda ao questionário no classroom. Esta fase
vale 1 ponto na nota do projeto. Você pode já discutir as questões
com o seu grupo, mas as respostas são individuais, responda com
suas palavras.
A seguir, novas fases serão divulgadas. As novas fases serão em grupo.
Agora que vocês já estão familiarizados com a estrutura básica do código, vocês estão aptos a aprimorá-lo, a fim de torná-lo um jogo mais divertido! Tudo isso praticando Prolog!
Serão propostas algumas missões para vocês realizarem, as missões básicas contam na pontuação do projeto. Já as missões finais especiais são opcionais, e você pode conseguir até 1 ponto extra (na nota final da disciplina) ao realizar (algumas) com sucesso!
Observação: você sempre pode introduzir predicados auxiliares que serão chamados pelos predicados solicitados, quando achar necessário.
- Os controles que ficam suspensos na tela atrapalham a visão do jogo. Modifique o arquivo main.pl para adicionar uma nova ação, que ocorre quando o jogador aperta a tecla 'c'. Ao apertar a tecla 'c' os controles devem sumir da tela se estiverem aparecendo. Se estiverem ocultos, ao apertar 'c' eles aparecem. Veja como será o resultado no vídeo a seguir (clique na imagem para ver o vídeo).
-
Veja que o predicado rnd_place_bone em main.pl, apesar do nome, sempre coloca o osso na posição fixa (200, 760). Você deve manter a posição horizontal fixa em 760, mas para a posição vertical faça com que o predicado coloque o osso numa posição aleatória entre 20 e 380. Para tal, use algum predicado do módulo random do Tau-Prolog (consulte a documentação). Se você remover a linha 'set_seed(1)' do predicado init/0, cada vez que você carregar o jogo o osso deve aparecer numa posição diferente. Veja como será o resultado no vídeo a seguir (aperta-se F5 cada vez para o navegador recarregar o jogo)
- Note que o cachorro consegue andar por cima das paredes. Isso não deve ocorrer. Para tal, foi introduzido o predicado doge_free/2 que recebe o ponto para o qual o cachorro quer andar e deve ter sucesso apenas se esse ponto para onde ele quer ir não topar em qualquer parede. O predicado move/3 já usa esse predicado. No entanto, como você pode ver no main.pl o doge_free/2 não foi implementado e sempre tem sucesso. Implemente o doge_free/2, será mais fácil utilizando predicados auxiliares. Uma dica é você verificar se o quadrado do cachorro no ponto para onde ele vai intersecta com algum quadrado de parede. Recomendo este link para lembrar as regras para verificar se dois retângulos se intersectam. (Lembre-se de que você deve implementar tudo em prolog, no arquivo main.pl). Veja como será o resultado esperado no vídeo a seguir (note que o cachorro tenta passar por cima da parede, mas não consegue)
- A intenção das paredes é montar um labirinto, do ponto inicial do cachorro até o osso. No entanto, a versão do predicado get_walls/1 no esqueleto simplesmente retorna uma pequena lista fixa de paredes. Modifique o predicado get_walls/1 de forma que ele construa uma lista de paredes mais interessante, como as paredes que vemos nos labirintos para crianças. Não digite no código explicitamente a posição das paredes, faça com que o get_walls/1 construa a lista de paredes quando for chamado, usando alguma estratégia interessante. Você pode mudar a posição inicial do cachorro também, se achar interesssante.
-
O nome do jogo é bomber doge porque a intenção é que quando o cachorro faz cocô, depois de um tempo o cocô explode, destruindo as paredes num raio ao redor do cocô, para que o cachorro possa passar. Por isso que já existe uma classe explosion que coloca uma explosão no jogo. Por exemplo, se você colocar a linha
<div class="explosion"></div>
em algum lugar do DOM, você verá a explosão no jogo. Nessa missão, você deve implementar esse comportamento (em prolog). Ou seja, depois de um tempo que o cocô é colocado, ele explode, destruindo as paredes num raio ao redor dele (você pode simplesmente sumir com as paredes ao redor depois da explosão). -
Que tal adicionar pontuação ao jogo? Para incentivar o jogador a terminar logo, a cada movimento do cachorro ele poderia perder pontos, e ao usar uma explosão perder ainda mais pontos. Quando ele alcançasse o osso, ganharia uma recompensa em pontos e o jogo terminaria.
-
Que tal adicionar múltiplos estágios, onde cada vez o layout do labirinto é diferente (e gerado automaticamente pelo get_/_walls/1)?
-
O céu é o limite! Implemente melhorias interessantes no jogo!
Você deve submeter o arquivo .pl modificado no classroom. No dia da apresentação você rodará o jogo numa apresentação do meet com o professor (o arquivo será submetido um dia antes). O professor fará perguntas a membros da equipe. Todo membro deve ser capaz de responder qualquer pergunta. Compartilhe o conhecimento dentro do seu grupo!
Lembre-se: cada trabalho é um produto original do grupo. Em caso de entregas idênticas, todas as cópias envolvidas receberão nota zero. Não coloque o seu código em um repositório público, ele poderá ser copiado. Mesmo depois da apresentação, não disponibilize o seu código, o professor poderá aproveitar o projeto em outros semestres e as pessoas poderiam deixar de aprender por conta própria copiando o seu projeto (e ainda receberiam zero!).