EP4 - Projeto Jogo da Velha 3D
Projeto Jogo da Velha 3D
Para finalizar a disciplina com chave de ouro, vamos fazer um pequeno projeto para praticar Orientação a Objetos em Python. Vocês vão implementar, em grupos de 2 ou 3 alunos, um Jogo da Velha Tridimensional!
O código deve ser escrito colaborativamente por todos os membros do grupo que obrigatoriamente devem criar um projeto privado no gitlab.com para armazená-lo. A cada período de trabalho (tipicamente algumas horas) o código deve ser ressincronizado ao repositório de forma que todos os membros do grupo tenham a versão mais atual do código. Além disso, ao fazer um commit no repositório, deve-se incluir uma mensagem clara explicando o que foi feito de novo naquele commit. Os professores e o monitor deverão ser incluídos como Reporters do seu projeto privado no gitlab para acompanhar o desenvolvimento (usuarios @fabio.kon, @kellyrb e @batmacumba). A "entrega" do código para a correção pelo monitor será o código que estiver no repositório às 23:59 do dia 20 de dezembro. O projeto deve ter um arquivo README.md explicando tudo o que você precisar explicar para que o monitor possa facilmente executar o seu código. Coloque lá também o nome dos membros do grupo e número USP (podemos fazer isso porque o projeto é privado).
Neste jogo da velha, o tabuleiro é uma matriz tridimensional de dimensão 4x4x4. Vocês vão implementar uma versão orientada a objetos de um jogo que ja fez bastante história! (vide https://en.wikipedia.org/wiki/3D_tic-tac-toe)
Sua implementação deve buscar a melhor qualidade de código possível e um bom projeto orientado a objetos. Você deve representar as principais abstrações do problema por meio de classes. A comunicação entre os objetos deve ser feita por meio da chamada de métodos. Em particular, variáveis globais estão completamente proibidas! Para garantir que o programa não tenha erros nas funcionalidades principais, vocês devem implementar uma boa bateria de testes, por exemplo, usando o pytest.
Você deve usar classes para representar o tabuleiro, os jogadores e todas outras abstrações que julgar relevante.
Para implementar os jogadores, você deverá usar os conceitos de Herança e Polimorfismo. Você deverá implementar pelo menos 3 tipos diferentes de jogadores:
(1) jogador humano: as jogadas são digitadas no teclado do computador
(2) jogador estabanado: ele sempre joga numa posição aleatória do tabuleiro
(3) jogador come-crú: ele sempre escolhe a primeira posição livre do tabuleiro
Valendo 1 ponto extra de bonus, você pode também implementar um 4o tipo de jogador que usa alguma estratégia automatizada mais inteligente para jogar. Neste caso, a documentação da classe correspondente deve explicar a estratégia em português. Fique à vontade para buscar possíveis estratégias de IA na Web, mas você não pode copiar o código que implementa essas estratégias, você tem que fazer sua própria implementação das estratégias.
Quando o jogo se inicia, o programa pergunta qual será o tipo do 1o jogador e qual será o tipo do 2o jogador. Por exemplo, deve ser possível ter um jogo entre 2 humanos ou entre dois jogadores automatizados ou qualquer outra combinação possível.
Valendo 1 ponto extra de bonus, você pode implementar uma interface gráfica para o jogo, por exemplo, similar a https://www.mathsisfun.com/games/foursight-3d-tic-tac-toe.html . Esse exemplo é tão antigo que ele usa a linguagem Flash que está sendo descontinuada por conter uma série de falhas de segurança :-) A partir de 31/12/2020, ela não estará mais disponível.
Você pode usar qualquer biblioteca de python para fazer a visualização, por exemplo PyGame (https://www.pygame.org/wiki/tutorials) ou, se você gosta de um canhão para matar uma mosca, PyOpenGL. Nesse caso, você deve incluir instruções detalhadas do que o monitor deve fazer para rodar o seu programa (p.ex., como baixar e instalar as bibliotecas necessárias).
Nota sobre Ética Acadêmica:
* Você pode discutir soluções com os colegas e no Fórum mas não pode compartilhar o código da sua solução com colegas de outros grupos de forma nenhuma.
* Você é livre para utilizar bibliotecas de software livre como blocos básicos para construir a sua solução mas não pode copiar (plagiar) código de terceiros (p.ex., disponível na Web) que implemente essa solução ou partes significativas dela.
* Plágio é vedado pelo código de ética da USP e, caso seja detectado, tanto o grupo plagiado quanto o grupo plagiador receberão nota -10 no exercício. No caso de reincidência, ambos terão nota 0 na disciplina e um processo junto à comissão de graduação será aberto. Solicitar o código a terceiros em algum fórum na web ou em qualquer outro lugar também é classificado como plágio.