parent
0c68873c6a
commit
3769b76708
@ -0,0 +1,92 @@
|
||||
const X_Class = 'x'
|
||||
const CIRCLE_CLASS = 'circle'
|
||||
const WINNING_COMBINATIONS = [
|
||||
[0, 1, 2],
|
||||
[3, 4, 5],
|
||||
[6, 7, 8],
|
||||
[0, 3, 6],
|
||||
[1, 4, 7],
|
||||
[2, 5, 8],
|
||||
[0, 4, 8],
|
||||
[2, 4, 6]
|
||||
]
|
||||
const cellElements = document.querySelectorAll('[data-cell]')
|
||||
const winningMessageTextElement = document.querySelector('[data-winning-message-text]')
|
||||
const winningMessageElement = document.getElementById('winningMessage')
|
||||
const restartButton = document.getElementById('restartButton')
|
||||
const board = document.getElementById('board')
|
||||
let circleTurn
|
||||
|
||||
startGame()
|
||||
|
||||
restartButton.addEventListener('click', startGame)
|
||||
|
||||
function startGame(params) {
|
||||
circleTurn = false
|
||||
|
||||
cellElements.forEach(cell => {
|
||||
cell.classList.remove(X_Class)
|
||||
cell.classList.remove(CIRCLE_CLASS)
|
||||
cell.removeEventListener('click', handleClick)
|
||||
cell.addEventListener('click', handleClick, { once: true })
|
||||
})
|
||||
setBoardHoverClass()
|
||||
winningMessageElement.classList.remove('show')
|
||||
}
|
||||
|
||||
|
||||
function handleClick(e) {
|
||||
const cell = e.target
|
||||
const currentClass = circleTurn ? CIRCLE_CLASS : X_Class
|
||||
placeMark(cell, currentClass)
|
||||
if (checkWin(currentClass)) {
|
||||
endGame(false)
|
||||
} else if (isDraw()) {
|
||||
endGame(true)
|
||||
} else {
|
||||
swapTurns()
|
||||
setBoardHoverClass()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function endGame(draw) {
|
||||
if (draw) {
|
||||
winningMessageTextElement.innerText = 'Draw!'
|
||||
} else {
|
||||
winningMessageTextElement.innerText = `${circleTurn ? "O's Wins" :"X's Wins" }`
|
||||
}
|
||||
winningMessageElement.classList.add('show')
|
||||
}
|
||||
|
||||
function placeMark(cell, currentClass) {
|
||||
cell.classList.add(currentClass)
|
||||
}
|
||||
|
||||
function swapTurns() {
|
||||
circleTurn = !circleTurn
|
||||
}
|
||||
|
||||
function isDraw() {
|
||||
return [...cellElements].every(cell => {
|
||||
return cell.classList.contains(X_Class) || cell.classList.contains(CIRCLE_CLASS)
|
||||
})
|
||||
}
|
||||
|
||||
function setBoardHoverClass() {
|
||||
board.classList.remove(X_Class)
|
||||
board.classList.remove(CIRCLE_CLASS)
|
||||
if (circleTurn) {
|
||||
board.classList.add(CIRCLE_CLASS)
|
||||
} else {
|
||||
board.classList.add(X_Class)
|
||||
}
|
||||
}
|
||||
|
||||
function checkWin(currentClass) {
|
||||
return WINNING_COMBINATIONS.some(combinations => {
|
||||
return combinations.every(index => {
|
||||
return cellElements[index].classList.contains(currentClass)
|
||||
})
|
||||
})
|
||||
}
|
Loading…
Reference in new issue