PROJETO FINAL DA DISCIPLINA
O projeto da disciplina
deverá ser feito em grupos de 4 alunos. Pode haver mistura de alunos
entre as duas turmas. 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.
Deveremos ter
pelo menos 3 grupos de cada um dos projetos. Cada grupo deverá criar um
repositório no gitlab que será acompanhado semanalmente. 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 - Super agregador de blogs e notícias
A
Internet está cheia de fontes de notícias e informações interessantes
(e mais cheia ainda de lixo inútil). Para auxiliar os internautas a
localizarem textos de seu interesse, vocês deverão implementar, utilizando o padrão MVC, um
agregador de notícias e blogs customizável por um usuário específico.
Requisitos:
1)
Por meio de uma página Web do seu sistema, um usuário deve ser capaz de
fornecer uma série de blogs e canais de notícias que ele quer seguir.
Cada fonte de dados será dada por uma URI contendo uma fonte de posts no
protocolo RSS, por exemplo,
https://www.wired.com/category/science/feed,
https://www.nytimes.com/svc/collections/v1/publish/https://www.nytimes.com/section/world/rss.xml,
https://www.france24.com/en/rss,
https://feeds.folha.uol.com.br/ciencia/rss091.xml ou
http://www.agencia.fapesp.br/rss/
2) O sistema deve permitir
remover fontes de dados e listar as fontes cadastradas, sempre de forma
intuitiva e visualmente agradável.
3) O sistema deve carregar e
mostrar de forma bonita e bem organizada os títulos e fontes das
notícias de todos as fontes incluídas pelo usuário.
4) Ao se clicar em uma notícia específica, o sistema abre a notícia em uma nova janela.
5)
Inclua um filtro por data/hora das notícias que permita ver apenas
notícias publicadas em um determinado intervalo de tempo, por exemplo,
hoje, ontem à noite, entre 14:00 e 18:00 do dia 3 de abril, etc.
6)
O usuário deve ser capaz de incluir, remover e visualizar uma lista de
palavras-chave para as notícias que o interessa e o sistema deve apenas
mostrar ao usuário as notícias que contenham essas palavras-chave. Caso a
palavra-chave contenha um espaço, o usuário deverá usar aspas como, por
exemplo, em "Testes Automatizados".
7) Ao definir as palavras-chave, o usuário deve poder usar expressões regulares
8)
No topo da página que mostra as notícias filtradas para o usuário,
mostre uma bonita nuvem de palavras com as principais palavras que
aparecem nas notícias selecionadas para o usuário.
--------
O projeto deverá ser desenvolvido continuamente ao longo dos próximos 2 meses e terá as seguintes datas de entrega:
Fase 0, até 8 de maio
Criar
grupo no gitlab, colocar todos os membros lá e, por último, incluir
como Reporter @fabio.kon, @gabriely.pereira e @robson.aleixo.
Fase 1, até 22/maio
requisito 1 + requisito 2
Fase 2, até 12/junho
requisito 3 + requisito 4
Fase 3, até 1/julho
requisito 5 + requisito 6
--------
Itens opcionais que valerão pontos bonus: requisito 7, requisito 8 e qualquer outra melhoria legal que vocês propuserem.
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 o que vocês fizeram naquela fase e a explicação de
como executar o programa. Sempre que possível, as principais
funcionalidades do código devem ser cobertos por testes automatizados.
Dicas e sugestões:
- Um artigo de divulgação sobre RSS para leigos meio antigo na boa revista WIRED: https://www.wired.com/2010/02/rss_for_beginnners/
- https://www.vogella.com/tutorials/RSSFeed/article.html
- 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 qualquer biblioteca de software livre disponível na Web.
- É terminantemente proibido a um grupo copiar o código de outro grupo.
-
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 Pac Man do Século 21.
Você
deverá implementar uma versão contemporânea do jogo de Pac Man, criando
a visão descrita na seguinte matéria:
https://cozinhabruta.blogfolha.uol.com.br/2020/04/18/jantar-solitario-e-sequela-permanente-da-covid-19/
Não
vou descrever muito sobre como deve ser o jogo de Pac Man, primeiro
porque vocês 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 pac man que já viram em suas vidas.
Vou apenas descrever alguns requisitos obrigatórios; fiquem à vontade para colocar outras melhorias adicionais.
Requisitos:
1)
O mapa do jogo definindo o leiaute do tabuleiro deve ser definido em um
arquivo .txt que seja facilmente editável manualmente por um ser
humano. O mapa deverá conter as paredes e todos os elementos iniciais do
jogo, i.e., onde ficam os adversários, o jogador e todos os outros
elementos que dão pontos ao serem obtidos.
2) Utilizando o teclado, o jogador poderá se movimentar nas várias direções comendo pontinhos e pegando objetos no tabuleiro.
3) Utilize o padrão Strategy para definir diferentes algoritmos para o movimento dos adversários (fantasminhas).
4)
Utilizando o padrão Fábrica Abstrata, implemente a possibilidade do
jogo ter diferentes aparências (look-and-feel). Assim, facilmente, o
jogador poderá escolher se o espaço do jogo terá uma aparência de
supermercado em tempos de covid, velho oeste, espaço sideral ou os
corredores do IME, por exemplo. Quando o usuário selecionar uma nova
aparência, todos os elementos gráficos do jogo devem se redesenhar
imediatamente.
5) Utilize o padrão State para representar as
diferentes fases do jogo. Cada fase deve ser um pouquinho mais difícil
que a anterior.
6) Utilize o padrão Decorator para acrescentar
algum comportamento dinâmico em um jogador quando ele pega alguma coisa
que lhe dá super-poderes durante alguns segundos (como o Mario do Super
Mario Bros quando come o cogumelo e fica grande e ligadão).
7) Implemente uma música de fundo diferente para cada uma das fases.
8) Eventos especiais devem ter efeitos sonoros interessantes e agradáveis (cuidado para não tornar o jogo insuportável).
O projeto deverá ser desenvolvido continuamente ao longo dos próximos 2 meses e terá as seguintes datas de entrega:
Fase 0, até 8 de maio
Criar
grupo no gitlab, colocar todos os membros lá e, por último, incluir
como Reporter @fabio.kon, @gabriely.pereira e @robson.aleixo.
Fase 1, até 22/maio
requisito 1 + requisito 2
Fase 2, até 12/junho
requisito 3 + requisito 4
Fase 3, até 1/julho
requisito 5 + requisito 6
--------
Itens opcionais que valerão pontos bonus: requisito 7, requisito 8 e qualquer outra melhoria legal que vocês propuserem.
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 o que vocês fizeram naquela fase e a explicação de
como executar o jogo. Sempre que possível, as principais funcionalidades
do código devem ser cobertos por testes automatizados.
As entregas das Fases 2 e 3 devem corrigir os problemas apontados pelos monitores nas fases anteriores.
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.
- É terminantemente proibido a um grupo copiar o código de outro grupo.
-
É 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 :-)