-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
99 additions
and
165 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,168 +1,102 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8"> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
<link rel="stylesheet" href="styles.css"> | ||
<title>Juego de palabras</title> | ||
</head> | ||
<body> | ||
<div id="game"></div> | ||
<input type="text" id="input" placeholder="Escribe aquí"> | ||
<script> | ||
import { useDictionary, realDictionary } from './dictionary.js'; | ||
|
||
// for testing purposes, make sure to use the test dictionary | ||
console.log('test dictionary:', useDictionary); | ||
|
||
const dictionary = realDictionary; | ||
const state = { | ||
secret: useDictionary[Math.floor(Math.random() * useDictionary.length)], | ||
grid: Array(6) | ||
.fill() | ||
.map(() => Array(5).fill('')), | ||
currentRow: 0, | ||
currentCol: 0, | ||
}; | ||
|
||
function drawGrid(container) { | ||
const grid = document.createElement('div'); | ||
grid.className = 'grid'; | ||
|
||
for (let i = 0; i < 6; i++) { | ||
for (let j = 0; j < 5; j++) { | ||
drawBox(grid, i, j); | ||
} | ||
} | ||
|
||
container.appendChild(grid); | ||
} | ||
|
||
function updateGrid() { | ||
for (let i = 0; i < state.grid.length; i++) { | ||
for (let j = 0; j < state.grid[i].length; j++) { | ||
const box = document.getElementById(`box${i}${j}`); | ||
box.textContent = state.grid[i][j]; | ||
} | ||
} | ||
} | ||
|
||
function drawBox(container, row, col, letter = '') { | ||
const box = document.createElement('div'); | ||
box.className = 'box'; | ||
box.textContent = letter; | ||
box.id = `box${row}${col}`; | ||
|
||
container.appendChild(box); | ||
return box; | ||
} | ||
|
||
function getCurrentWord() { | ||
return state.grid[state.currentRow].reduce((prev, curr) => prev + curr); | ||
} | ||
|
||
function isWordValid(word) { | ||
return dictionary.includes(word); | ||
} | ||
|
||
function getNumOfOccurrencesInWord(word, letter) { | ||
let result = 0; | ||
for (let i = 0; i < word.length; i++) { | ||
if (word[i] === letter) { | ||
result++; | ||
} | ||
} | ||
return result; | ||
} | ||
|
||
function getPositionOfOccurrence(word, letter, position) { | ||
let result = 0; | ||
for (let i = 0; i <= position; i++) { | ||
if (word[i] === letter) { | ||
result++; | ||
} | ||
} | ||
return result; | ||
} | ||
|
||
function revealWord(guess) { | ||
const row = state.currentRow; | ||
const animation_duration = 500; // ms | ||
|
||
for (let i = 0; i < 5; i++) { | ||
const box = document.getElementById(`box${row}${i}`); | ||
const letter = box.textContent; | ||
const numOfOccurrencesSecret = getNumOfOccurrencesInWord( | ||
state.secret, | ||
letter | ||
); | ||
const numOfOccurrencesGuess = getNumOfOccurrencesInWord(guess, letter); | ||
const letterPosition = getPositionOfOccurrence(guess, letter, i); | ||
|
||
setTimeout(() => { | ||
if ( | ||
numOfOccurrencesGuess > numOfOccurrencesSecret && | ||
letterPosition > numOfOccurrencesSecret | ||
) { | ||
box.classList.add('empty'); | ||
} else { | ||
if (letter === state.secret[i]) { | ||
box.classList.add('right'); | ||
} else if (state.secret.includes(letter)) { | ||
box.classList.add('wrong'); | ||
} else { | ||
box.classList.add('empty'); | ||
} | ||
} | ||
}, ((i + 1) * animation_duration) / 2); | ||
|
||
box.classList.add('animated'); | ||
box.style.animationDelay = `${(i * animation_duration) / 2}ms`; | ||
} | ||
|
||
const isWinner = state.secret === guess; | ||
const isGameOver = state.currentRow === 5; | ||
|
||
setTimeout(() => { | ||
if (isWinner) { | ||
alert('¡Felicidades!'); | ||
} else if (isGameOver) { | ||
alert(`¡Mejor suerte la próxima! La palabra era: ${state.secret}.`); | ||
} | ||
}, 3 * animation_duration); | ||
} | ||
|
||
function addLetter(letter) { | ||
if (state.currentCol === 5) return; | ||
state.grid[state.currentRow][state.currentCol] = letter; | ||
state.currentCol++; | ||
} | ||
|
||
function removeLetter() { | ||
if (state.currentCol === 0) return; | ||
state.grid[state.currentRow][state.currentCol - 1] = ''; | ||
state.currentCol--; | ||
} | ||
|
||
function startup() { | ||
const game = document.getElementById('game'); | ||
drawGrid(game); | ||
|
||
const input = document.getElementById('input'); | ||
input.addEventListener('input', () => { | ||
const inputValue = input.value; | ||
if (inputValue.length === 1 && isLetter(inputValue)) { | ||
addLetter(inputValue.toLowerCase()); | ||
input.value = ''; | ||
updateGrid(); | ||
} else if (inputValue.length === 0) { | ||
removeLetter(); | ||
updateGrid(); | ||
} | ||
}); | ||
} | ||
|
||
startup(); | ||
</script> | ||
</body> | ||
<head> | ||
<meta charset="UTF-8" /> | ||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
<meta name="theme-color" content="#121213" /> | ||
|
||
<!-- HTML Meta Tags --> | ||
<title>Estudle</title> | ||
<meta name="description" content=">Wordle clone by DoubleDebug" /> | ||
|
||
<!-- Facebook Meta Tags --> | ||
<meta | ||
property="og:url" | ||
content="https://doubledebug.github.io/wordle-speedrun/" | ||
/> | ||
<meta property="og:type" content="website" /> | ||
<meta property="og:title" content="Wordle clone by DoubleDebug" /> | ||
<meta | ||
property="og:description" | ||
content="Wordle game speedrun in HTML, CSS and JavaScript" | ||
/> | ||
<meta | ||
property="og:image" | ||
content="https://doubledebug.github.io/wordle-speedrun/assets/og-image.png" | ||
/> | ||
|
||
<!-- Twitter Meta Tags --> | ||
<meta name="twitter:card" content="summary_large_image" /> | ||
<meta property="twitter:domain" content="doubledebug.github.io" /> | ||
<meta | ||
property="twitter:url" | ||
content="https://doubledebug.github.io/wordle-speedrun/" | ||
/> | ||
<meta name="twitter:title" content="Wordle clone | DoubleDebug" /> | ||
<meta | ||
name="twitter:description" | ||
content="Wordle game speedrun in HTML, CSS and JavaScript" | ||
/> | ||
<meta | ||
name="twitter:image" | ||
content="https://doubledebug.github.io/wordle-speedrun/assets/og-image.png" | ||
/> | ||
|
||
<link rel="stylesheet" href="./src/style.css" /> | ||
<link | ||
rel="icon" | ||
type="image/png" | ||
href="/wordle-speedrun/assets/imgs/icon.png" | ||
/> | ||
</head> | ||
<body> | ||
<h1 class="title">Estudle🤓</h1> | ||
<div id="game"></div> | ||
<hr /> | ||
<p class="footer"> | ||
¡FELIZ DÍA DEL ESTUDIANTE! | ||
<span class="v-separator">|</span> | ||
<span> | ||
<a | ||
class="social-media-link" | ||
href="https://github.com/informaticaort" | ||
title="Github" | ||
> | ||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"> | ||
<path | ||
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z" | ||
/> | ||
</svg> | ||
</a> | ||
</span> | ||
<span> | ||
<a | ||
class="social-media-link" | ||
href="https://www.youtube.com/@informaticaalmagro" | ||
title="YouTube" | ||
> | ||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"> | ||
<path | ||
d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z" | ||
/> | ||
</svg> | ||
</a> | ||
</span> | ||
<span> | ||
<a | ||
class="social-media-link" | ||
href="https://twitter.com/informaticaort" | ||
title="Twitter" | ||
> | ||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> | ||
<path | ||
d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z" | ||
/> | ||
</svg> | ||
</a> | ||
</span> | ||
</p> | ||
<script defer src="./src/index.js" type="module"></script> | ||
</body> | ||
</html> |