Home > database >  Rock paper scissors Vanilla JS - Does NOT reset classes when restart
Rock paper scissors Vanilla JS - Does NOT reset classes when restart

Time:08-26

there are a lot of questiosn about this here but can't seen to find one for vanilla js..

Well here goes. New class assigment : Rock paper scissors with vanilla js.

The game works in itself, the problem is when i want it to restart. It seems to rung through all the new event listeners i put ? And i just don´t see why it does that, i only click on one of the buttons but it operates as if i clicked on them all in a row.

I'm sure the problem is in the lasts functions (the win, tie and lose screen). But i am at a loss as to what is the problem here.

Here is the git rep of the project : [https://github.com/emma673r/rockpaperscissors][1]

and here is the code

const gameField = document.getElementById(`gamefield`);
const player = document.getElementById(`player1`);
const computer = document.getElementById(`player2`);

const lose = document.getElementById(`lose`);
const win = document.getElementById(`win`);
const tie = document.getElementById(`tie`);

const rock = document.querySelector(`.rock`);
const paper = document.querySelector(`.paper`);
const scissors = document.querySelector(`.scissors`);

//rock = 0, paper = 1, scissors = 2
let compChoice;
compChoice = Math.floor(Math.random() * 3);

//rock = 0, paper = 1, scissors = 2
let userChoice;

// DOM load - send to titleScreen
window.addEventListener("DOMContentLoaded", titleScreen);

// titleScreen
function titleScreen() {
  console.log(`titleScreen`);

  tie.classList = "hidden";
  win.classList = "hidden";
  lose.classList = "hidden";

//   compChoice = Math.floor(Math.random() * 3);
//   console.log(`compChoice is : ${compChoice}`);

  // event listener rock btn click startGame
  rock.addEventListener("click", shakeHandsRock);
  // event listener paper btn click startGame
  paper.addEventListener("click", shakeHandsPaper);
  // event listener scissors btn click startGame
  scissors.addEventListener("click", shakeHandsScissors);
}

function shakeHandsRock() {
  console.log(`shakeHandsRock`);

    compChoice = Math.floor(Math.random() * 3);
    console.log(`compChoice is : ${compChoice}`);

  player.classList.add("shake");
  computer.classList.add("shake");
  player.addEventListener("animationend", rockClicked);
}

function shakeHandsPaper() {
  console.log(`shakeHandsPaper`);

    compChoice = Math.floor(Math.random() * 3);
    console.log(`compChoice is : ${compChoice}`);

  player.classList.add("shake");
  computer.classList.add("shake");
  player.addEventListener("animationend", paperClicked);
}

function shakeHandsScissors() {
  console.log(`shakeHandsScissors`);

    compChoice = Math.floor(Math.random() * 3);
  console.log(`compChoice is : ${compChoice}`);

  player.classList.add("shake");
  computer.classList.add("shake");
  player.addEventListener("animationend", scissorsClicked);
}

function rockClicked() {
  console.log(`rockClicked`);
  userChoice = 0;

  player.classList = "player rock";
  computer.classList = "player";

  player.classList.remove("shake");
  computer.classList.remove("shake");
  //   rock vs rock = tie
  if (userChoice == compChoice) {
    // shake animation

    // show hands pngs
    computer.classList.add(`rock`);

    tieScreen();
  }
  //   rock vs paper = player lose
  else if (compChoice == 1) {
    // shake animation

    // show hands pngs
    computer.classList.add(`paper`);

    loseScreen();
  }
  //   rock vs scissors = player win
  else if (compChoice == 2) {
    // shake animation

    // show hands pngs
    computer.classList.add(`scissors`);

    winScreen();
  }
}

function paperClicked() {
  console.log(`paperClicked`);
  userChoice = 1;

  player.classList = "player paper";
  computer.classList = "player";

  player.classList.remove("shake");
  computer.classList.remove("shake");

  //   paper vs rock = win
  if (compChoice == 0) {
    // shake animation

    // show hands pngs
    computer.classList.add("rock");

    winScreen();
  }
  //   paper vs paper = tie
  else if (compChoice == userChoice) {
    // shake animation

    // show hands pngs
    computer.classList.add(`paper`);

    tieScreen();
  }
  //   paper vs scissors = lose
  else if (compChoice == 2) {
    // shake animation

    // show hands pngs
    computer.classList.add(`scissors`);

    loseScreen();
  }
}

function scissorsClicked() {
  console.log(`scissorsClicked`);
  userChoice = 2;

  player.classList = "player scissors";
  computer.classList = "player";

  player.classList.remove("shake");
  computer.classList.remove("shake");

  //   scissors vs rock = lose
  if (compChoice == 0) {
    // show hands pngs
    computer.classList.add(`rock`);

    loseScreen();
  }
  //   scissors vs paper = win
  else if (compChoice == 1) {
    // shake animation

    // show hands pngs
    computer.classList.add(`paper`);

    winScreen();
  }
  //   scissors vs scissors = tie
  else if (compChoice == userChoice) {
    // shake animation

    // show hands pngs
    computer.classList.add(`scissors`);

    tieScreen();
  }
}

// tieScreen
function tieScreen() {
  console.log(`tieScreen`);

  // display block tie div
  tie.classList = "";
  win.classList = "hidden";
  lose.classList = "hidden";

  rock.addEventListener("click", shakeHandsRock);
  paper.addEventListener("click", shakeHandsPaper);
  scissors.addEventListener("click", shakeHandsScissors);
}

// winScreen
function winScreen() {
  console.log(`winScreen`);

  // display block win div
  win.classList = "";
  tie.classList = "hidden";
  lose.classList = "hidden";

  rock.addEventListener("click", shakeHandsRock);
  paper.addEventListener("click", shakeHandsPaper);
  scissors.addEventListener("click", shakeHandsScissors);
}
// loseScreen
function loseScreen() {
  console.log(`loseScreen`);

  // display block lose screen
  lose.classList = "";
  win.classList = "hidden";
  tie.classList = "hidden";

  rock.addEventListener("click", shakeHandsRock);
  paper.addEventListener("click", shakeHandsPaper);
  scissors.addEventListener("click", shakeHandsScissors);
}
body {
  margin: 0;
  background-color: #444059;
  font-family: 'Luckiest Guy', cursive;
  color: #eee;
}

h1 {
  text-align: center;
  font-size: 8vw;
}

#gamefield {
  position: relative;
  overflow: hidden;
  display: flex;
  justify-content: space-between;
}

