Recomendações Importantes
Danilo e seus colegas queriam jogar sessões de 3DeT, mas estavam com problemas para organizar as sessões devidos as diferenças de horário entre eles. Para organizar isso, ele teve a ideia de criar um sistema pra organizar as sessões de maneira mais eficiente.
Para isso, ele precisa cadastrar cada pessoal que quer jogar, com seu nome, login, classe preferível, e dias da semana disponíveis. Ele também precisa cadastrar as pessoas dispostas a serem mestres, que possuem as mesmas caracteristicas dos jogadores, mas só estes podem mestrar uma sessão, além de ter um atributo SessoesMestradas(contador de sessões do mestre).
Também é necessário criar os personagens. Cada personagem terá seu nome, sexo, nivel, e classe. Ao ser criado, o nivel do personagem é igual a 1.
As classes disponíveis são Guerreiro, Arqueiro, Mago, Clérigo e Ladino.
.Ao criar a sessão, se escolhe o o dia da semana que a sessão ocorre, o nome da aventura. Após isso, deve-se adicionar o mestre da sessão(que deve estar disponível no dia), os jogadores, e os personagens..Cada sessão para ser iniciada será composta por um mestre, e no minimo 3 jogadores. Para iniciar a sessão, todos os jogadores e o mestre devem podem jogar no dia em da sessão.O mestre pode ter tantos personagens quiser,e participar de várias sessões. Jogadores(não mestre) só podem ter um personagem por sessão, mas podem participar de várias sessões. Após iniciada a sessão, não pode alterar os jogadores,mestre e personagens desta sessão(ou seja, não pode mais adicionar ou remover jogadores, o mestre ou personagens). Para relacionar jogadores e personagens dentro da sessão crie um método para isso.
Cada personagem só pode participar de uma única sessão aberta(ele não pode estar em duas sessões que foram inicializadas ao mesmo tempo). Ao finalizar a sessão, todos os personagens que participaram da sessão sobem um nível, exceto os personagens do mestre,e ficam disponíveis para formação de novas sessões.
Crie um método que forme uma sessão “balanceada”. Forme uma sessão com exatamente um personagem de cada classe, escolhendo quais jogadores participarão da sessão pela sua classe preferível, um mestre(não é preciso escolher quais personagens serão do mestre). Obviamente, esta sessão também deve obedecer a regra de todos os jogadores estarem disponível no mesmo dia da semana.
Na sessão, crie um método que retorne o personagem de maior nível da sessão(se não houver, mostre uma mensagem dizendo que o grupo é balanceado.) .
Nas sessões, crie um método que verifica se a sessão está balanceada(pelo menos um personagem de cada classe)
Ao modificar um personagem, não se pode alterar o nivel, exceto quando se altera a classe, pois assim seu nivel volta a ser 1.
Crie os repositórios para as três classes básicas com as funções de adicionar um objeto, remover, buscar e verificar se certo elemento existe. Implemente-os com uso de array. O array deve iniciar com capacidade 2 e cada vez que for necessário ultrapassar a capacidade na hora de inserir, deve dobrar de tamanho. Obs.: é obrigatório o uso de interface para definir os repositórios.
Faça classes de negócio que vão se comunicar com os repositórios. Nestas classes serão lançadas exceções. Você deve lançar exceção para os seguintes casos especiais: Adicionar um objeto que já existe. Remover um objeto que não existe. Buscar um objeto e não encontrá-lo. Atualizar um objeto (sem modificar os logins, caso modifique uma jogador. Ao modificar um jogador, e tornar uma sessão aberta com tal jogador impossivel de ser realizada, finalize a sessão que ficou impossibilitada de ser realizada.). Não deve ser permitido: - Inicializar uma sessão com jogadores de horário incompatível. - Valores inválidos para os atributos dos objetos (Nomes vazios, Doses negativas, etc...).
Faça uma classe de fachada pro seu sistema! A fachada se comunica com as classes de negócio, independe da interface com que o usuário vai interagir (console, GUI etc.). Mantenha a consistência dos dados considerando as relações entre as entidades: - Para inicializar uma sessão é preciso que todos os jogadores possam jogar no dia -Se tentar iniciar a sessão com jogadores que não podem participar no dia, lance uma exceção. - Para criar uma sessão, o Mestre deve estar no repositório(e estar disponível no dia da sessão) Deve conter métodos que utilizem os métodos já citados nas questões anteriores, como achar o MVP da Sessão, criar uma sessão balanceada, etc.
Por último e mais importante, faça uma classe de teste, para interagir com o usuário e se comunicar com a fachada, onde através do console seja possível realizar todas as seguintes operações: Criar e excluir objetos. Buscar nos repositórios usando o login(jogador),nome(personagem),sessao(login do mestre e nome da aventura), e visualizar os dados do objeto encontrado Modificar um objeto. Trate todas as exceções da fachada utilizando blocos try/catch de forma que o programa não encerre quando qualquer uma dessas exceções for lançada e que fique claro para os usuários qual erro ocorreu. Faça um menu numérico que facilite os testes (monitor feliz, correção feliz =D). Obs.: nesta questão é permitido o uso de Scanner
Será concedido o token de desafio à quem conseguir nota maior ou igual a 7,5 nessa lista.