164 lines
4.7 KiB
JavaScript
164 lines
4.7 KiB
JavaScript
// global constants
|
|
const gridWidth = 5
|
|
const gridHeight = 6
|
|
const word = wordlist[Math.floor(Math.random()*wordlist.length)];
|
|
|
|
// global state variables
|
|
var gameCompleted = null
|
|
|
|
// HTML items
|
|
const gameContainer = document.getElementById("game_container")
|
|
const gridItems = []
|
|
|
|
// helper functions
|
|
const gridItemId = (row, column) => "grid_item_" + row + "_" + column
|
|
const getGridRow = (row) => gridItems[row]
|
|
const getGridItem = (row, column) => gridItems[row].items[column]
|
|
const isLetter = string => /^[a-zA-Z]$/.test(string)
|
|
|
|
|
|
function setGridLetter(row, column, letter) {
|
|
console.log([row, column])
|
|
console.log(letter)
|
|
|
|
getGridItem(row, column).letter = letter
|
|
getGridItem(row, column).HTMLItem.getElementsByClassName("grid_item_p")[0].innerHTML = letter !== null ? letter : ""
|
|
}
|
|
|
|
|
|
function checkGridRow() {
|
|
var [row, _ ] = findCurrentLetterPosition()
|
|
var rowWord = ''
|
|
getGridRow(row).items.forEach(item => rowWord += item.letter)
|
|
|
|
console.log(rowWord)
|
|
if (!wordlist.includes(rowWord)) {
|
|
body.classList.add("incorrect")
|
|
setTimeout( () => body.classList.remove("incorrect"), 500)
|
|
return
|
|
}
|
|
|
|
var correct_letters = 0
|
|
var dedupword = word
|
|
|
|
for (var column = 0; column < gridWidth; column++) {
|
|
gridItem = getGridItem(row, column)
|
|
// letters are removed from dedupword as letters are matched
|
|
if (gridItem.letter === null) return
|
|
|
|
if (gridItem.letter === word[column]) {
|
|
gridItem.HTMLItem.classList.add('grid_correct')
|
|
correct_letters += 1
|
|
} else if (dedupword.includes(gridItem.letter)) {
|
|
gridItem.HTMLItem.classList.add('grid_present')
|
|
} else {
|
|
gridItem.HTMLItem.classList.add('grid_wrong')
|
|
}
|
|
|
|
dedupword = dedupword.replace(gridItem.letter, '')
|
|
console.log(gridItem.letter)
|
|
console.log(dedupword)
|
|
|
|
if (correct_letters == gridWidth) gameCompleted = true
|
|
}
|
|
|
|
getGridRow(row).complete = true
|
|
if (row === gridHeight-1) gameCompleted = true
|
|
}
|
|
|
|
|
|
function init(){
|
|
// clear game div
|
|
gameContainer.innerHTML = ""
|
|
// build letter grid and populate gridItems
|
|
const letterGrid = document.createElement("div")
|
|
letterGrid.setAttribute("id", "letter_grid")
|
|
|
|
for (var row = 0; row < gridHeight; row++) {
|
|
var gridRow = document.createElement('div')
|
|
gridRow.classList.add('grid_row')
|
|
gridItems.push({
|
|
items: [],
|
|
complete: false,
|
|
})
|
|
for (var column = 0; column < gridWidth; column++) {
|
|
var gridItem = document.createElement('div')
|
|
gridItem.classList.add('grid_item')
|
|
gridItem.setAttribute('id', gridItemId(row, column))
|
|
|
|
var gridItemP = document.createElement('p')
|
|
gridItemP.classList.add('grid_item_p')
|
|
gridItem.appendChild(gridItemP)
|
|
gridRow.appendChild(gridItem)
|
|
|
|
gridItems[row].items.push({
|
|
HTMLItem: gridItem,
|
|
letter: null,
|
|
correct: null
|
|
})
|
|
}
|
|
letterGrid.appendChild(gridRow)
|
|
}
|
|
|
|
gameContainer.appendChild(letterGrid)
|
|
gameCompleted = false
|
|
}
|
|
|
|
|
|
function findNextLetterPosition() {
|
|
for (var row = 0; row < gridHeight; row++) {
|
|
for (var column = 0; column < gridWidth; column++) {
|
|
if (getGridItem(row, column).letter === null) return [row, column]
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function findCurrentLetterPosition() {
|
|
var lastRow = 0
|
|
var lastColumn = 0
|
|
|
|
for (var row = 0; row < gridHeight; row++) {
|
|
for (var column = 0; column < gridWidth; column++) {
|
|
if (getGridItem(row, column).letter === null) return [lastRow, lastColumn]
|
|
lastRow = row
|
|
lastColumn = column
|
|
}
|
|
}
|
|
return [lastRow, lastColumn]
|
|
}
|
|
|
|
|
|
function setNextLetter(key) {
|
|
if (gameCompleted) return
|
|
|
|
var [currentRow, currentColumn] = findCurrentLetterPosition()
|
|
if (key.code === "Backspace") {
|
|
if (currentColumn === -1 || getGridRow(currentRow).complete) return
|
|
|
|
setGridLetter(currentRow, currentColumn, null)
|
|
return
|
|
}
|
|
|
|
if (key.code === "Enter") {
|
|
checkGridRow()
|
|
}
|
|
|
|
if (isLetter(key.key)) {
|
|
if (key.altKey || key.ctrlKey || key.metaKey) return
|
|
var [nextRow, nextColumn] = findNextLetterPosition()
|
|
if (currentRow !== nextRow && !getGridRow(currentRow).complete) return
|
|
setGridLetter(nextRow, nextColumn, key.key)
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
// create event listeners
|
|
document.addEventListener('keyup', (e) => {
|
|
console.log(e)
|
|
setNextLetter(e)
|
|
})
|
|
|
|
|
|
init() |