• Nenhum resultado encontrado

4 Desenho da Solução

4.3 Estrutura da solução

Com base no modelo arquitetural anterior, foi necessário construir uma estrutura responsável por cumprir os requisitos do problema e, consequentemente, erguer uma solução completa e organizada. O objetivo deste capítulo passa por divulgar a organização técnica do projeto, assim como abordar os processos mais importantes do mesmo.

4.3.1 Estrutura técnica da solução

Com vista ao desenvolvimento de cada componente, criaram-se classes específicas, conectadas entre si, cujo objetivo é dar resposta às necessidades da solução que se pretende obter. A Figura 10 representa um diagrama de classes parcial da solução, no qual é possível visualizar as principais classes criadas e a forma como estas se relacionam entre si. A parcialidade do diagrama deve-se ao elevado número de classes existentes, pelo que tal tamanho poderia prejudicar a ilegibilidade dos fatores mais importantes do diagrama.

44

Figura 10 – Diagrama de classes

Embora todas as classes apresentem um papel fundamental no processamento global da solução, as classes BarraDeEstados, DynamicDifficultyAdjustment e Mensagem são consideradas as classes base do projeto.

BarraDeEstados é a classe que contém o dinheiro e a energia do utilizador ao longo de toda a

execução do jogo. A barra de estados é atualizada pelos minijogos, após conclusão dos mesmos, e é responsável por manter estas informações atualizadas e visíveis para o jogador.

O DDA é um componente que apresenta apenas uma conexão, com a interface IGame, o que faz com que tenha um baixo acoplamento. Trata-se também de um componente que tem, como funções, determinar qual o próximo jogo a executar e qual a próxima dificuldade a implementar,

Jorge Miguel Rodrigues Neto

João Nuno Oliveira Costa 45

o que faz com que apresente uma alta coesão. O DDA é, então, o componente responsável por controlar toda a sequência de execução do jogo, baseando-se apenas na informação passada pelas instâncias das classes que implementam a interface IGame.

O diagrama de classes apenas apresenta dois exemplos das classes relativas aos minijogos implementados, ilustrando a implementação mais simples (minijogo do guarda-fatos) e a mais complexa (minijogo de cozinhar). Quando o DDA determina que o primeiro mencionado é o próximo a executar, é criada uma instância da classe MiniJogoGuardaFatos que, consequentemente, questiona o DDA acerca da dificuldade a implementar. Durante a execução do minijogo, são enviados, para a instância criada (ClassGuardaFatos), os resultados da tarefa, e registados, para que o DDA consiga calcular as próximas dificuldades com base nestes últimos. Quanto ao exemplo mais complexo representado, ou seja, o minijogo de cozinhar, este é composto por um conjunto de estados, delineados de seguida no diagrama de sequência da Figura 11 (para simplificar, é apenas abordado o processo de cortar cebola e a sua colocação na panela).

Figura 11 – Diagrama de sequência: Exemplo do processo de cozinhar

Inicialmente, é criada uma instância da classe Cozinhar. Esta conecta-se à classe Receita, de modo a descobrir qual a receita que deve ser realizada e os passos necessários para a construir. Durante o processo, o método getProximoPasso(), da classe Cozinhar, é invocado para determinar o próximo passo da receita. Conhecidos os passos da receita, a classe Cozinhar envia algumas ordens, como, por exemplo, cortar cebola, criando-se, consequentemente, uma instância do MinijogoCortar com uma instância da classe CortarCebola. Esta última classe é derivada da interface ICortar, permitindo, desta forma, cortar vários objetos diferentes, tornando-se indiferente, para a classe MinijogoCortar, qual o objeto que deve ser cortado, visto que esta classe só reconhece a interface mencionada.

46

Estes processos podem repetir-se, ao serem executados os mais diversos passos culinários (e.g. descascar cebolas, cortar cenouras ou frango, colocar azeite na panela, mexer a panela, entre outros).

Por último, e apesar de ser um requisito não funcional (ver secção 5.9.4), é necessário salientar a classe Mensagem, responsável por disponibilizar, ao jogador, mensagens de texto. Esta funcionalidade permite agilizar todo o processo de desenvolvimento do jogo, visto que simplifica a interação com o utilizador. O processamento base consiste em aceder ao minijogo atual, através da interface IGame, que contém todos os estados pelos quais o minijogo terá de passar, antes de ser concluído, utilizando o método getEstadoAtual(). Este processo faz com que todos os outputs do jogo sejam automaticamente ajustados, com base na quantidade de texto e sem a preocupação de como este se irá apresentar no ecrã, o que faz com que todo o processo de construção dos minijogos seja mais agilizado.

4.3.2 Processamento global de jogo

O modelo arquitetural destaca as principais tarefas de cada componente. Torna-se, então, essencial demonstrar a forma de como estes interagem entre si. Com base nas interações das classes apresentadas anteriormente, é especificada, na Figura 12, a sequência de eventos durante o processamento de um minijogo, ilustrando as várias funções invocadas durante a realização do mesmo e como este se processa ao longo do tempo.

Figura 12 – Diagrama de sequência: Processar Minijogo

O jogador recebe uma notificação, adequada ao contexto, que o alerta para a próxima tarefa que terá de realizar. Após o acesso ao minijogo, através do cenário onde o sujeito se encontra,

Jorge Miguel Rodrigues Neto

João Nuno Oliveira Costa 47

o jogador terá de terminar a tarefa, consoante as regras apresentadas e específicas do minijogo em questão.

O processo, para qualquer minijogo, é semelhante. Quando o jogador conclui uma determinada etapa do minijogo corrente, o cálculo de uma nova dificuldade é efetuado. O DDA é responsável pela gestão desta dificuldade, isto é, este componente tem como por objetivo calcular a próxima dificuldade, com base nos últimos resultados registados, e implementá-la no minijogo em questão. Este último é processado consoante a dificuldade implementada e, após a concretização do mesmo, a classe respetiva do minijogo, que instancia a interface, calcula a pontuação final, a atribuir ao jogador.

Por último, a barra de estados é atualizada, com base nos recursos ganhos ou perdidos na última tarefa realizada.