Ir para o conteúdo principal

Projeto Final da Disciplina!!

PROJETO FINAL DA DISCIPLINA

O projeto da disciplina deverá ser feito em grupos de 4 a 6 alunos. Mistura de alunos de pós e graduação são bem-vindas. Teremos dois tipos de projetos para escolha. O primeiro fará você virar gente grande em desenvolvimento pois envolve desenvolver um sistema Web que coleta dados da Web e oferece um sistema Web usando o padrão MVC. O segundo fará você virar um ótimo desenvolvedor mas não necessariamente gente grande :-) pois envolve a criação de um videogame, o que exercitará interfaces gráficas 2D, tempo real, estruturas de dados e padrões de projeto OO.

Cada grupo deverá criar um repositório no gitlab que será acompanhado mensalmente. Pelo repositório será possível acompanhar as contribuições de cada membro do grupo. Se vocês fizerem programação em pares, é importante dividir os commits entre os dois membros alternadamente (um dia faz o commit no nome de um dos alunos e no outro dia faz o commit no nome do outro aluno para termos certeza que todos estão trabalhando).

Projeto 1 - Sistema Web


A Internet está cheia de fontes de informações interessantes (e mais cheia ainda de lixo inútil). Para auxiliar os internautas a localizarem e organizarem informações úteis, vocês deverão implementar, utilizando o padrão MVC, um agregador de informações customizável por um usuário específico.

Você terá duas opções para escolher, baseado naquilo que você achar mais interessante: um recomendador de disciplinas da USP ou um monitor da ação política de parlamentares.


1)a) Recomendador de Disciplinas:

1) Por meio de uma página Web do seu sistema, um usuário deve ser capaz de fornecer (A) uma lista de Departamentos da USP nos quais ele gostaria de cursar disciplinas de graduação e (B) uma lista das disciplinas de graduação que ele já cursou na USP e já foi aprovado.

2) O sistema deve permitir remover e listar departamentos e disciplinas, sempre de forma intuitiva e visualmente agradável.

3) O usuário deve então ser capaz de inserir um conjunto de palavras-chave ou expressões (i.e., sequências de palavras separadas por espaço) indicando tópicos que ele gostaria de estudar. Por exemplo "Orientação a Objetos", "Aprendizado de Máquina", "Música Eletroacústica" ou "distribuído".

4) O sistema deve carregar e mostrar de forma bonita e bem organizada os títulos e informações básicas sobre as disciplinas cursadas pelo aluno e pelas disciplinas das unidades indicadas que batem com alguma das palavras-chave ou expressões indicadas.

5) O sistema deve montar e mostrar de forma bonita e bem organizada um grafo de dependências mostrando os pré-requisitos das disciplinas carregadas no sistema (que batem com alguma das palavras-chave ou expressões indicadas) para as quais o usuário já tem os pré-requisitos necessários para cursá-la. Dessa forma, o usuário poderá visualizar facilmente  quais disciplinas de interesse ele poderá cursar no próximo semestre.

6) Ao definir as palavras-chave e expressões, o usuário deve poder usar expressões regulares


7) De uma forma bonita e elegante, o sistema deve mostrar uma nuvem de palavras representando as disciplinas que o aluno já cursou e outra nuvem de palavras representando as disciplinas recomendadas pelo sistema baseadas nas palavras-chave fornecidas pelo aluno.

8) Opcional (ponto bônus): O sistema deve ser capaz de sugerir disciplinas que o usuário ainda não cursou mas que são pré-requisitos importantes para disciplinas sobre tópicos que ele tenha interesse em estudar. O sistema deve mostrar claramente quais disciplinas em tópicos de interesse passam a ser passíveis de serem cursadas para cada um desses pré-requisitos.

1)b) Monitor Político:

1) Por meio de uma página Web do seu sistema, um usuário deve ser capaz de fornecer (A) uma lista de partidos políticos que ele gostaria de monitorar e (B) uma lista de deputados federais que ele gostaria de monitorar.