#player1 {
  --rot: 1;
}

#player2 {
  --rot: -1;
}

.player {
  transform: scale(var(--rot),1);
  width: 40vw;
  height: 40vw;
  background-size: 100%;
  background-image: url(hand_rock.png);
}

.player.rock {
  background-image: url(hand_rock.png);
}

.player.paper {
  background-image: url(hand_paper.png);
}

.player.scissors {
  background-image: url(hand_scissors.png);
}

.player.shake {
  background-image: url(hand_rock.png);
  transform-origin: left center;
  animation: shake 1.8s ease-in 1 forwards;
}

@keyframes shake {
  0% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(0deg);
  }
  16% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(-40deg);
  }
  24% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(5deg);
  }
  32% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(0deg);
  }
  48% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(-40deg);
  }
  56% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(5deg);
  }
  64% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(0deg);
  }
  80% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(-40deg);
  }
  96% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(5deg);
  }
  100% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(0deg);
  }
}

#texts {
  position: absolute;
  width: 100%;
  margin-top: 10vw;
  pointer-events: none;
}

#texts h1 {
  color: #ffde53;
  text-shadow: 4px 4px 1px red, -4px -4px 1px red, 4px -4px 1px red, -4px 4px 1px red;
}

.hidden {
  display: none;
}

#buttons {
  display: flex;
  justify-content: space-around;
  max-width: 50vw;
}

#buttons.disabled button {
  filter: grayscale(100%) brightness(.75);
}

#buttons button {
  background-size: 100%;
  border-radius: 10vw;
  width: 10vw;
  height: 10vw;
  transition: filter .8s;
}

button.rock {
  background-image: url(button_rock.png);
}

button.paper {
  background-image: url(button_paper.png);
}

button.scissors {
  background-image: url(button_scissors.png);
}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Rock, Paper, Scissors</title>
    <link href="https://fonts.googleapis.com/css?family=Luckiest Guy&display=swap" rel="stylesheet" />
    <link rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <h1>Rock, Paper, Scissors</h1>

    <div id="gamefield">
      <div id="player1" ></div>
      <div id="player2" ></div>
      <div id="texts">
        <div id="lose" ><h1>You lose</h1></div>
        <div id="win" ><h1>You win</h1></div>
        <div id="tie" ><h1>It's a tie</h1></div>
      </div>
    </div>

    <div id="buttons">
      <button ></button>
      <button ></button>
      <button ></button>
    </div>
    <script src="script.js
