Learn to create tic tac toe game with javascript.
HTML
<div class="container"> <div class="game_container"> <div class="grid"> <div class="row"> <div class="square" id="cell1" data-position="1"></div> <div class="square" id="cell2" data-position="2"></div> <div class="square" id="cell3" data-position="3"></div> </div> <div class="row"> <div class="square" id="cell4" data-position="4"></div> <div class="square" id="cell5" data-position="5"></div> <div class="square" id="cell6" data-position="6"></div> </div> <div class="row"> <div class="square" id="cell7" data-position="7"></div> <div class="square" id="cell8" data-position="8"></div> <div class="square" id="cell9" data-position="9"></div> </div> </div> </div> <div class="result_container"> <h2 class="game_result">Result</h2> <button id="btnPlay">Play</button> </div> </div>
CSS
html { box-sizing: border-box; } *, *::before, *::after { box-sizing: inherit; } body { padding: 0; margin: 0; height: 100vh; } .container { width: 1200px; display: flex; flex-direction: column; margin: 50px auto; } .game_container { width: 600px; margin: 0 auto; } .grid { width: 50%; margin: 0 auto; } .row { display: flex; } .square { width: 100px; height: 80px; border: 1px solid #000; padding: 20px; font-size: 40px; text-align: center; line-height: 50px; } #cell1, #cell4, #cell7 { border-left: none; } #cell1, #cell2, #cell3 { border-top: none; } #cell7, #cell8, #cell9 { border-bottom: none; } #cell3, #cell6, #cell9 { border-right: none; } .x-mark { color: green; } .o-mark { color: red; } .result_container { width: 400px; margin: 50px auto; } button { font-size: 22px; padding: 7px 15px; background-color: aquamarine; cursor: pointer; }
JS
let square = document.querySelectorAll(".square"); let button = document.querySelector('button'); let game_over = false; square.forEach(ele => { ele.addEventListener('click', player) }) function player() { if (!game_over) { let getClass = this.getAttribute("class"); if (getClass.indexOf("marked") < 0) { this.classList.add("x-mark", "marked"); this.innerHTML = "X"; getPosition(this.dataset.position, "x-mark"); computer(); } else { return } if (document.querySelectorAll('.marked').length === 9 && game_over === false) { displayResult('Draw!', 'draw'); finished = true; } } } function computer() { let unmarked = document.querySelectorAll(".square:not(.marked)"); if (unmarked.length > 0) { let randPosition = Math.floor(Math.random() * unmarked.length); let randCell = unmarked[randPosition]; randCell.classList.add("o-mark", "marked"); randCell.innerHTML = "O" getPosition(randCell.dataset.position, "o-mark"); } else { return; } } function getPosition(pos, mark) { let winningPos = [[1, 2, 3], [1, 4, 7], [1, 5, 9], [2, 5, 8], [3, 6, 9], [3, 5, 7], [4, 5, 6], [7, 8, 9]] if (document.querySelectorAll(".x-mark").length >= 3 || document.querySelectorAll(".o-mark").length >= 3) { winningPos.forEach((element) => { if (game_over === true) { return false; } else { if (element.indexOf(Number(pos)) >= 0) { let marksInARow = 0; element.forEach((ele) => { let classNames = document.getElementById("cell" + ele).getAttribute('class'); if (classNames.indexOf(mark) >= 0) { marksInARow++; if (marksInARow === 3) { game_over = true; if (mark === "x-mark") { displayResult("You Win!", "win") } else if (mark === "o-mark") { displayResult("You Lost!", "lost") return false; } } } }) } } }) } } function displayResult(message) { document.querySelector('.game_result').innerHTML = 'Result:' + " " + message; } button.addEventListener('click', reset); function reset() { document.querySelector('.game_result').innerHTML = 'Result'; square.forEach(ele => { ele.classList.remove('x-mark', 'o-mark', 'marked'); ele.innerHTML = ""; }) game_over = false; }