2) O sistema deve permitir remover e listar partidos e deputados, sempre de forma intuitiva e visualmente agradável.

3) O usuário deve então ser capaz de inserir um conjunto de palavras-chave ou expressões (i.e., sequências de palavras separadas por espaço) indicando tópicos que ele gostaria de monitorar. Por exemplo "Meio-ambiente", "Saúde da mulher", "Educação infantil" ou "Ciência".

4) Dado um período definido pelo usuário, o sistema deve carregar e mostrar de forma bonita e bem organizada um resumo de todos os votos das entidades selecionadas (partidos ou deputados). Esse resumo deve ser mostrado tanto em forma de texto, quanto em forma visual em gráficos.

5) O sistema deve montar e mostrar de forma bonita e bem organizada os votos de acordo com as temáticas indicadas no item 3).

6) Ao definir as palavras-chave e expressões, o usuário deve poder usar expressões regulares

7) De uma forma bonita e elegante, o sistema deve mostrar duas nuvens de palavras distintas  representando os votos SIM e NÃO das entidades selecionadas (partidos ou deputados). O sistema deve também mostrar uma nuvem de palavras representando os projeto de lei propostos por cada entidade selecionada.

9) Opcional (ponto bônus): Sugira uma nova funcionalidade ainda não especificada acima. Ou então, incorpore no sistema um relato dos gastos de um partido ou deputados de acordo com  https://www2.camara.leg.br/transparencia/receitas-e-despesas/despesas/pesquisa-de-despesas.

Obs.: Seu colega de disciplina Leonardo Leite, autor do Radar Parlamentar, pode servir de consultor para seu grupo caso vocês sintam a necessidade.

Dicas e sugestões:

- https://www.youtube.com/watch?v=vtPkZShrvXQ. Intro to SpringBoot - tutorial for beginners - Uma boa ferramenta de MVC em Java que recomendamos que vocês usem neste projeto.

- Fiquem à vontade para usarem qualquer classe da biblioteca padrão de Java ou outra linguagem orientada a objetos ou qualquer biblioteca de software livre disponível na Web.

- O ferramental para criar tanto o front-end quanto o back-end deve ser orientado a objetos.  A interface do cliente pode usar algo como React.js, Angular ou Vue.js.

- Caso haja interesse, a interface do cliente pode ser específica para telefones celulares, por exemplo, usando PWA para fazer o app).

- Como esse projeto tem uma interface Web dentro do navegador, pode ser interessante fazer testes usando o Selenium Web Driver ou Selenium IDE, dêem uma olhada. É uma ferramenta super-útil e poderosa. Não assisti, mas esse vídeo parece ser bem didático: https://youtu.be/YPTlx9vbikM Há vários tutoriais escritos também como, por exemplo, https://saucelabs.com/resources/articles/getting-started-with-webdriver-selenium-for-java-in-eclipse ou https://www.toolsqa.com/selenium-tutorial/

Projeto 2 - O Scramble do Século 21.


Você deverá implementar uma versão contemporânea do incrível e inesquecível jogo Scramble!

Não vou descrever muito sobre como deve ser o jogo de Scramble, primeiro porque muitos de você já devem o conhecer e quem não conhece pode facilmente pesquisa na Web. Segundo, porque quero que vocês sejam criativos e façam o melhor jogo de Scramble que já viram em suas vidas. Vou apenas descrever alguns requisitos obrigatórios; fiquem à vontade para colocar outras melhorias adicionais.

Requisitos:

1) Utilizando o teclado, o jogador poderá se movimentar nas várias direções e também disparar tiros e bombas.

2) Utilizando o padrão Fábrica Abstrata, implemente a possibilidade do jogo ter diferentes aparências (look-and-feels). Assim, facilmente, o jogador poderá escolher se o espaço do jogo terá a aparência tradicional de espaço da década de 1980 ou outras que você inventar. Quando o usuário selecionar uma nova aparência, todos os elementos gráficos do jogo devem se redesenhar imediatamente. Você deve oferecer, pelo menos 3 aparências diferentes (p.ex., você pode ter uma baseada no Guerra nas Estrelas e outra baseada nos Smurfs).

