# Simular um Jogo: Aplicar Padrões de Design ## Visão Geral do Trabalho Coloque o seu novo conhecimento sobre padrões de design em prática criando um protótipo simples de jogo! Este trabalho ajudará a praticar tanto padrões arquitetónicos (herança ou composição) como o sistema de comunicação pub/sub que aprendeu na lição. ## Instruções Crie uma representação simples de um jogo que demonstre os padrões de design desta lição. O seu jogo deve ser funcional mas não necessita de gráficos complexos – foque-se na arquitetura subjacente e nos padrões de comunicação. ### Requisitos **Escolha o seu Padrão de Arquitetura:** - **Opção A**: Use herança baseada em classes (como o exemplo `GameObject` → `Movable` → `Hero`) - **Opção B**: Use composição (como a abordagem da função fábrica com comportamentos mistos) **Implemente Comunicação:** - **Inclua** uma classe `EventEmitter` para mensagens pub/sub - **Configure** pelo menos 2-3 tipos de mensagens diferentes (como `PLAYER_MOVE`, `ENEMY_SPAWN`, `SCORE_UPDATE`) - **Ligue** a entrada do utilizador (teclado/ratão) aos eventos do jogo através do sistema de eventos **Elementos do Jogo a Incluir:** - Pelo menos uma personagem controlada pelo jogador - Pelo menos outro objeto de jogo (inimigo, colecionável ou elemento ambiental) - Interação básica entre objetos (colisão, recolha ou comunicação) ### Sugestões de Jogos **Jogos Simples a Considerar:** - **Jogo da Cobra** – Segmentos da cobra seguem a cabeça, comida aparece aleatoriamente - **Variação de Pong** – Raquete responde a entrada, bola rebate nas paredes - **Jogo de Colecionador** – Jogador move-se colecionando itens enquanto evita obstáculos - **Bases de Tower Defense** – Torres detectam e disparam contra inimigos em movimento ### Diretrizes para Estrutura do Código ```javascript // Estrutura inicial de exemplo const Messages = { // Defina as suas mensagens de jogo aqui }; class EventEmitter { // A sua implementação do sistema de eventos } // Escolha entre abordagem baseada em classe OU composição // Exemplo baseado em classe: class GameObject { /* base properties */ } class Player extends GameObject { /* player-specific behavior */ } // OU Exemplo de composição: const gameObject = { /* base properties */ }; const movable = { /* movement behavior */ }; function createPlayer() { /* combine behaviors */ } ``` ### Testar a Sua Implementação **Verifique que o seu código funciona através de:** - **Testar** se os objetos se movem ou mudam quando os eventos são disparados - **Confirmar** que múltiplos objetos podem responder ao mesmo evento - **Verificar** que pode adicionar novos comportamentos sem modificar o código existente - **Garantir** que a entrada de teclado/ratão dispara corretamente os eventos do jogo ## Diretrizes de Submissão **A sua submissão deve incluir:** 1. **Ficheiro(s) JavaScript** com a implementação do seu jogo 2. **Ficheiro HTML** para executar e testar o seu jogo (pode ser simples) 3. **Comentários** explicando qual padrão escolheu e porquê 4. **Documentação breve** dos seus tipos de mensagem e o que fazem ## Critérios de Avaliação | Critério | Exemplar (3 pontos) | Adequado (2 pontos) | Precisa Melhorar (1 ponto) | |----------|---------------------|---------------------|----------------------------| | **Padrão de Arquitetura** | Implementa corretamente herança OU composição com hierarquia clara de classes/objetos | Usa o padrão escolhido com pequenas falhas ou inconsistências | Tenta usar o padrão mas a implementação tem problemas significativos | | **Implementação Pub/Sub** | EventEmitter funciona corretamente com múltiplos tipos de mensagens e fluxo adequado de eventos | Sistema pub/sub básico funcionando com alguma gestão de eventos | Sistema de eventos presente mas não funciona de forma fiável | | **Funcionalidade do Jogo** | Três ou mais elementos interativos que comunicam via eventos | Dois elementos interativos com comunicação básica de eventos | Um elemento responde a eventos ou interação básica | | **Qualidade do Código** | Código limpo, bem comentado, com organização lógica e JavaScript moderno | Código geralmente organizado com comentários adequados | Código funciona mas carece de organização ou comentários claros | **Pontos Bónus:** - **Mecânicas de jogo criativas** que mostrem usos interessantes dos padrões - **Múltiplos métodos de entrada** (teclado E ratão) - **Arquitetura escalável** que seja fácil de expandir com novas funcionalidades --- **Aviso Legal**: Este documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, por favor tenha em conta que as traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informação crítica, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações erradas decorrentes do uso desta tradução.