"></script>
  </body>
</html>

If you need the images, check the git rep, i don't seem to be allowed to post them here yet.

Thank you in advance, i've been stuck on this bug for a few hours now and even with a break i just dont see how i can fix it. I have tried many things but they don't work on the problem. [1]: https://github.com/emma673r/rockpaperscissors

CodePudding user response:

In JavaScript, eventListeners don't go away after they trigger the first time. You have to manually remove an eventListener to stop it.

The bug was that your rockClicked was getting called every time the player finished its animation, once the eventListener had been set up. So I added a line to remove the eventListener when rockClicked, paperClicked, and scissorsClicked were called.

const gameField = document.getElementById(`gamefield`);
const player = document.getElementById(`player1`);
const computer = document.getElementById(`player2`);

const lose = document.getElementById(`lose`);
const win = document.getElementById(`win`);
const tie = document.getElementById(`tie`);

const rock = document.querySelector(`.rock`);
const paper = document.querySelector(`.paper`);
const scissors = document.querySelector(`.scissors`);

// event listener rock btn click startGame
rock.addEventListener("click", shakeHandsRock);
// event listener paper btn click startGame
paper.addEventListener("click", shakeHandsPaper);
// event listener scissors btn click startGame
scissors.addEventListener("click", shakeHandsScissors);

//rock = 0, paper = 1, scissors = 2
let compChoice;
compChoice = Math.floor(Math.random() * 3);

//rock = 0, paper = 1, scissors = 2
let userChoice;

// DOM load - send to titleScreen
window.addEventListener("DOMContentLoaded", titleScreen);

// titleScreen
function titleScreen() {
  console.log(`titleScreen`);

  tie.classList = "hidden";
  win.classList = "hidden";
  lose.classList = "hidden";

//   compChoice = Math.floor(Math.random() * 3);
//   console.log(`compChoice is : ${compChoice}`);

}

function shakeHandsRock() {
  console.log(`shakeHandsRock`);

    compChoice = Math.floor(Math.random() * 3);
    console.log(`compChoice is : ${compChoice}`);

  player.classList.add("shake");
  computer.classList.add("shake");
  player.addEventListener("animationend", rockClicked);
}

function shakeHandsPaper() {
  console.log(`shakeHandsPaper`);

    compChoice = Math.floor(Math.random() * 3);
    console.log(`compChoice is : ${compChoice}`);

  player.classList.add("shake");
  computer.classList.add("shake");
  player.addEventListener("animationend", paperClicked);
}

function shakeHandsScissors() {
  console.log(`shakeHandsScissors`);

    compChoice = Math.floor(Math.random() * 3);
  console.log(`compChoice is : ${compChoice}`);

  player.classList.add("shake");
  computer.classList.add("shake");
  player.addEventListener("animationend", scissorsClicked);
}

function rockClicked() {
  player.removeEventListener("animationend", rockClicked);
  console.log(`rockClicked`);
  userChoice = 0;

  player.classList = "player rock";
  computer.classList = "player";

  player.classList.remove("shake");
  computer.classList.remove("shake");
  //   rock vs rock = tie
  if (userChoice == compChoice) {
    // shake animation

    // show hands pngs
    computer.classList.add(`rock`);

    tieScreen();
  }
  //   rock vs paper = player lose
  else if (compChoice == 1) {
    // shake animation

    // show hands pngs
    computer.classList.add(`paper`);

    loseScreen();
  }
  //   rock vs scissors = player win
  else if (compChoice == 2) {
    // shake animation

    // show hands pngs
    computer.classList.add(`scissors`);

    winScreen();
  }
}

function paperClicked() {
  player.removeEventListener("animationend", paperClicked);
  console.log(`paperClicked`);
  userChoice = 1;

  player.classList = "player paper";
  computer.classList = "player";

  player.classList.remove("shake");
  computer.classList.remove("shake");

  //   paper vs rock = win
  if (compChoice == 0) {
    // shake animation

    // show hands pngs
    computer.classList.add("rock");

    winScreen();
  }
  //   paper vs paper = tie
  else if (compChoice == userChoice) {
    // shake animation

    // show hands pngs
    computer.classList.add(`paper`);

    tieScreen();
  }
  //   paper vs scissors = lose
  else if (compChoice == 2) {
    // shake animation

    // show hands pngs
    computer.classList.add(`scissors`);

    loseScreen();
  }
}

