Skip to content

Laboratoria/SAP012-memory-match

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Memory Match Game

Índice


1. Preâmbulo

O jogo Memory Match, também conhecido como Concentration, Match Match, Match Up, Memory, entre outros, é um jogo de cartas em que todas as cartas são postas viradas pra baixo sobre a superficie, virando duas cartas em cada turno. O objetivo do jogo é encontrar pares de cartas iguais.

Concentration (card game)

Exemplos:

2. Resumo do projeto

Neste projeto será construído uma versão web do jogo Memory Match, em que uma jogadora possa jogar sozinha no navegador.

O objetivo principal deste projeto é aprender a desenhar e construir uma interface web baseada em data e interação com a usuária.

3. Objetivos de aprendizagem

Reflita e depois enumere os objetivos que quer alcançar e aplique no seu projeto. Pense nisso para decidir sua estratégia de trabalho.

HTML

CSS

Web APIs

DOM (Document Object Model)

JavaScript

  • Uso de linter (ESLINT)

  • Uso de identificadores descritivos (Nomenclatura e Semântica)

  • Diferença entre expressões (expressions) e declarações (statements)

Tipos de dados

Testing em Javascript

Módulos

Controle de Versões (Git e GitHub)

Git

  • Git: Instalação e configuração

  • Git: Controle de versão com git (init, clone, add, commit, status, push, pull, remote)

  • Git: Integração de mudanças entre ramos (branch, checkout, fetch, merge, reset, rebase, tag)

GitHub

  • GitHub: Criação de contas e repositórios, configuração de chave SSH

  • GitHub: Implantação com GitHub Pages

    Links

  • GitHub: Colaboração pelo Github (branches | forks | pull requests | code review | tags)

Centrado no usuário

  • Desenhar e desenvolver um produto ou serviço colocando as usuárias no centro

Design de produto

  • Criar protótipos para obter feedback e iterar

  • Aplicar os princípios de desenho visual (contraste, alinhamento, hierarquia)

Pesquisa

  • Planejar e executar testes de usabilidade

4. Considerações gerais

  • Este projeto deverá ser feito em duplas.
  • O intervalo de tempo estimado para concluir o projeto é de 3 a 4 Sprints.
  • O projeto será entregue subindo seu código no GitHub (commit/push) e a interface será publicada usando GitHub Pages.

5. Critérios de aceitação mínimos do projeto

Os critérios para considerar que completou este projeto são:

Definição do produto

Documenta brevemente seu trabalho no arquivo README.md do seu repositório, contando como foi seu processo de desenho e como acredita que o produto resolve o problema (ou problemas) que seu usuário tem.

Histórias de usuário

Uma vez que entenda as necessidades de seus usuários, escreva as Histórias de Usuário que represente tudo que o usuário necessite fazer/ver. As Histórias de Usuário devem ser o resultado do seu processo de investigação ou research de seus usuários.

Certifique-se de incluir a definição de pronto (definition of done) e os Critérios de Aceitação para cada uma.

Na medida do possível, termine uma história de usuário antes de passar para a próxima (Cumpra com a Definição de pronto + Critérios de Aceitação).

Desenho da Interface de Usuário

Protótipo de baixa fidelidade

Durante seu trabalho deve fazer e iterar esboços (sketches) de sua solução usando papel e lápis. Te recomendamos tomar fotos de todas as iterações que fizer, coloque em seu repositório e as menciones em seu README.md.

Protótipo de alta fidelidade

O próximo passo é desenhar a sua Interface de Usuário (UI que vem do inglês - User Interface). Para isso aprenda a utilizar algm ferramenta de desenho visual. Nós te recomendamos o Figma, que é uma ferramenta que funciona no navegador com um conta gratuita. Porém, a escolha é livre e você pode utilizar outros editores gráficos como Illustrator, Photoshop, PowerPoint, Keynote, etc.

O desenho deve representar a sua solução ideal. Digamos que é o que desejaria implementar se tivesse tempo ilimitado para trabalhar. Além disso, seu desenho deve seguir os fundamentos de visual design.

