Skip to content
Advertisement

How to reset the state after a tictactoe game?

how do i reset the state of the board after a tictactoe game?

i want to fire the startGame() function where it will clear out all the x’s and O’s of the board whenever i hit the restart button.

or do you have any other cleaner approach to do so? thank you so much

const squares = document.querySelectorAll('.grid')
const XCLASS = "x"
const OCLASS = "o"
const textElementWin = document.getElementById('xowinMessage')
const screenElementWin = document.querySelector('.winningScreen')
const textElementDraw = document.getElementById('drawMessage')
const screenElementDraw = document.querySelector('.drawScreen')
const restartButtons = document.querySelectorAll('.button')
const winCombinations=[
    [0,1,2],
    [3,4,5],
    [6,7,8],
    [0,3,6],
    [1,4,7],
    [2,5,8],
    [0,4,8],
    [2,4,6]
]

let circleturn

squares.forEach(square => {
        square.addEventListener('click', handleEvent, {once:true})
})


function handleEvent(event){
    const cell = event.target
    const currentPlayer = circleturn ? OCLASS : XCLASS
    placeItem(cell,currentPlayer)
        
    if (checkWin(currentPlayer)){
        screenElementWin.classList.add('show')
        textElementWin.innerText = `${currentPlayer} wins!`

    }else if(checkDraw()){
        screenElementDraw.classList.add('show')
        textElementDraw.innerText = "It's a tie!"
    }
    else{
        swapTurn()
    }
}

restartButtons.forEach(eachbutton => {
    eachbutton.addEventListener('click', ()=>{
        screenElementWin.classList.remove('show')
        startGame()
    })
})

Advertisement

Answer

Bear in mind that element.className is a space separated list of class names.

  1. Assumption: at the beginning of a game, all cells in the grid have the same class name string. This may be the empty string, a single class name, or a space separated list of class names that do not include the values of OCLASS or XCLASS.

      const squares = document.querySelectorAll('.grid');
      const EMPTY_CLASS = squares[0].className; // empty cell class
      ...
    
  2. Suggestion: don’t process clicks on cells that have already been clicked.

     const cell = event.target;
     if( cell.className != EMPTY_CLASS) {
         return;
     }
     placeItem(cell,currentPlayer)
     ...
    
  3. Reset the className property of all cells to EMPTY_CLASS in the startGame function. This function can also be responsible for ensuring winning notifications are removed and notifying players of who goes first (‘x’ or ‘o’).

    While you could inline the startGame code, it may be clearer to separate it from the event handler in the same manner as functions placeItem and swapTurn have been separated.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement