Netbyzz

#A071
Rock-Paper-Scissors Game

HTML :

<!-- CODE = #A071 -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>NETBYZZ A071</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <section class="container">
      <div class="result_field">
        <div class="result_images">
          <span class="user_result">
            <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9UMe2YpdMG2gYlnKnnsxL7Uq4Q1hvwSo_HtcPqECzPzHcEZ4pePcSSX8RBmMLsIPUX_VP2-n2aqfK-sfXbxG8PpUwrW9joCbzcr_1auirzZhNswaxgh-hmaXsixNO0R0F-d2Fo9LSEkFhI7BTgk2ky472S9YGbXrxXl94xEUw94ppth-n_DsD1O1f_p4/s1600/rock.png" alt="" />
          </span>
          <span class="cpu_result">
            <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9UMe2YpdMG2gYlnKnnsxL7Uq4Q1hvwSo_HtcPqECzPzHcEZ4pePcSSX8RBmMLsIPUX_VP2-n2aqfK-sfXbxG8PpUwrW9joCbzcr_1auirzZhNswaxgh-hmaXsixNO0R0F-d2Fo9LSEkFhI7BTgk2ky472S9YGbXrxXl94xEUw94ppth-n_DsD1O1f_p4/s1600/rock.png" alt="" />
          </span>
        </div>
        <div class="result">Let's Play!!</div>
      </div>
      <div class="option_images">
        <span class="option_image">
          <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9UMe2YpdMG2gYlnKnnsxL7Uq4Q1hvwSo_HtcPqECzPzHcEZ4pePcSSX8RBmMLsIPUX_VP2-n2aqfK-sfXbxG8PpUwrW9joCbzcr_1auirzZhNswaxgh-hmaXsixNO0R0F-d2Fo9LSEkFhI7BTgk2ky472S9YGbXrxXl94xEUw94ppth-n_DsD1O1f_p4/s1600/rock.png" alt="" />
          <p>Rock&nbsp;&nbsp;</p>
        </span>
        <span class="option_image">
          <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcWaNlDjL-xu5fSLyryG62CxGOterNYEL0YL-fi1c5zcusZRT1M9plmQ6KP2uV5mF3mBeCmvnvr1nPPznW9DoaOJLc73HgOhz0XagkmCoijvExTSo8rMlJmqWvPZX5Wpe_cTm0yK_MQfp22GoqADSht13fwlgiDU9Z18GVCYK5-IfNeZc9PCmTMZlxf6A/s1600/paper.png" alt="" />
          <p>Paper&nbsp;&nbsp;</p>
        </span>
        <span class="option_image">
          <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirmnOWhbkicgijVeiBjkiUXylJkRS2QuN2fIz3UBNTTVpRAbxE9SCjeoBcLT0HAP0e0BLmeYhuGOrrPrPDkKbWEtAzTo2Ugc9alYoiLeNroQZvH-mrQ_xdvjUXyf7qJ4Cy6ws5H646YqKhHv6zF59QIJYutMuo7D0qRRVDShIjqxWh3dtL9F8-RquCT9A/s1600/scissors.png" alt="" />
          <p>Scissors&nbsp;</p>
        </span>
      </div>
    </section>
    <script src="script.js"></script>
  </body>
</html>

CSS :

/* Import Google font - Poppins */
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap");

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: "Poppins", sans-serif;
}

body {
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #f6f7fb;
}

::selection {
    color: #fff;
    background-color: #7d2ae8;
}

.container {
    padding: 2rem 7rem;
    border-radius: 14px;
    background: #fff;
    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
}

.result_images {
    display: flex;
    column-gap: 7rem;
}

.container.start .user_result {
    transform-origin: left;
    animation: userShake 0.7s ease infinite;
}

@keyframes userShake {
    50% {
        transform: rotate(10deg);
    }
}

.container.start .cpu_result {
    transform-origin: right;
    animation: cpuShake 0.7s ease infinite;
}

@keyframes cpuShake {
    50% {
        transform: rotate(-10deg);
    }
}

.result_images img {
    width: 100px;
}

.user_result img {
    transform: rotate(90deg);
}

.cpu_result img {
    transform: rotate(-90deg) rotateY(180deg);
}

.result {
    text-align: center;
    font-size: 2rem;
    color: #7d2ae8;
    margin-top: 1.5rem;
}

.option_image img {
    width: 50px;
}

.option_images {
    display: flex;
    align-items: center;
    margin-top: 2.5rem;
    justify-content: space-between;
}

.container.start .option_images {
    pointer-events: none;
}

