PROJETO FINAL DA DISCIPLINA

O projeto da disciplina deverá ser feito em grupos de 4 a 6 pessoas. Misturas entre alunos de graduação e pós são fortemente encorajadas. 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 via uma API específica e oferece um sistema com interface Web para o usuário. 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 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, além disso, é bom o próprio commit já indicar o nome do par).

Até o dia 10/setembro/22 os grupos devem estar definidos e todos os membros do grupo registrados no repositório gitlab do grupo. Além disso, deverão ser cadastrados como Reporter no gitlab os 2 usuários seguintes: @fabio.kon e @matheus.v

No dia 13 de dezembro, os grupos farão uma apresentação final dos projetos. Os slides devem ser colocados nesta pasta compartilhada. Cada grupo deverá apresentar os resultados alcançados em 10 minutos, incluindo informações sobre a arquitetura de software, características interessantes de sua implementação, código interessante (opcional) e demonstração do software rodando (pode ser pré-gravado ou screenshots se preferirem).

Projeto 1 - Sistema Web interativo


Neste projeto, vocês irão desenvolver um sistema Web que permitirá a um usuário leigo utilizar o sistema por meio de uma interface web intuitiva, bonita, com bom design e boa usabilidade. O sistema a ser proposto pelo seu grupo deverá obrigatoriamente interagir com alguma API pública da Web por meio de algum protocolo padrão (p.ex., REST) ou por meio de raspagem de dados automatizada de algum site.


Requisitos básico: O sistema deve ter uma boa aparência, ser claro e fácil de se utilizar. As informações devem ser mostradas de uma forma bonita e bem organizada. Internamente, uma boa arquitetura orientada a objetos e a utilização das melhores práticas de programação e código limpo devem ser seguidas à risca. Finalmente, espera-se que o código tenha uma boa cobertura de testes automatizados.

Na primeira entrega, o grupo deverá fornecer uma lista de requisitos a serem entregues nas 3 datas futuras. As entregas das Fases 2 e 3 devem corrigir os problemas apontados pelos monitores nas fases anteriores. O projeto deverá ser desenvolvido continuamente ao longo dos próximos 3 meses e terá as seguintes datas de entrega:

Fase 0, até 10 de setembro

Criar grupo no gitlab, colocar todos os membros lá e, por último, incluir como Reporter @fabio.kon e @matheus.v

O arquivo README.md do repositório deve incluir uma descrição geral do que o sistema irá fazer e um cronograma preliminar das entregas, indicando uma primeira ideia do que será implementado em cada fase. O nome de todos os membros do grupo deve estar claramente reconhecível pelo nome dos usuários ou no próprio READ.ME

Fase 1, até 10/outubro

Nesta primeira entrega, desenvolver uma interface Web é opcional; ou seja, o sistema pode ter uma interface baseada em texto apenas na linha de comando. Espera-se aqui (1) um cronograma mais sólido do que será entregue até o final do projeto e (2) uma primeira versão de software já funcionando com alguma funcionalidade interessante para o usuário final.


Fase 2, até 7/novembro

A partir desta entrega, todo o sistema deve ser implementado oferecendo ao usuário uma interface Web; o usuário irá acessar o sistema por meio de um navegador Web. Espera-se aqui mais funcionalidades úteis ao usuário final, conforme o cronograma apresentado na entrega anterior. Neste ponto, o código deve utilizar pelo menos 1 padrão de projeto GoF e a documentação entregue (p.ex., no README.md) deve explicar qual a vantagem oferecida pelo padrão (não se deve usar o padrão só por usar, sem oferecer algum ganho real). Caso tenha havido alguma mudança no cronograma, isso deve ser explicado/justificado.

Fase 3, até 12/dezembro

Esta é a entrega final do software completamente funcional, com boa arquitetura OO interna, boa usabilidade, intuitivo e útil para o usuário final. Neste ponto, o código deve utilizar pelo menos  um segundo padrão de projeto GoF e a documentação entregue (p.ex., no README.md) deve explicar qual a vantagem oferecida pelo padrão (não se deve usar o padrão só por usar, sem oferecer algum ganho real). Caso tenha havido alguma mudança no cronograma, isso deve ser explicado/justificado.

--------

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:

- SpringBoot é um arcabouço (framework) Java que facilita o desenvolvimento de aplicações Web. Em particular, Spring MVC é usado para criar sistemas com interface Web que podem ser acessados por meio de um navegador Web (p.ex., Firefox ou Chrome). Um tutorial para iniciantes pode ser encontrado em https://spring.io/guides/gs/serving-web-content/ e um vídeo tutorial em  https://www.youtube.com/watch?v=vtPkZShrvXQ e outro em https://www.youtube.com/watch?v=Ku3gsv7_bCc. Mas note que esses dois vídeos possuem muito mais conteúdo do que nós precisamos, pois eles falam de bancos de dados e outras coisas que não são obrigatórias para o nosso projeto. Note que é possível também instalar dentro do Eclipse, o Spring Tools for Eclipse IDE, eu nunca usei, mas pode ser útil (para instalar, vá no Eclipse em Help->Eclipse Marketplace e aí busque por Spring Tools. Se alguém encontrar algum outro tutorial melhor, por favor, poste a dica no fórum da disciplina

