Build Beautiful Tic Tac Toe Game with Pure JavaScript
February 12, 2023
Learn How to make Tic Tac Toe Game using vanilla JavaScript
Tic Tac Toe Game Rules:
- The game is played on a grid that's 3 squares by 3 squares.
- Only two players can play this game at one time.
- You are X, your friend is O. Players take turns putting their marks in empty squares.
- The first player to get 3 of her marks in a row (up, down, across, or diagonally) is the winner.
- When all 9 squares are full, the game is over. If no player has 3 marks in a row, the game ends in a tie.
today I'm going to teach you how to make Tic Tac Toe Game using pure JavaScript.
Step 1) Make Design
(i) First we need to make game interface.
Add HTML:
<div class="players"> <div class="player1 active">O's Turn</div> <div class="player2">X's Turn</div> </div> <div class="game-board"> <div class="cell X">X</div> <div class="cell X">X</div> <div class="cell O">O</div> <div class="cell"></div> <div class="cell O">O</div> <div class="cell"></div> <div class="cell"></div> <div class="cell"></div> <div class="cell"></div> </div>
Add CSS:
*{ box-sizing: border-box; } body{ margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; flex-direction: column; } .players{ border: 2px solid #0909ad; display: flex; justify-content: center; align-items: center; border-radius: 15px; font-size: 24px; margin-top: 100px; } .players div{ padding: 15px 25px; border-radius: 15px; border: 2px solid #fff; } .players div.active{ background: #0909ad; color: #fff; } .game-board{ margin-top: 50px; display: grid; grid-template-columns: repeat(3, auto); } .cell{ height: 100px; width: 100px; border: 2px solid #0909ad; font-size: 100px; display: flex; justify-content: center; align-items: center; cursor: pointer; border-radius: 10px; } .cell.X{ color: #09aecb; } .cell.O{ color:#e50c35; } .cell:nth-child(1),.cell:nth-child(2),.cell:nth-child(3){ border-top: none; } .cell:nth-child(3n + 1){ border-left: none; } .cell:nth-child(3n){ border-right: none; } .cell:nth-child(7),.cell:nth-child(8),.cell:nth-child(9){ border-bottom: none; }
(ii) Second, make result screen design
Add HTML:
<div class="result"> <h1>X Win the Game</h1> <button>Restart</button> </div>
Add CSS:
.result{ position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 99; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; flex-direction: column; } .result h1{ color: #fff; font-size: 50px; background: rgba(0,0,100,0.5); padding: 15px 25px; } .result button{ font-size: 36px; background: #0909ad; color: #fff; border-radius: 10px; cursor: pointer; padding: 10px 25px; } .inactive{ display: none; } .disabled{ pointer-events: none; }
Step 2) Add JavaScript:
Apply JavaScript functionality.
Example
const cellElements = document.querySelectorAll(".game-board .cell"); const player1 = document.querySelector(".players .player1"); const player2 = document.querySelector(".players .player2"); const result = document.querySelector(".result"); const result_text = document.querySelector(".result h1"); const restart_btn = document.querySelector(".result button"); //winning conditions const WINNING_CONDITIONS = [ [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 playerO = "O"; const playerX = "X"; let toggleTurn = true; cellElements.forEach(cell => { cell.onclick = () => { let currentPlayer = toggleTurn ? playerO : playerX; cell.classList.add("disabled"); addInCell(cell, currentPlayer); if (winnerCheck(currentPlayer)) { addInactive(); result_text.innerText = currentPlayer + " Win the Game"; } else if (isDraw()) { // Draw the Game! addInactive(); result_text.innerText = "Draw the Game!"; } else { swapPlayer(); } } }); //Winner Check Function function winnerCheck(currentPlayer) { return WINNING_CONDITIONS.some(conditon => { return conditon.every(index => { return cellElements[index].classList.contains(currentPlayer); }); }) } //Game Draw condition checking function function isDraw() { return [...cellElements].every(cell => { return cell.classList.contains(playerX) || cell.classList.contains(playerO); }) } //Player Swap Turn by Turn function function swapPlayer() { toggleTurn = !toggleTurn; if (toggleTurn) { player1.classList.add("active"); player2.classList.remove("active"); } else { player2.classList.add("active"); player1.classList.remove("active"); } } function addInCell(cell, currentPlayer) { cell.innerHTML = currentPlayer; cell.classList.add(currentPlayer); } function addInactive() { result.classList.remove("inactive"); } //restart function restart_btn.onclick = () => { location.reload(); }