.option_image {
    display: flex;
    flex-direction: column;
    align-items: center;
    opacity: 0.5;
    cursor: pointer;
    transition: opacity 0.3s ease;
}

.option_image:hover {
    opacity: 1;
}

.option_image.active {
    opacity: 1;
}

.option_image img {
    pointer-events: none;
}

.option_image p {
    color: #7d2ae8;
    font-size: 1.235rem;
    margin-top: 1rem;
    pointer-events: none;
}

JS :

// Get  to DOM elements
const gameContainer = document.querySelector(".container"),
  userResult = document.querySelector(".user_result img"),
  cpuResult = document.querySelector(".cpu_result img"),
  result = document.querySelector(".result"),
  optionImages = document.querySelectorAll(".option_image");

// Loop through each option image element
optionImages.forEach((image, index) => {
  image.addEventListener("click", (e) => {
    image.classList.add("active");

    userResult.src = cpuResult.src =
      "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9UMe2YpdMG2gYlnKnnsxL7Uq4Q1hvwSo_HtcPqECzPzHcEZ4pePcSSX8RBmMLsIPUX_VP2-n2aqfK-sfXbxG8PpUwrW9joCbzcr_1auirzZhNswaxgh-hmaXsixNO0R0F-d2Fo9LSEkFhI7BTgk2ky472S9YGbXrxXl94xEUw94ppth-n_DsD1O1f_p4/s1600/rock.png";
    result.textContent = "Wait...";

    // Loop through each option image again
    optionImages.forEach((image2, index2) => {
      // If the current index doesn't match the clicked index
      // Remove the "active" class from the other option images
      index !== index2 && image2.classList.remove("active");
    });

    gameContainer.classList.add("start");

    // Set a timeout to delay the result calculation
    let time = setTimeout(() => {
      gameContainer.classList.remove("start");

      // Get the source of the clicked option image
      let imageSrc = e.target.querySelector("img").src;
      // Set the user image to the clicked option image
      userResult.src = imageSrc;

      // Generate a random number between 0 and 2
      let randomNumber = Math.floor(Math.random() * 3);
      // Create an array of CPU image options
      let cpuImages = [
        "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9UMe2YpdMG2gYlnKnnsxL7Uq4Q1hvwSo_HtcPqECzPzHcEZ4pePcSSX8RBmMLsIPUX_VP2-n2aqfK-sfXbxG8PpUwrW9joCbzcr_1auirzZhNswaxgh-hmaXsixNO0R0F-d2Fo9LSEkFhI7BTgk2ky472S9YGbXrxXl94xEUw94ppth-n_DsD1O1f_p4/s1600/rock.png",
        "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcWaNlDjL-xu5fSLyryG62CxGOterNYEL0YL-fi1c5zcusZRT1M9plmQ6KP2uV5mF3mBeCmvnvr1nPPznW9DoaOJLc73HgOhz0XagkmCoijvExTSo8rMlJmqWvPZX5Wpe_cTm0yK_MQfp22GoqADSht13fwlgiDU9Z18GVCYK5-IfNeZc9PCmTMZlxf6A/s1600/paper.png",
        "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirmnOWhbkicgijVeiBjkiUXylJkRS2QuN2fIz3UBNTTVpRAbxE9SCjeoBcLT0HAP0e0BLmeYhuGOrrPrPDkKbWEtAzTo2Ugc9alYoiLeNroQZvH-mrQ_xdvjUXyf7qJ4Cy6ws5H646YqKhHv6zF59QIJYutMuo7D0qRRVDShIjqxWh3dtL9F8-RquCT9A/s1600/scissors.png",
      ];
      // Set the CPU image to a random option from the array
      cpuResult.src = cpuImages[randomNumber];

      // Assign a letter value to the CPU option (R for rock, P for paper, S for scissors)
      let cpuValue = ["R", "P", "S"][randomNumber];
      // Assign a letter value to the clicked option (based on index)
      let userValue = ["R", "P", "S"][index];

      // Create an object with all possible outcomes
      let outcomes = {
        RR: "Draw",
        RP: "Cpu",
        RS: "User",
        PP: "Draw",
        PR: "User",
        PS: "Cpu",
        SS: "Draw",
        SR: "Cpu",
        SP: "User",
      };

      // Look up the outcome value based on user and CPU options
      let outComeValue = outcomes[userValue + cpuValue];

      // Display the result
      result.textContent =
        userValue === cpuValue ? "Match Draw" : `${outComeValue} Won!!`;
    }, 2500);
  });
});

Source Code