3) Implemente os mísseis adversários que saem do chão, de forma bem simples.

4) Utilize o padrão State para representar as diferentes fases do jogo. Cada fase deve ser um pouquinho mais difícil que a anterior. As várias fases devem se parecer, aproximadamente, com as fases do jogo de 1981, mas você pode ser criativo e inovar. A ideia não é copiar e fazer um jogo idêntico ao original, é apenas se inspirar nele.

5) Utilize o padrão Strategy para definir diferentes algoritmos para o disparo dos mísseis adversários. Você pode pensar em ter, por exemplo, 3 níveis para os misseis: burro, médio e inteligente.

6) Implemente uma música de fundo diferente para cada uma das fases.

7) Eventos especiais devem ter efeitos sonoros interessantes e agradáveis (cuidado para não tornar o jogo insuportável). Use o padrão Decorator para implementar Volume e Reverberação em cima dos efeitos sonoros. O usuário deve ser capaz de escolher o volume e o nível de reverberação.

8) Opcional (bônus): Utilize o padrão Decorator para acrescentar algum comportamento dinâmico na nave espacial do jogador quando ele pega alguma coisa que lhe dá super-poderes durante alguns segundos (p.ex., quando ele passa por um campo de força super-quântico).

Dicas e sugestões:

- Uma série de bons vídeos tutoriais sobre a escrita de Jogos em Java: https://www.youtube.com/playlist?list=PLWms45O3n--6TvZmtFHaCWRZwEqnz2MHa

- Um bom livro gratuito sobre padrões específicos para jogos: http://gameprogrammingpatterns.com/contents.html Em particular, a leitura do padrão game loop é super-importante: http://gameprogrammingpatterns.com/game-loop.html

- Fiquem à vontade para usarem qualquer classe da biblioteca padrão de Java, por exemplo, java.awt.Graphics2D e qualquer biblioteca de software livre disponível na Web, por exemplo, para implementar a reverberação.

- É fundamental que vocês só utilizem material que vocês possam usar legalmente. Portanto, usem apenas material licenciado apropriadamente (p.ex., Creative Commons) ou que vocês mesmo criem. Alguns sites bons para achar esse tipo de asset são:
https://opengameart.org e https://freesound.org O mesmo vale para sprites, texturas e fontes de texto usadas. Para fontes de texto o Google Fonts é mais do que suficiente.

- O Wiki do grupo de jogos dos alunos do IME: https://uspgamedev.org/wiki/Referências (aliás, se gostarem da experiência e quiserem mais, vocês podem se juntar ao USPGameDev :-)


Cronograma e Entregas

O projeto deverá ser desenvolvido continuamente ao longo dos próximos 4 meses e terá as seguintes datas de entrega:

Fase 0, até 15 de setembro

Criar grupo no gitlab, colocar todos os membros lá e, por último, incluir professor e monitor como Reporters: @fabio.kon, @pedropc

  • Fase 1, até 15/outubro: requisito 1 + requisito 2
  • Fase 2, até 5/novembro: requisito 3 + requisito 4
  • Fase 3, até 26/novembro:  requisito 5
  • Fase 4, até 17/dezembro:  requisito 6 + requisito 7

Junto com cada fase, além do código no repositório gitlab, vocês devem apresentar um pequeno relatório (no arquivo README.md na raiz do seu projeto) descrevendo a explicação de como executar o programa e o que vocês fizeram naquela fase, com ênfase nas boas práticas de desenvolvimento de software e OO utilizadas. Sempre que possível, as principais funcionalidades do código devem ser cobertos por testes automatizados e as melhores práticas de Orientação a Objetos devem ser seguidas. 

- É terminantemente proibido a um grupo copiar o código de outro grupo.

- As entregas das Fases 2, 3 e 4 devem corrigir os problemas apontados pelos monitores nas fases anteriores.


Última atualização: quinta-feira, 11 nov. 2021, 09:47