JSFiddle - React, Tailwind, and code Playground

by Torwan

HTML

<div class="container">
    <div class="card" data-index="1"></div>
    <div class="card" data-index="2"></div>
    <div class="card" data-index="3"></div>
    <div class="card" data-index="4"></div>
    <div class="card" data-index="5"></div>
    <div class="card" data-index="6"></div>
    <div class="card" data-index="7"></div>
    <div class="card" data-index="8"></div>
    <div class="card" data-index="9"></div>
    
  </div>

CSS

*{
    box-sizing: border-box;
    font-family: sans-serif;
  }
  body{
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: #BF360C;
  }
  .container{
    width: 500px;
    height: 500px;
    display: grid;
    background-color: #E64A19;
    grid-gap: 5px;
    grid-template-columns: 33% 33% 33%;
    grid-auto-rows: 33% 33% 33%;
  }
  .card{
    position: relative;
    background-color: #BF360C;
    cursor: pointer;
  }
  .card::before{
    position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    font-weight: bold;
    font-size: 8rem;
  }
  .card.x::before{
    content: "X";
  }
  .card.o::before{
    content: "O";
  }
  .winner{
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    position: fixed;
    width: 400px;
    height: 200px;
    padding: 20px 40px;
    background-color: #fff;
    font-size: 2rem;
    border-radius: 20px;
    text-align: center;
    animation: animate .5s linear;
  }
  @keyframes animate{
    from{
      opacity: 0;
    }
    to{
      opacity: 1;
    }
  }
  .winner button{
    margin-top: 20px;
    width: 80px;
    height: 35px;
    line-height: 35px;
    padding: 0;
    border: 0;
    outline: 0;
    border-radius: 20px;
    cursor: pointer;
    color: #fff;
    background-color: #BF360C;
  }

JavaScript

const cards = Array.from(document.querySelectorAll(".card"));
const winner = [[1,2,3],[4,5,6],[7,8,9],[1,5,9],[3,5,7],[1,4,7],[2,5,8],[3,6,9]];
let firstPlayer = [], secondPlayer = [], count = 0;
/*******************************************************/
function check(array){
  let finalResult = false;
  for(let item of winner){
    let res = item.every(val => array.indexOf(val) !== -1);
    if(res){
      finalResult = true;
      break;
    }
  }
  return finalResult;
}
/*******************************************************/
function winnerpleyr(p){
  const modal = document.createElement("div");
  const player = document.createTextNode(p);
  const replay = document.createElement("button");
  modal.classList.add("winner");
  modal.appendChild(player);
  replay.appendChild(document.createTextNode("Replay"));
  // replay.setAttribute("onclick","rep();");
  replay.onclick = function() { rep() };
  modal.appendChild(replay);
  document.body.appendChild(modal);
}
/*******************************************************/
function draw(){
  if(this.classList == "card"){
    count++;
    if(count%2 !== 0){
      this.classList.add("x");
      firstPlayer.push(Number(this.dataset.index));
      if(check(firstPlayer)){        
        winnerpleyr("Congrats player one you win");
        return true;
      }
    } else{
      this.classList.add("o");
      secondPlayer.push(Number(this.dataset.index));
      if(check(secondPlayer)){
        winnerpleyr("Congrats player two you win");
        return true;
      }
    }
    if(count === 9){
      winnerpleyr("Draw");
    }
  }
}
/*******************************************************/
function rep(){
  const w = document.querySelector(".winner");
  // cards.forEach(card => card.classList = "card");
  firstPlayer = [];
  secondPlayer = [];
  count = 0;
  w.remove();
  [].forEach.call(cards, function(el) {
    el.classList.remove("x");
	  el.classList.remove("o");
  });
 
 
}
 
...