Home > Software engineering >  Tic Tac Toe JavaScript Draw Logic
Tic Tac Toe JavaScript Draw Logic

Time:02-10

I'm developing this tic tac toe game. Everything is working fine, all logic are running smoothly, but I am stuck on its draw logic (line 67-75). I don't know what is wrong with my code. I have tried my best, I'm clueless now. (Why line number 43 is not working also and how to make click disable after win.)

let winSound = new Audio("../audio/1.mp3");
let cheeringSound = new Audio("../audio/2.wav");
let playSound = new Audio("../audio/4.wav");
let turn = "X";
let gameover = false;

// function to change the turn-------
const changeTurn = () => {
  return turn === "X" ? "0" : "X";
};

// Function to check for win---------
const checkWin = () => {
  let boxtext = document.getElementsByClassName("box_text");
  let wins = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8],
    [0, 4, 8],
    [2, 4, 6],
  ];
  wins.forEach((e) => {
    if (
      boxtext[e[0]].innerText === boxtext[e[1]].innerText &&
      boxtext[e[2]].innerText === boxtext[e[1]].innerText &&
      boxtext[e[0]].innerText !== ""
    ) {
      document.querySelector(".gameInfo").innerText =
        boxtext[e[0]].innerText   " "   "-"   "Won";

      boxtext[e[0]].style.backgroundColor = "#62c90e";
      boxtext[e[1]].style.backgroundColor = "#62c90e";
      boxtext[e[2]].style.backgroundColor = "#62c90e";

      // -----------------------
      let myboxs = document.querySelectorAll(".box");
      Array.from(myboxs).forEach((mybox) => {
        mybox.style.backgroundColor = "#17659d";
        mybox.style.border = "1px solid #4c0284";
        // mybox.style,{background-color:"#17659d";  border:"1px solid #4c0284"};
      });

      // --------------
      document.getElementById("my-canvas").style.backgroundColor = "#000";
      //  ---------------
      // gameover = true;
      cheeringSound.play();
      winSound.play();

      //  confetti effect-------------------
      var confettiElement = document.getElementById("my-canvas");
      var confettiSettings = {
        target: confettiElement
      };
      var confetti = new ConfettiGenerator(confettiSettings);
      confetti.render();
    }


  });


};

// Function to check for draw---------
const checkDraw = () => {
  let boxes = document.getElementsByClassName("box");
  Array.from(boxes).forEach((element) => {
    let boxtext = element.querySelector(".box_text");

    if (boxtext.innerText === turn) {
      document.querySelector(".gameInfo").innerText = "Draw";
    }
  });


};



// Game Logic----------------

let boxes = document.getElementsByClassName("box");
Array.from(boxes).forEach((element) => {
  let boxtext = element.querySelector(".box_text");
  element.addEventListener("click", () => {
    if (boxtext.innerText === "") {
      boxtext.innerText = turn;
      turn = changeTurn();
      playSound.play();

      checkWin();
      checkDraw();
      if (!gameover) {
        document.getElementsByClassName("gameInfo")[0].innerText =
          "Turn for "   turn;
      }
    }
  });
});

// event listner on reset button--------------

reset.addEventListener("click", () => {
  let boxtext = document.querySelectorAll(".box_text");
  Array.from(boxtext).forEach((element) => {
    element.innerText = " ";
  });
  turn = "X";

  gameover = false;
  document.getElementsByClassName("gameInfo")[0].innerText = "Turn for "   turn;
  location.reload();
});
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: "Lucida Sans", "Lucida Sans Regular", "Lucida Grande", "Lucida Sans Unicode", Geneva, Verdana, sans-serif;
}

body {
  position: relative;
  height: 100vh;
}

nav {
  text-align: center;
  font-size: 2rem;
  padding: 1rem 2rem;
  background-color: #112f0c;
  color: #fff;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
}

nav ul li {
  float: left;
  padding-right: 0.5rem;
  list-style: none;
  color: #05a91e;
  text-shadow: 0px 5px 2px rgb(109, 111, 109);
  /* transition: 1s; */
}