function scissorsClicked() {
  player.removeEventListener("animationend", scissorsClicked);
  console.log(`scissorsClicked`);
  userChoice = 2;

  player.classList = "player scissors";
  computer.classList = "player";

  player.classList.remove("shake");
  computer.classList.remove("shake");

  //   scissors vs rock = lose
  if (compChoice == 0) {
    // show hands pngs
    computer.classList.add(`rock`);

    loseScreen();
  }
  //   scissors vs paper = win
  else if (compChoice == 1) {
    // shake animation

    // show hands pngs
    computer.classList.add(`paper`);

    winScreen();
  }
  //   scissors vs scissors = tie
  else if (compChoice == userChoice) {
    // shake animation

    // show hands pngs
    computer.classList.add(`scissors`);

    tieScreen();
  }
}

// tieScreen
function tieScreen() {
  console.log(`tieScreen`);

  // display block tie div
  tie.classList = "";
  win.classList = "hidden";
  lose.classList = "hidden";
}

// winScreen
function winScreen() {
  console.log(`winScreen`);

  // display block win div
  win.classList = "";
  tie.classList = "hidden";
  lose.classList = "hidden";
}
// loseScreen
function loseScreen() {
  console.log(`loseScreen`);

  // display block lose screen
  lose.classList = "";
  win.classList = "hidden";
  tie.classList = "hidden";
}
body {
  margin: 0;
  background-color: #444059;
  font-family: 'Luckiest Guy', cursive;
  color: #eee;
}

h1 {
  text-align: center;
  font-size: 8vw;
}

#gamefield {
  position: relative;
  overflow: hidden;
  display: flex;
  justify-content: space-between;
}

#player1 {
  --rot: 1;
}

#player2 {
  --rot: -1;
}

.player {
  transform: scale(var(--rot),1);
  width: 40vw;
  height: 40vw;
  background-size: 100%;
  background-image: url(hand_rock.png);
}

.player.rock {
  background-image: url(hand_rock.png);
}

.player.paper {
  background-image: url(hand_paper.png);
}

.player.scissors {
  background-image: url(hand_scissors.png);
}

.player.shake {
  background-image: url(hand_rock.png);
  transform-origin: left center;
  animation: shake 1.8s ease-in 1 forwards;
}

@keyframes shake {
  0% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(0deg);
  }
  16% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(-40deg);
  }
  24% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(5deg);
  }
  32% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(0deg);
  }
  48% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(-40deg);
  }
  56% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(5deg);
  }
  64% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(0deg);
  }
  80% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(-40deg);
  }
  96% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(5deg);
  }
  100% {
    transform: scale(var(--rot),1) translateX(calc((var(--rot) - 1) * 50%)) rotate(0deg);
  }
}

#texts {
  position: absolute;
  width: 100%;
  margin-top: 10vw;
  pointer-events: none;
}

#texts h1 {
  color: #ffde53;
  text-shadow: 4px 4px 1px red, -4px -4px 1px red, 4px -4px 1px red, -4px 4px 1px red;
}

.hidden {
  display: none;
}

#buttons {
  display: flex;
  justify-content: space-around;
  max-width: 50vw;
}

#buttons.disabled button {
  filter: grayscale(100%) brightness(.75);
}

#buttons button {
  background-size: 100%;
  border-radius: 10vw;
  width: 10vw;
  height: 10vw;
  transition: filter .8s;
}

button.rock {
  background-image: url(button_rock.png);
}

button.paper {
  background-image: url(button_paper.png);
}

button.scissors {
  background-image: url(button_scissors.png);
}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Rock, Paper, Scissors</title>
    <link href="https://fonts.googleapis.com/css?family=Luckiest Guy&display=swap" rel="stylesheet" />
    <link rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <h1>Rock, Paper, Scissors</h1>

    <div id="gamefield">
      <div id="player1" ></div>
      <div id="player2" ></div>
      <div id="texts">
        <div id="lose" ><h1>You lose</h1></div>
        <div id="win" ><h1>You win</h1></div>
        <div id="tie" ><h1>It's a tie</h1></div>
      </div>
    </div>

    <div id="buttons">
      <button ></button>
      <button ></button>
      <button ></button>
    </div>
    <script src="script.js
"></script>
  </body>
</html>

  • Related