- 1. Preámbulo
- 2. Resumen del proyecto
- 3. Objetivos de aprendizaje
- 4. Consideraciones generales
- 5. Criterios de aceptación mínimos del proyecto
- 6. Hacker edition
- 7. Consideraciones técnicas
- 8. Pistas, tips y lecturas complementarias
- 9. Checklist
El juego Memory Match, también conocido como Concentration, Match Match, Match Up, Memory, entre otros, es un juego de cartas en el que todas las cartas se ponen cara abajo sobre una superficie y se le dan la vuelta a dos cartas en cada turno. El objetivo del juego es destapar parejas de cartas que coincidan.
Ejemplos:
En este proyecto construirás una versión web del juego Memory Match, en la que una jugadora pueda jugar sola, en el navegador.
El objetivo principal de este proyecto es que aprendas a diseñar y construir una interfaz web basada en data e interacción con la usuaria.
- Uso de HTML semántico.
- Uso de selectores de CSS.
- Construir tu aplicación respetando el diseño realizado (maquetación).
- Uso de flexbox en CSS.
- Uso de selectores del DOM.
- Manejo de eventos del DOM.
- Manipulación dinámica del DOM. (appendChild |createElement | createTextNode| innerHTML | textContent | etc.)
- Uso de condicionales (if-else | switch | operador ternario)
- Uso de bucles (for | for..in | for..of | while)
- Uso de funciones (parámetros | argumentos | valor de retorno)
- Manipular arrays (filter | map | sort | reduce)
- Manipular objects (key | value)
- Uso ES modules (
import
|export
) - Diferenciar entre expression y statements.
- Diferenciar entre tipos de datos atómicos y estructurados.
- Organizar y dividir el código en módulos (Modularización)
- Uso de identificadores descriptivos (Nomenclatura | Semántica)
- Uso de linter (ESLINT)
- Uso de comandos de git (add | commit | pull | status | push)
- Manejo de repositorios de GitHub (clone | fork | gh-pages)
- Colaboración en Github (branches | pull requests | |tags)
- Diseñar la aplicación pensando y entendiendo al usuario.
- Crear prototipos para obtener feedback e iterar.
- Aplicar los principios de diseño visual (contraste, alineación, jerarquía)
- Planear y ejecutar tests de usabilidad.
- Este proyecto se debe resolver en duplas.
- El proyecto será entregado subiendo tu código a GitHub (commit/push) y la interfaz será desplegada usando GitHub Pages.
Los criterios para considerar que has completado este proyecto son:
Documenta brevemente tu trabajo en el archivo README.md
de tu repositorio,
contándonos cómo fue tu proceso de diseño y cómo crees que el producto resuelve
el problema (o problemas) que tiene tu usuario.
Una vez que entiendas las necesidades de tus usuarios, escribe las Historias de Usuario que representen todo lo que el usuario necesita hacer/ver. Las Historias de Usuario deben ser el resultado de tu proceso de investigación o research de tus usuarios.
Asegúrate de incluir la definición de terminado (definition of done) y los Criterios de Aceptación para cada una.
En la medida de lo posible, termina una historia de usuario antes de pasar a la siguiente (Cumple con Definición de Terminado + Criterios de Aceptación).
Durante tu trabajo deberás haber hecho e iterado bocetos (sketches) de tu
solución usando papel y lápiz. Te recomendamos tomar fotos de todas las
iteraciones que hagas, que las subas a tu repositorio y las menciones en tu
README.md
.
Lo siguiente es diseñar tu Interfaz de Usuario (UI por sus siglas en inglés - User Interface). Para eso debes aprender a utilizar alguna herramienta de diseño visual. Nosotros te recomendamos Figma que es una herramienta que funciona en el navegador y, además, puedes crear una cuenta gratis. Sin embargo, eres libre de utilizar otros editores gráficos como Illustrator, Photoshop, PowerPoint, Keynote, etc.
El diseño debe representar el ideal de tu solución. Digamos que es lo que desearías implementar si tuvieras tiempo ilimitado para trabajar. Además, tu diseño debe seguir los fundamentos de visual design.
Durante el reto deberás hacer tests de usabilidad con distintos usuarios, y en base a los resultados, deberás iterar tus diseños. Cuéntanos qué problemas de usabilidad detectaste a través de los tests y cómo los mejoraste en tu propuesta final.
Luego de diseñar tu interfaz de usuario deberás trabajar en su implementación. No es necesario que construyas la interfaz exactamente como la diseñaste. Tu tiempo de hacking es escaso, así que deberás priorizar
Como mínimo, tu implementación debe:
- Dado un set de cartas, barajar las cartas y mostrarlas en la interfaz.
- Permitir al usuario destapar las cartas de 2 en 2.
- Dejar destapadas las cartas que coincidan al destaparlas.
- Indicar al usuario que ganó cuando haya destapado todas las cartas.
- Ser responsive, es decir, debe visualizarse sin problemas desde distintos tamaños de pantallas: móviles, tablets y desktops.
- Que la interfaz siga los fundamentos de visual design.
El boilerplate de este proyecto incluye pruebas unitarias (unit tests) de un componente como ejemplo. A medida que vayas agregando componentes tendrás que ir agregando pruebas para mantener buena cobertura.
Tus pruebas unitarias deben tener una cobertura del 70% de statements (sentencias), functions (funciones), lines (líneas), y branches (ramas) de tus componentes.
Las secciones llamadas Hacker Edition son opcionales. Si terminaste con todo lo anterior y te queda tiempo, intenta completarlas. Así podrás profundizar y/o ejercitar más sobre los objetivos de aprendizaje del proyecto.
Features/características extra sugeridas:
- En lugar de consumir la data estática brindada en este repositorio, puedes
consumir la data de forma dinámica, cargando un archivo JSON por medio de
fetch
. La carpetasrc/data
contiene una versión.js
y una.json
de de cada set datos. - Agregar nuevos sets de cartas.
- Calcular puntuación basado en número de turnos.
- Agregar timer y tener cuenta en puntuación.
- 100% Coverage
La lógica del proyecto debe estar implementada completamente en JavaScript, HTML y CSS. En este proyecto NO está permitido usar librerías o frameworks, solo vanilla JavaScript.
No se debe utilizar la pseudo-variable this
.
Para iniciar un nuevo juego, siempre tendremos que barajar las cartas antes de pintarlas en la pantalla. Para eso, te invitamos a que explores algoritmos existentes para este tipo de operación (llamada shuffle en inglés), como por ejemplo el algoritmo de Fisher-Yates (aka Knuth).
En este proyecto no se espera que inventes o implementes tu propio algoritmo
para barajar las cartas, si no que googlees, veas opciones existentes,
consideres opciones y adaptes una a tu proyecto (agregando una función shuffle
que se pueda usar en tu aplicación).
El boilerplate contiene una estructura de archivos como punto de partida así como toda la configuración de dependencias:
.
├── .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
Como en el proyecto anterior, existe un archivo index.html
. Como ya sabes,
acá va la página que se mostrará al usuario. También nos sirve para indicar
qué scripts se usarán y unir todo lo que hemos hecho.
Recomendamos usar src/main.js
como punto de entrada de tu aplicación. El
boilerplate incluye este archivo para conectar o montar el componente
App
en el DOM. De esta forma podremos hacer pruebas unitarias de nuestros
componentes sin necesidad de que estén conectados a un DOM global.
Esta no es la única forma de dividir tu código, puedes usar más archivos y carpetas, siempre y cuando la estructura sea clara para tus compañeras.
Este archivo contiene un componente de ejemplo que muestra cómo podemos
representar un componente como una función que retorna un HTMLElement
. A la
hora de construir interfaces es útil pensar en términos de componentes o
vistas que podemos ir anidando unas dentro de otras. Te invitamos a que
pienses qué componentes o cajitas necesitas para construir tu aplicación y
que vayas agregando componentes en el directorio components
para implementar
cada uno de ellos. Aunque, otra vez, la forma de organizar tu archivos depende
al final de tí y de tu equipo. Hay muchas formas de hacerlo, y el boilerplate
es solo una sugerencia 🙊.
Este archivo muestra cómo podemos crear archivos con especificaciones (expresadas como pruebas unitarias) de nuestros componentes.
En esta carpeta hay data con sets de cartas de ejemplo que puedes usar en tu
aplicación, así como información sobre cómo agregar tus propios sets.
Encontrarás una carpeta por cada set, y dentro de cada carpeta dos archivos: uno
con la extensión .js
y otro .json
. Ambos archivos contienen la misma data;
la diferencia es que el .js
lo usaremos a través de un import
, mientras que
el .json
está ahí para opcionalmente cargar la data de forma asíncrona con
fetch()
.
Antes de empezar a escribir código, debes definir qué deberá hacer el producto en base al conocimiento que puedas obtener de tu usuario. Estas preguntas te pueden ayudar:
- ¿Quiénes son los principales usuarios de producto?
- ¿Cuáles son los objetivos de estos usuarios en relación con el producto?
- ¿Cuáles son los componentes principales de la interfaz y por qué?
- ¿Cuándo utilizan o utilizarían el producto?
- Toda tu investigación previa debe tener como resultado todas las Historias de Usuario de tu proyecto.
- No hagas los prototipos de alta fidelidad de todas tus Historias. Comienza solamente por los que se necesiten para tu Sprint 1 (semana 1 de trabajo). Más pistas en la guía de organización para el proyecto.
Cuando ya estés lista para codear, te sugerimos empezar de esta manera:
- Una de las integrantes del equipo debe realizar un 🍴
fork del repo de tu cohort,
tus coaches te compartirán un link a un repo y te darán acceso de lectura
en ese repo. La otra integrante del equipo deber hacer un fork del
repositorio de su compañera y
configurar un
remote
hacia el mismo. - ⬇️ Clona tu fork a tu computadora (copia local).
- 📦 Instala las dependencias del proyecto con el comando
npm install
. Esto asume que has instalado Node.js (que incluye npm). - Si todo ha ido bien, deberías poder ejecutar las 🚥
pruebas unitarias (unit tests) con el comando
npm test
. - Para ver la interfaz de tu programa en el navegador, usa el comando
npm start
para arrancar el servidor web y dirígete ahttp://localhost:5000
en tu navegador. - A codear se ha dicho! 🚀
- Investigación con usuarios / entrevistas
- Principios de diseño visual
- Unidad de testing en curso de JavaScript en LMS.
- Unidad de arreglos en curso de JavaScript en LMS.
- Unidad de objetos en curso de JavaScript en LMS.
- Unidad de funciones en curso de JavaScript en LMS.
- Unidad de DOM en curso de Browser JavaScript en LMS.
- Array en MDN
- Array.sort en MDN
- Array.map en MDN
- Array.filter en MDN
- Array.reduce en MDN
- Array.forEach en MDN
- Object.keys en MDN
- Object.entries en MDN
- Fetch API en MDN
- json.org
- expressions-vs-statements
- expresión vs sentencia
- datos atómicos vs datos estructurados
- Modulos: Export
- Modulos: Import
- Historias de Usuario. Ojo que Cris no diferencia Definición de terminado de Criterios de Aceptación y nosotros sí lo haremos. Más detalles en la guía.
- Cómo dividir H.U.
- Guía para Memory Match
- Usa VanillaJS.
- No hace uso de
this
. - Pasa linter (
npm run pretest
) - Pasa tests (
npm test
) - Pruebas unitarias cubren un mínimo del 70% de statements, functions y lines y branches.
- Incluye Definición del producto clara e informativa en
README.md
. - Incluye historias de usuario en
README.md
. - Incluye sketch de la solución (prototipo de baja fidelidad) en
README.md
. - Incluye Diseño de la Interfaz de Usuario (prototipo de alta fidelidad)
en
README.md
. - Incluye el listado de problemas que detectaste a través de tests de
usabilidad en el
README.md
. - UI: Muestra cartas barajadas correctamente.
- UI: Permite al usuario destapar las cartas de 2 en 2.
- UI: Deja destapadas las cartas que coincidan al destaparlas.
- UI: Indica al usuario que ganó cuando sea relevante.
- UI: Es responsive.
- UI: La interfaz sigue los fundamentos de visual design.