###### Versión online: https://hackmd.io/@YdTv1mcjT2ecp6FwvPugAA/HJFiPumUa
# Juego de Mecanografía en JavaScript
## Variables y Elementos del DOM:
```javascript
var temp = document.querySelector('.time');
var button = document.querySelector("button");
var words = document.querySelector(".words");
var timerDiv = document.querySelector(".time");
var scoreDiv = document.querySelector(".score");
var points = 0;
var spans;
var typed;
var seconds = 60;
var spark = new Audio("http://k003.kiwi6.com/hotlink/qdpr7bioht/spark.mp3");
```
* temp: Referencia al elemento con la clase 'time'.
* button: Referencia al botón del juego.
* words: Referencia al elemento con la clase 'words'.
* timerDiv: Referencia al elemento con la clase 'time'.
* scoreDiv: Referencia al elemento con la clase 'score'.
* points: Puntuación del juego.
* spans: Almacena las letras del juego.
* typed: Almacena la letra introducida por el usuario.
* seconds: Contador de tiempo para el juego.
* spark: Objeto de audio para reproducir un sonido.
### Funcion 'countdown'
```javascript=
function countdown() {
points = 0;
var timer = setInterval(function(){
button.disabled = true;
seconds--;
temp.innerHTML = seconds;
if (seconds === 0) {
alert("Has conseguido: " + scoreDiv.innerHTML);
scoreDiv.innerHTML = "0";
words.innerHTML = "";
button.disabled = false;
clearInterval(timer);
seconds = 60;
timerDiv.innerHTML = "60";
button.disabled = false;
}
}, 1000);
}
```
Esta función inicia una cuenta regresiva de 60 segundos y realiza acciones específicas cuando el tiempo se agota.
### Función 'random'
```javascript=
function random() {
words.innerHTML = "";
var random = Math.floor(Math.random() * (1943 - 0 + 1)) + 0;
var wordArray = list[random].split("");
for (var i = 0; i < wordArray.length; i++) { // Construyendo palabras con spans alrededor de las letras
var span = document.createElement("span");
span.classList.add("span");
span.innerHTML = wordArray[i];
words.appendChild(span);
}
spans = document.querySelectorAll(".span");
}
```
Genera y muestra palabras aleatorias del array list.
### Array 'list'
```javas=
const list = ['ACCOUNT','ACCURATE','ACRES','ACROSS','ACT','ACTION','ACTIVE','ACTIVITY',
'ACTUAL','ACTUALLY','ADD','ADDITION','ADDITIONAL','ADJECTIVE','ADULT','ADVENTURE',
'ADVICE','AFFECT','AFRAID','AFTER','AFTERNOON','AGAIN','AGAINST','AGE',
'AGO','AGREE','AHEAD','AID','AIR','AIRPLANE','ALIKE','ALIVE',
'ALL','ALLOW','ALMOST','ALONE','ALONG','ALOUD','ALPHABET','ALREADY',
'ALSO','ALTHOUGH','AM','AMONG','AMOUNT','ANCIENT','ANGLE','ANGRY',
'ANIMAL','ANNOUNCED','ANOTHER','ANSWER','ANTS','ANY','ANYBODY','ANYONE',
'ANYTHING','ANYWAY','ANYWHERE','APART','APARTMENT','APPEARANCE','APPLE','APPLIED',
'APPROPRIATE','ARE','AREA','ARM','ARMY','AROUND','ARRANGE','ARRANGEMENT',
'ARRIVE','ARROW','ART','ARTICLE','AS','ASIDE','ASK','ASLEEP',
'AT','ATE','ATMOSPHERE','ATOM','ATOMIC','ATTACHED','ATTACK','ATTEMPT',
'ATTENTION','AUDIENCE','AUTHOR','AUTOMOBILE','AVAILABLE','AVERAGE','AVOID','AWARE',
'AWAY','BABY','BACK','BAD','BADLY','BAG','BALANCE','BALL', (...)];
```
Contiene una extensa lista de palabras que se utilizan en el juego. (1942 palabras)
### Evento del botón 'button'
```javascript=
button.addEventListener("click", function(e){
countdown();
random();
button.disabled = true;
});
```
Inicia el juego al hacer clic en el botón, llamando a las funciones countdown y random.
### Función 'typing'
```ja=
function typing(e) {
document.getElementById("thockAudio").play();
typed = String.fromCharCode(e.which);
for (var i = 0; i < spans.length; i++) {
if (spans[i].innerHTML === typed) {
if (spans[i].classList.contains("bg")) {
continue;
} else if (spans[i].classList.contains("bg") === false && (spans[i-1] === undefined || spans[i-1].classList.contains("bg") !== false)) {
spans[i].classList.add("bg");
break;
}
}
}
var checker = 0;
for (var j = 0; j < spans.length; j++) { // Chequea si todas las letras han sido escritas
if (spans[j].className === "span bg") {
checker++;
}
if (checker === spans.length) { //Si es así, anima las palabras con animate.css
spark.pause();
spark.currentTime = 0;
spark.play();
words.classList.add("animated");
words.classList.add("fadeOut");
points++; // Incrementamos los pointos
scoreDiv.innerHTML = points; //Añadimos los puntos al div
document.removeEventListener("keydown", typing, false);
setTimeout(function(){
words.className = "words"; // Reiniciamos las clases
random(); // Da otra palabra aleatoria
document.addEventListener("keydown", typing, false);
}, 400);
}
}
}
```
Gestiona la entrada del usuario, verifica las letras introducidas y actualiza la interfaz del juego.
## Guía de contenidos de la hoja de estilos
### Reset de Estilos globales:
```css!
* {
margin: 0;
padding: 0;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
```
### Estilos del cuerpo ('body')
```css!
body {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
}
```
### Estilos del contenedor principal('container')
```css!
.container {
max-width: 600px; /* Ancho máximo del contenedor */
}
```
### Estilos del contenedor del vídeo ('#video-container')
```css!
#video-container {
margin-bottom: 20px;
}
```
### Estilos del vídeo ('#video')
```css!
#video {
width: 100%;
height: 100%;
}
```
### Estilos del contenedor del botón ('#button-container')
```css!
#button-container {
margin-top: 20px;
}
```
### Estilos del contenedor principal('wrapper')
```css!
.wrapper {
max-width: 600px;
margin: 0 auto;
width: 100%;
text-align: center;
padding: 2%;
height: 500px;
}
```
### Estilos del párrafo después del título principal ('h1+p')
```css!
h1 + p {
margin-bottom: 5%;
color: #3498db;
}
```
### Estilos de envoltura exterior ('outerWrap')
```css!
h1 + p {
margin-bottom: 5%;
color: #3498db;
}
```
### Estilos del botón
```css!
button {
border: none;
background-color: #FF7373;
box-shadow: 0px 5px 0px 0px #CE4646;
outline: none;
border-radius: 5px;
padding: 10px 15px;
font-size: 22px;
text-decoration: none;
margin: 20px;
color: #fff;
position: relative;
display: inline-block;
cursor: pointer;
}
```
### Estilos del botón en estado activo ('button:active')
```css!
button:active {
transform: translate(0px, 5px);
-webkit-transform: translate(0px, 5px);
box-shadow: 0px 1px 0px 0px;
}
```
### Estilos de puntuación y tiempo('scoreWrap','timeWrap')
```css!
.scoreWrap p, .scoreWrap span, .timeWrap p, .timeWrap span {
font-size: 30px;
color: #FF7373;
}
```
### Estilos del contenedor palabras ('wordsWrap')
```css!
.wordsWrap {
margin-top: 50px;
}
```
### Estilos de palabras('words span')
```css!
.words span {
font-size: 60px;
letter-spacing: 1px;
color: #ECF0F1;
}
```
### Estilos del pop-up
```css!
#popup {
display: none;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 20px;
background-color: black;
border: 1px solid #FF7373;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
z-index: 1000;
}
```
### Estilos del overlay('#overlay')
```css!
#overlay {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
z-index: 999;
}
```