---
# System prepended metadata

title: Juego de Mecanografía en JavaScript

---

###### 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;
}
```

