Untitled
unknown
javascript
2 years ago
5.0 kB
5
Indexable
const endpoint = "https://api.masoudkf.com/v1/wordle"; const apiKey = "sw0Tr2othT1AyTQtNDUE06LqMckbTiKWaVYhuirv"; async function getDictionary() { const res = await fetch(endpoint, { headers: { "x-api-key": apiKey, }, }); const data = await res.json(); return data.words; } getDictionary().then(dictionary => { // for testing purposes, make sure to use the test dictionary console.log('dictionary:', dictionary); const state = { secret: dictionary[Math.floor(Math.random() * dictionary.length)], grid: Array(4) .fill() .map(() => Array(4).fill('')), currentRow: 0, currentCol: 0, }; // import { testDictionary, realDictionary } from './dictionary.js'; // // for testing purposes, make sure to use the test dictionary // console.log('test dictionary:', testDictionary); // const dictionary = realDictionary; // const state = { // secret: dictionary[Math.floor(Math.random() * dictionary.length)], // grid: Array(4) // .fill() // .map(() => Array(4).fill('')), // currentRow: 0, // currentCol: 0, // }; function drawGrid(container) { const grid = document.createElement('div'); grid.className = 'grid'; for (let i = 0; i < 4; i++) { for (let j = 0; j < 4; 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 registerKeyboardEvents() { document.body.onkeydown = (e) => { const key = e.key; if (key === 'Enter') { if (state.currentCol === 4) { const word = getCurrentWord(); if (isWordValid(word)) { revealWord(word); state.currentRow++; state.currentCol = 0; } else { alert('Not a valid word.'); } } } if (key === 'Backspace') { removeLetter(); } if (isLetter(key)) { addLetter(key); } updateGrid(); }; } 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 < 4; 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('Congratulations!'); } else if (isGameOver) { alert(`Better luck next time! The word was ${state.secret}.`); } }, 3 * animation_duration); } function isLetter(key) { return key.length === 1 && key.match(/[a-z]/i); } function addLetter(letter) { if (state.currentCol === 4) 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); registerKeyboardEvents(); } startup(); })
Editor is loading...