nav ul .tic {
  animation: tic 0.5s .5s forwards;
  opacity: 0;
}

nav ul .tac {
  animation: tac 0.5s 1s forwards;
  opacity: 0;
}

nav ul .toe {
  animation: toe 0.5s 1.5s forwards;
  opacity: 0;
}

@keyframes tic {
  from {
    transform: translateX(-50%);
    opacity: 0.5;
  }
  to {
    transform: translateX(10%);
    opacity: 1;
  }
}

@keyframes tac {
  from {
    transform: translateX(-50%);
    opacity: 0.5;
  }
  to {
    transform: translateX(10%);
    opacity: 1;
  }
}

@keyframes toe {
  from {
    transform: translateX(-50%);
    opacity: 0.5;
  }
  to {
    transform: translateX(10%);
    opacity: 1;
  }
}

.info_box span {
  font-size: 1.3rem;
  padding-right: 0.5rem;
  color: rgb(8, 157, 63);
  text-shadow: 0px 5px 2px rgb(109, 111, 109);
  transition: 1s;
}

#reset {
  width: 110px;
  height: 35px;
  cursor: pointer;
  border: none;
  transition: 0.3s;
  font-size: 14px;
  text-transform: uppercase;
  font-weight: 700;
}

#reset:hover {
  background-color: #62c90e;
}


/* ---------------- */

#gameContainer {
  display: flex;
  justify-content: center;
  z-index: 999;
  padding: 2% 0;
}

.container {
  display: grid;
  grid-template-columns: repeat(3, 10vw);
  grid-template-rows: repeat(3, 10vw);
}

.box {
  border: 1px solid rgb(2, 2, 2);
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
  transition: 0.3s;
}

.container .box span {
  font-size: 6vw;
  padding: 14% 31%;
}

.box:hover {
  background-color: rgb(220, 251, 215);
}

.box:first-child,
.box:nth-child(2),
.box:nth-child(3) {
  border-top: none;
}

.box:nth-child(3n 1) {
  border-left: none;
}

.box:nth-child(3n 3) {
  border-right: none;
}

.box:last-child,
.box:nth-child(7),
.box:nth-child(8) {
  border-bottom: none;
}


/* --------------------- */

#my-canvas {
  position: fixed;
  top: 0;
  left: 0;
  z-index: -1;
  width: 100%;
  height: 800px;
}


/* Responsive==================================================== */

@media (max-width: 600px) {
  .info_box {
    background-color: #112f0c;
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    padding: 0.8rem 2rem;
    text-align: right;
  }
  #gameContainer {
    display: flex;
    justify-content: center;
    z-index: 999;
    padding: 2% 0 0;
  }
}

@media (max-width: 460px) {
  nav ul li {
    font-size: 1.7rem;
  }
  .container {
    grid-template-columns: repeat(3, 15vw);
    grid-template-rows: repeat(3, 15vw);
  }
  .container .box span {
    font-size: 12vw;
    padding: 0% 23%;
  }
}

@media (max-width: 400px) {
  #gameContainer {
    padding: 8% 0 0;
  }
  #reset {
    width: 70px;
    height: 30px;
  }
}


/* Object.assign(yourelement.style,{fontsize:"12px",left:"200px",top:"100px"}); */
<body>
  <nav>
    <ul>
      <li >Tic</li>
      <li > Tac</li>
      <li >Toe</li>
    </ul>
    <div >
      <span >Turn for X</span>
      <button id="reset">Reset</button>
    </div>
  </nav>

  <section id="gameContainer">
    <div >
      <div ><span ></span></div>
      <div ><span ></span></div>
      <div ><span ></span></div>
      <div ><span ></span></div>
      <div ><span ></span></div>
      <div ><span ></span></div>
      <div ><span ></span></div>
      <div ><span ></span></div>
      <div ><span ></span></div>
    </div>
  </section>

  <canvas id="my-canvas"></canvas>


  <!-- java script  -->
  <script src="js/script.js"></script>
  <script src="js/index.min.js"></script>
  <!-- <script src="js/array.js"></script> -->

</body>

CodePudding user response:

  •  Tags:  
  • Related