Testes de usabilidade

Durante o desafio deverá fazer tests de usabilidade com distintos usuários, e com base nos resultados, deverá iterar seus desenhos. Conte quais problemas de usabilidade foram encontradas através dos tests e como elas foram melhoradas na sua proposta final.

Implantação de la Interface de Usuário (HTML/CSS/JS)

Assim que desenhar sua interface de usuário, deve trabalhar em sua implantação. Não é necessário que construa a interface exatamente como foi desenhado. O tempo de hacking é escasso, assim deverá priorizar

Como mínimo, sua implantação deve:

  1. Dado um set de cartas, embaralhar as cartas e mostrá-las na interface.
  2. Permitir al usuário virar as cartas de 2 em 2.
  3. Os pares encontrados devem permanecer viradas para cima.
  4. Indicar ao usuário que ganhou quando conseguir virar todas as cartas.
  5. Ser responsiva, ou seja, deve ser visualizada sem problemas a partir de diversos tamanhos de tela: celulares, tablets e desktops.
  6. Que a interface siga os fundamentos de visual design.

Testes unitários

O boilerplate deste projeto inclui testes unitários (unit tests) de um componente como exemplo. A medida que vai agregando componentes, terá que ir agregando os testes para manter uma boa cobertura.

Seus testes unitários devem ter uma cobertura de 70% de statements (sentencias), functions (funciones), lines (líneas), e branches (ramas) de seus componentes.

6. Hacker edition

As seções chamadas Hacker Edition são opcionais. Se já tiver terminado todos os requisitos anteriores e tiver tempo, pode tentar completá-las. Dessa forma, você pode aprofundar e/ou exercitar mais os objetivos de aprendizagem deste projeto.

Features/características extra sugeridas:

  • Ao invés de consumir os dados estáticos fornecidos neste repositório, pode consumir os dados de forma dinâmica, carregando um arquivo JSON por meio de fetch. A pasta src/data contém uma versão .js e uma .json de de cada conjunto de dados.
  • Adicionar novos conjuntos de cartas.
  • Calcular a pontuação baseado na quantidade de turnos.
  • Adicionar timer e ter conta em pontuação.
  • 100% Coverage

7. Considerações técnicas

A lógica do projeto deve ser implementada completamente em JavaScript, HTML e CSS. Neste projeto NÃO é permitido usar bibliotecas ou frameworks, apenas vanilla JavaScript.

Para iniciar um novo jogo, sempre teremos que embaralhar as cartas antes de printá-las na tela. Para isso, te convidamos a explorar algoritmos existentes para este tipo de operação (chamada shuffle em inglês), como por exemplo o algoritmo de Fisher-Yates (aka Knuth).

Neste projeto não se espera que invente ou implemente seu próprio algoritmo para embaralhar as cartas. Considere as opções existentes, escolha uma e a adapte para seu projeto (agregando uma função shuffle que possa ser usada em sua aplicação).

O boilerplate contém uma estrutura de arquivos como ponto de partida, assim como toda a configuração de dependências:

.
├── .babelrc
├── .editorconfig
├── .eslintrc
├── .gitignore
├── package.json
├── README.md
└── src
    ├── components
    │   ├── App.js
    │   └── App.spec.js
    ├── data
    │   ├── pokemon
    │   │   ├── pokemon.js
    │   │   └── pokemon.json
    │   ├── README.md
    │   └── webdev
    │       ├── webdev.js
    │       └── webdev.json
    ├── index.html
    ├── main.js
    └── style.css

src/index.html

Como no projeto anterior, existe um arquivo index.html. Como já sabe, aqui entra a página que vai ser exibida ao usuário. Também serve para indicar quais scripts serão utilizados e juntar tudo o que foi feito.

src/main.js

Recomendamos usar src/main.js como ponto de entrada da sua aplicação. O boilerplate inclui este arquivo para conectar ou montar o componente App no DOM. Desta forma poderemos fazer testes unitários de nossos componentes sen necessidade de que estejam conectados a um DOM global.