- (essa dica sobrou do ano passado, mas resolvi deixar aqui de exemplo: Se alguém for usar o Spotify, essa biblioteca Java provavelmente irá ajudar bastante com o projeto, simplificando o acesso à API do Spotify: https://github.com/spotify-web-api-java/- Partes não cobertas pela biblioteca acima, podem ser encontradas aqui: https://developer.spotify.com/documentation/web-api/reference )

- Fiquem à vontade para usar 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  bem 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 - Jogo 2D interativo


Você deverá implementar uma versão contemporânea de um jogo das décadas de 1970, 1980 ou 1990.

Requisitos:

0) O jogo deve ter uma boa aparência, boa jogabilidade e ser divertido.  Internamente, uma boa arquitetura orientada a objetos e a utilização das melhores práticas de programação e código limpo devem ser seguidas à risca. Finalmente, espera-se uma boa cobertura de testes automatizados.

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.

Na primeira entrega, o grupo deverá fornecer uma lista de requisitos a serem entregues nas 3 datas futuras. As entregas das Fases 2 e 3 devem corrigir os problemas apontados pelos monitores nas fases anteriores. O projeto deverá ser desenvolvido continuamente ao longo dos próximos 3 meses e terá as seguintes datas de entrega:

Fase 0, até 10 de setembro

Criar grupo no gitlab, colocar todos os membros lá e, por último, incluir como Reporter @fabio.kon e @matheus.v

O arquivo README.md do repositório deve incluir uma descrição geral do jogo e um cronograma preliminar das entregas, indicando uma primeira ideia do que será implementado em cada fase. O nome de todos os membros do grupo deve estar claramente reconhecível pelo nome dos usuários ou no próprio READ.ME

Fase 1, até 10/outubro

Nesta primeira entrega, ter uma interface gráfica é opcional; ou seja, o sistema pode ter uma interface baseada em texto apenas na linha de comando (mas, se preferirem, podem começar já com uma interface gráfica desde o início também). Espera-se aqui (1) um cronograma mais sólido do que será entregue até o final do projeto e (2) uma primeira versão do jogo já funcionando com alguma funcionalidade de algum interesse. 


Fase 2, até 7/novembro

A partir desta entrega, todo o sistema deve ser implementado oferecendo ao usuário uma interface gráfica; o jogador irá interagir com o jogo pelo teclado ou mouse; opcionalmente, uma interface adicional por joystick pode ser oferecida mas não deve ser obrigatória. Espera-se aqui mais funcionalidades interessante para o jogador, conforme o cronograma apresentado na entrega anterior. Neste ponto, o código deve utilizar pelo menos 1 padrão de projeto GoF. Caso tenha havido alguma mudança no cronograma, isso deve ser explicado/justificado.

Fase 3, até 12/dezembro

Esta é a entrega final do jogo completamente funcional, com boa arquitetura OO interna, boa jogabilidade, intuitivo e divertido para o usuário final. Neste ponto, o código deve utilizar pelo menos um segundo padrão de projeto GoF. Caso tenha havido alguma mudança no cronograma, isso deve ser explicado/justificado.


Sugestões de possíveis padrões que podem ser utilizados:

Utilize o padrão Strategy para definir diferentes comportamentos para o movimento dos elementos do jogo (carrinhos, bombas, cogumelos, naves espaciais, dinossauros, etc.) O jogador poderá escolher uma estratégia ou outra por meio da interface gráfica do jogo.


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á (A) uma aparência da década e 1930 com Fords bigode atravessando a Marginal, (B) aparência de 2022 ou então (C) aparência de 2052 com carros elétricos autônomos guiados por computação quântica, barcos a remo super-velozes e o Rio Pinheiros despoluído com barcos à vela e hipotótamos que dão carona às capivaras. (Esse texto anterior é um exemplo do jogo Cappivara's do ano passado; no seu jogo, as diferentes aparências devem fazer sentido para o jogo específico que vocês escolheram).

Utilize o padrão State para representar as diferentes fases do jogo. Cada fase deve ser um pouquinho mais difícil que a anterior.

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 (por exemplo, ao roubar comida na lanchonete da Raia, a capivara passa a ser capaz de se colidir com obstáculos e nadar no Rio Pinheiros sem morrer).

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. Vocês podem utilizar qualquer linguagem Orientada a Objetos para implementar o jogo, desde que ela permita criar uma boa arquitetura OO.

- Implemente uma música de fundo diferente para cada uma das fases. Eventos especiais devem ter efeitos sonoros interessantes e agradáveis (cuidado para não tornar o jogo desagradável).

- É 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 :-)



Última atualização: terça-feira, 13 dez. 2022, 08:09