EP4 - Mega Jogo da Velha!
Projeto Mega Jogo da Velha
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, o Mega Jogo da Velha, ou Jogo da Mega-Velha, se preferirem :-)
O
código deve ser escrito colaborativamente por todos os membros do grupo
que obrigatoriamente devem criar um projeto privado no gitlab ou github 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 os monitores deverão ser incluídos como Reporters
do seu projeto privado para acompanhar o desenvolvimento
(usuários gitlab @fabio.kon, @MaxCG e @anayoon e github @anayflima, @MxCG, @fabiokon). 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 22 de dezembro; submeta no edisciplinas um arquivo texto com o link para o seu repositório. 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).
Nosso projeto será uma implementação orientada a objetos, em Python do Ultimate Tic-Tac-Toe (vide https://en.wikipedia.org/wiki/Tic-tac-toe_variants). A ideia é que um macro-tabuleiro é composto por 9 micro-tabuleiros de jogo da velha dispostos no formato de um grande jogo da velha (3x3). Os jogadores podem escolher jogar em qualquer lugar do macro-tabuleiro, uma jogada por vez, de forma alternada. Quando um jogador ganha um dos micro-tabuleiros, aquele micro-tabuleiro é marcado inteiro como pertencente ao jogador que o venceu. Ganha o jogo quem ganhar o jogo da velha no macro-tabuleiro. Em sua versão mais simples, a interface com o usuário será baseada em texto, no terminal (entrada e saída padrão).
Uma restrição importante é que o código que verifica se um jogador ganhou deve ser exatamente o mesmo código executado tanto nos micro-tabuleiros quanto no macro-tabuleiro. Ou seja, deve ser 1 único código que vai ser chamado em ambas as situação, não pode haver duplicação de código.
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 0,5 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 (ou inglê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 0,5 ponto extra de bonus, você pode implementar
uma interface gráfica para o jogo.
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).
Valendo 0,5 ponto extra de bonus, você dá ao usuário a opção de decidir entre um jogo da velha tradicional alternando as jogadas ou adotar um esquema Random turn tic-tac-toe (vide https://en.wikipedia.org/wiki/Tic-tac-toe_variants). Isso deve ser implementado de forma bem orientada a objetos.
Valendo 0,5 ponto extra de bonus, você dá ao usuário a opção de decidir
entre um jogo da velha tradicional com jogadas X ou O ou adotar um
esquema Numeric tic-tac-toe (vide https://en.wikipedia.org/wiki/Tic-tac-toe_variants). Neste caso, fique à vontade para definir qual a regra para vencer no macro-tabuleiro. Isso deve ser implementado de forma bem orientada a objetos e evitando ao máximo código duplicado.
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.