Esta não é a única forma de dividir seu código. Pode usar mais arquivos e pastas, contanto que a estrutura esteja clara para suas companheiras.

src/components/App.js

Este arquivo contém um componente de exemplo que mostra como podemos representar um componente como uma função que retorna um HTMLElement. Na hora de construir interfaces, é útil pensar nos termos de componentes ou vistas que podemos ir aninhando umas dentro das outras. Te convidamos a pensar quais componentes ou caixinhas são necessárias para construir sua aplicação e que vá adicionando componentes no directorio components para implementar cada um deles. Embora, novamente, no final, a forma de organizar seu arquivos depende de você e da sua equipe. Há muitas formas de faze-lo, e o boilerplate é apenas uma sugestão 🙊.

src/components/App.spec.js

Este arquivo mostra como podemos criar arquivos com especificações (expressadas como testes unitários) de nossos componentes.

src/data

Nesta pasta há dados com conjuntos de cartas como exemplo que pode usar na sua aplicação, assim como informação sobre como adicionar seus próprios conjuntos. Encontrará uma pasta por cada set, e dentro de cada pasta dois arquivos: um com la extensão .js e outro .json. Ambos arquivos contém o mesmos dados; a diferença é que o .js usaremos através de um import, enquanto que o .json está aqui para opcionalmente carregar os dados de forma assíncrona com fetch().

8. Pistas, tips e leituras complementares

Participe do canal do Slack #project-memory-match para conversar e pedir ajuda no projeto.

Primeiros passos

Antes de começar a escrever código, deve definir o que seu produto faz com base no conhecimento que conseguir obter de seu usuário. Estas perguntas podem te ajudar:

  • Quem são os principais usuários do produto?
  • Quais são os objetivos destes usuários em relação com o produto?
  • Quais são os principais componentes da interface e por que?
  • Quando utilizam ou utilizariam o produto?
  • Toda seu investigação prévia deve ter como resultado todas as Histórias de Usuário de seu projeto.
  • Não faça os protótipos de alta fidelidade de todas suas Histórias. Comece apenas pelos que necessitem para sua Sprint 1 (semana 1 de trabalho). Há mais dicas na guia de organização desse projeto.

Quando estiver pronta para codar, te sugerimos começar desta maneira:

  1. Uma das integrantes da equipe deve realizar um fork do repositório de sua turma (a equipe de formação fornecerá o link). A outra integrante da dupla deve fazer um fork a partir do repositório de sua companheira e configurar um remote a partir dele.
  2. Clona seu fork a seu computadora (copia local).
  3. Instale as dependências do projeto com o comando npm install, assumindo que já tenha instalado o Node.js (que inclui npm).
  4. Se tudo correr bem, deve ser capaz de executar os 🚥 testes unitários (unit tests) com o comando npm test.
  5. Para ver a interface de seu programa no navegador, utilize o comando npm start para subir o servidor web no endereço http://localhost:5000.
  6. Comece a codar! 🚀

Conteúdo de referência

UX Design (Experiência do usuário)

  • Investigação com usuários / entrevistas
  • Princípios de design/UI

Desenvolvimento Front-End

Ferramentas

Organização do Trabalho

9. Checklist

  • Usar VanillaJS.
  • Passa pelo linter (npm run pretest)
  • Passa pelos testes (npm test)
  • Testes unitários cobrem um mínimo de 70% de statements, functions, lines e branches.
  • Inclui uma definição de produto clara e informativa no README.md.
  • Inclui histórias de usuário no README.md.
  • Inclui rascunho da solução (protótipo de baixa fidelidade) no README.md.
  • Inclui Desenho da Interface de Usuário (protótipo de alta fidelidade) no README.md.
  • Inclui uma lista de problemas detectados nos testes de usabilidade no README.md.
  • UI: Mostra cartas embaralhadas corretamente.
  • UI: Permite o usuário virar as cartas de 2 em 2.
  • UI: Deixa os pares que foram formados virados.
  • UI: Informar o usuário que ganhou quando for relevante.
  • UI: É responsivo.
  • UI: A interface segue os fundamentos de visual design.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published