Minigame de digitação.
- Ao iniciar o jogo, uma sequência aleatória de teclas (por exemplo, letras de A a Z) deve ser gerada e exibida ao jogador.
- O jogador deve pressionar as teclas na ordem correta dentro de um tempo limite.
- Se o jogador pressionar a tecla correta, a próxima tecla da sequência deve ser destacada.
- Se o jogador pressionar a tecla errada ou o tempo acabar, o jogo deve terminar e o jogador deve ser notificado.
- A tela principal deve exibir a sequência atual de teclas que o jogador precisa pressionar.
- Um indicador de tempo deve mostrar quanto tempo resta para completar a sequência.
- Feedback visual para indicar se a tecla pressionada foi correta ou não.
- Níveis de dificuldade
- Contagem regressiva antes de iniciar
- Pontuação
- Música e efeitos sonoros em boa parte da gameplay
- Botões para ativar e desativar música e os efeitos sonoros
- Animação simples ao acessar o minigame
- Escolha do servidor de desenvolvimento: Optei pelo Vite.js ao invés do Next.js, pois é um minigame simples que não precisa de funcionalidades muito complexas que utilizem contextos, provedores, técnicas avançadas de SEO, rotas dinâmicas, serveless, entre outras.
- Tecnologia: Utilizei Typescript para facilitar a leitura do código e o reconhecimento dos tipos das propriedades sem a necessidade de rodar o projeto. Outra alternativa seria a utilização da biblioteca Proptypes, no entanto, seria fácil esquecer de atualizar os tipos (já que não retorna um erro caso falte uma propriedade) e aquele código não seria mais confiável.
- Framework: Optei pelo React.js, pois o desafio pedia a tecnologia e até mesmo pela reutilização de componentes, no entanto, poderia ser adaptado para utilizar HTML, CSS e Javascript sem grandes problemas por ser um projeto simples.
- Nomenclatura de arquivos: Após criar uma pasta de componente ou view, adotei deixar o nome do arquivo principal como
index
, pois qualquer dev que bata o olho reconhece o significado, porém o arquivo de estilo terá o mesmo nome que a pasta principal, pois dessa forma é possível realizar a busca na IDE e facilmente encontrar a pasta que você quer. Para o hook, após ouse
também adiciono o nome da pasta, algo mais genérico, para que seja possível englobar qualquer lógica referente aquele contexto. Cê o arquivo ficar muito grande e com muitas responsabilidades, é só criar uma pastahelpers
na pasta principal e adicionar as lógicas necessárias. - Enum: Enums são valiosos quando um dado pode ter muitos valores diferentes e é necessário reutilizar esses valores em outros lugares do projeto.
- Versões do node e npm: No
package.json
é possível identificar quaisversões do Node e do npm
são aceitas pra rodar o projeto. Dessa forma, evitamos problemas na instalação de dependências e a informação não é centralizado somente em uma pessoa. - Pastas: Depois de diversas experiências com estrutura de pastas em projetos pequenos, médios e grandes achei algo que me agrade e que faz sentido.
- /components: Componentes no geral, independente se for pequeno ou grande.
- /helpers: Funções reutilizáveis com lógicas isoladas.
- /styles: Armazena estilos globais ou reutilizáveis.
- /view: Utilizada para criar o componente pai das páginas. Normalmente é formada por diversos componentes e tem um hook customizado.
- /page: Para ficar claro quais são as páginas existentes e dentro de cada um apenas chamamos o componente pai (vulgo pasta view).
- /tests: Pasta principal com subpastas para testes unitários e e2e.