<iframe width="1280" height="720" src="https://www.youtube.com/embed/0STwSamdUyA?rel=0&amp;autoplay=1&mute=1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<div class="video-darken"></div>
<div class="img-mask-win"></div>
<div class="img-mask-loose">

</div>
<div class="intro">
  <div id="start" class="startGame d-flex flex-wrap flex-column justify-content-center align-items-center">
    <h1 class="title">Movie Quote Hack</h1>
    <div class=" introContainer">
      <div class='console-container'>
        <div id='text'>Your computer has been hacked by a movie-obsessed hacker! You have 60 seconds to save it by guessing the correct movie quote from the given hint. Be careful—each wrong letter costs you 5 seconds. Prove your movie knowledge and reclaim your computer before time runs out. Good luck!</div>
        <div class='console-underscore' id='console'></div>
      </div>
    </div>
    <a id="startBtn" class="btn btn-default" role="button">START</a>
  </div>
</div>
<div class="img-mask"></div>
<div class="usedLetters"></div>
<div class="container questionsContainer  d-flex flex-wrap flex-column justify-content-center align-items-center">
  <div class="row" id="question1">
    <div class="col-12 d-flex justify-content-center">
      <div id="timer"></div>
    </div>
    <div class="col-12 d-flex justify-content-center">
      <div id="fiveSec">-5 secondes</div>

    </div>
    <div class="password col-12 d-flex justify-content-center">
      <div class="hint"></div>
    </div>
    <div class="col-12 d-flex justify-content-center">
      <div class="secretWord"></div>
    </div>
  </div>
  <div class="letters"></div>

  <div class="gameFinish flex-wrap justify-content-center align-items-center" id="win">
    <div class="magic-word"><img src="https://alexandrevacassin.fr/codepen/puzzle/magic-word.gif"></div>
    <div class="finishText"></div>
    <div class="correct-quote" style="display:none;"></div>
    <a id="restartBtn" class="btn btn-default" role="button">RESTART</a>
  </div>
.img-mask {
  background: url(https://alexandrevacassin.fr/codepen/puzzle/fond.png) no-repeat
    center center fixed;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
  width: 100vw;
  height: 100vh;
  position: fixed;
  pointer-events: none;
  z-index: 5;
}

.img-mask-win {
  background: url(https://alexandrevacassin.fr/codepen/puzzle/fond-win.jpg)
    no-repeat center center fixed;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
  width: 100vw;
  height: 100vh;
  position: fixed;
  pointer-events: none;
  z-index: 0;
}

.img-mask-loose {
  background: url(https://alexandrevacassin.fr/codepen/puzzle/fond-loose.jpg)
    no-repeat center center fixed;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
  width: 100vw;
  height: 100vh;
  position: fixed;
  pointer-events: none;
  z-index: 0;
}

body {
  font-family: "Source Code Pro", monospace;
  color: #fff;
  background-color: rgba(0, 0, 0, 0.5);
  height: 100vh;
}

.magic-word {
  vertical-align: middle;
  border-style: none;
  margin-left: auto;
  margin-right: auto;
  display: none;
  margin-top: 10%;
}

#canvas {
  display: none;
}

#timer {
  font-size: 3rem;
  font-family: "Source Code Pro", monospace;
  text-align: center;
  color: red;
  text-shadow: 0 0 5px red, 0 0 10px red;
}

#question1 {
}

h1 {
  font-size: 1.5rem;
}

.title {
  text-align: center;
  font-size: 2.3em;
  width: 75%;
}

.usedLetters {
  right: 0;
  display: none;
}

.usedLetter {
  display: none;
  width: 50px;
  height: 50px;
  margin-bottom: 10px;
  margin-right: 10px;
  padding: 2px 2px;
  font-size: 30px;
  color: #fff;
  text-align: center;
  background: red;
  border-radius: 50px;
}

.letters {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  border-radius: 24px;
  padding: 30px;
  background: rgba(0, 0, 0, 0.5);
  width: 100%;
  max-width: 560px;
}

.hint {
  text-align: center;
}

.letter {
  padding: 5px;
  margin-bottom: 10px;
  margin-right: 10px;
  text-align: center;
  background: rgb(45, 45, 45);
  width: 40px;
  height: 40px;
  font-size: 20px;
  cursor: pointer;
  border-radius: 10px;
  color: white;
  font-family: "Roboto", sans-serif;
  text-transform: uppercase;
}

.letter:hover {
  background: rgb(75, 75, 75);
}

.board {
  width: 100%;
  height: 20vh;
  display: flex;
  flex-direction: column;
  justify-content: space-evenly;
  align-items: center;
}

.secretWord {
  margin-top: 24px;
  margin-bottom: 24px;
}

.password {
  margin-top: 50px;
}

.char {
  font-size: 2rem;
}

.finishText {
  font-size: 1.3em;
  text-align: center;
  margin-bottom: 24px;
  width: 100%;
}

#start {
  height: 100vh;
}

.restartBtn {
  border: 2px solid #6cacc5;
  background: rgba(42, 50, 113, 0.28);
  padding: 2% 2%;
  width: 300px;
  text-align: center;
  position: absolute;
  margin: 0 auto;
  margin-top: 0px;
  left: 0;
  right: 0;
  cursor: pointer;
  font-size: 2em;
  margin-top: 300px;
}

.restartBtn:hover {
  background: rgba(42, 50, 113, 0.5);
}

.intro {
  position: fixed;
  background: rgba(0, 0, 0, 1);
  height: 100vh;
  width: 100vw;
  z-index: 1;
}

.questionsContainer {
  position: fixed;
  height: 100vh;
  width: 100vw;
}

/* merge with above css */
.video-darken {
  position: fixed;
  background: rgba(0, 0, 0, 0.6);
  height: 100vh;
  width: 100vw;
}

iframe {
  position: absolute;
  left: 0;
  top: 0;
  width: 100vw;
  height: 100vh;
}

.console-container {
  width: 75%;
  display: block;
  margin-left: auto;
  margin-right: auto;
  font-size: 16px;
  text-align: center;
  margin-top: 24px;
  margin-bottom: 32px;
}

.btn-default {
  background: white;
  border: none;
  cursor: pointer;
  color: #000 !important;
  font-weight: 500;
  transition: 0.3s;
  text-transform: uppercase;
  font-size: 1.3em;
  overflow: hidden;
  outline: none;
}

#fiveSec {
  position: absolute;
  display: block;
  margin-left: auto;
  margin-right: auto;
  font-size: 2em;
  margin-top: -20px;
  color: red;
}

.correct-quote {
  color: black;
  width: 100%;
  text-align: center;
  margin-bottom: 24px;
}

@media (min-width: 1200px) {
  .container {
    max-width: 100vw;
  }
}
var initial = 60000; // Initial time in milliseconds (1 minute)
var count = initial;
var counter;
var initialMillis;

function timer() {
  if (count <= 0) {
    gameOver();
    clearInterval(counter);
    return;
  }

  var current = Date.now();
  count -= current - initialMillis;
  initialMillis = current;
  displayCount(count);
}

function gameOver() {
  var finishText = document.querySelector(".finishText");

  if (!finishText) return;

  finishText.innerHTML = "You lose";
  $("#question1").hide();
  $(".magic-word").show();

  gameFinish.style.display = "flex";
  $(".board, #timer, .letters").hide();
  $(".img-mask-loose").show();

  // Show the correct quote
  var correctQuoteElement = document.querySelector(".correct-quote");
  if (correctQuoteElement) {
    correctQuoteElement.innerHTML = `The correct quote was: "${randomQuote}"`;
    correctQuoteElement.style.display = "block";
  }
}

function displayCount(count) {
  var res = count / 1000;
  document.getElementById("timer").innerHTML = res.toFixed(2);
}

$("#startBtn, #restartBtn").on("click", function () {
  clearInterval(counter);
  initialMillis = Date.now();
  counter = setInterval(timer, 1);
  $(".intro").hide();
  startGame();
});

$("#stop").on("click", function () {
  clearInterval(counter);
});

$("#reset").on("click", function () {
  clearInterval(counter);
  count = initial;
  displayCount(count);
  initialMillis = Date.now();
  counter = setInterval(timer, 1);
});

displayCount(initial);

// Quotes with corresponding films
var quotesAndFilms = [
  { quote: "May the Force be with you", film: "Star Wars" },
  { quote: "Stupid is as stupid does", film: "Forrest Gump" },
  {
    quote: "The first rule of Fight Club is you do not talk about Fight Club",
    film: "Fight Club"
  },
  { quote: "I love the smell of Napalm in the morning", film: "Apocalypse Now" },
  { quote: "Hasta la vista baby", film: "Terminator 2: Judgment Day" },
  { quote: "To infinity and beyond", film: "Toy Story" },
  {
    quote: "Keep your friends close but your enemies closer",
    film: "The Godfather Part II"
  },
  { quote: "I drink your milkshake", film: "There Will Be Blood" },
  { quote: "Say hello to my little friend", film: "Scarface" },
  {
    quote: "I ate his liver with some fava beans and a nice Chianti",
    film: "The Silence of the Lambs"
  },
  { quote: "My Precious", film: "The Lord of the Rings: The Two Towers" },
  {
    quote: "Even the smallest person can change the course of the future",
    film: "The Lord of the Rings: The Fellowship of the Ring"
  },
  { quote: "They call it Royale with Cheese", film: "Pulp Fiction" }
];

// Alphabet & letters
var alphabet = "qwertyuiopasdfghjklzxcvbnm";
var letters = document.querySelector(".letters");
var usedLetters = [];
var displayUsedLetters = document.querySelector(".usedLetters");

// Word
var secretWord = document.querySelector(".secretWord");
let randomQuote;
let randomFilm;
let wordLength;

// Progress
let correctGuesses;
let incorrectGuesses;
var gameFinish = document.querySelector(".gameFinish");

function getRandomQuote() {
  var randomIndex = Math.floor(Math.random() * quotesAndFilms.length);
  randomQuote = quotesAndFilms[randomIndex].quote;
  randomFilm = quotesAndFilms[randomIndex].film;
  document.querySelector(
    ".hint"
  ).innerHTML = `Enter the Password - Hint: ${randomFilm}`;
  hideWord(randomQuote);
}

function startGame() {
  // Reset variables
  correctGuesses = 0;
  incorrectGuesses = 0;
  usedLetters = [];
  wordLength = 0;
  count = initial; // Reset timer

  // Reset HTML Content
  gameFinish.style.display = "none";
  secretWord.innerHTML = "";
  letters.innerHTML = "";
  displayUsedLetters.innerHTML = "";
  displayCount(count); // Reset displayed count

  // Create letter divs with alphabet
  for (var i = 0; i < alphabet.length; i++) {
    let letterDiv = document.createElement("div");
    letterDiv.className = "letter";
    letterDiv.innerHTML = alphabet[i];
    letters.append(letterDiv);
  }
  getRandomQuote();

  // Show necessary elements
  $("#timer, .letters").show();
  $(".img-mask-win, .img-mask-loose").hide();
  $(".correct-quote").hide(); // Hide the correct quote element when starting a new game
}

function hideWord(randomQuote) {
  for (var i = 0; i < randomQuote.length; i++) {
    let char = document.createElement("span");
    char.className = "char";
    char.innerHTML = randomQuote[i] === " " ? " " : "_";
    if (randomQuote[i] !== " ") wordLength++;
    secretWord.append(char);
  }
}

function checkChar(char) {
  if (usedLetters.includes(char.toLowerCase())) {
    console.log("You already used this letter");
    return;
  }

  usedLetters.push(char.toLowerCase());
  var usedLetter = document.createElement("div");
  usedLetter.className = "usedLetter";
  usedLetter.innerHTML = char;
  displayUsedLetters.append(usedLetter);

  if (!randomQuote.toLowerCase().includes(char.toLowerCase())) {
    incorrectGuesses++;
    drawPenalty();
    checkWin();
  } else {
    for (var i = 0; i < randomQuote.length; i++) {
      if (randomQuote[i].toLowerCase() === char.toLowerCase()) {
        correctGuesses++;
        checkWin();
        document.querySelectorAll(".char")[i].innerHTML = randomQuote[i];
      }
    }
  }
}

function checkWin() {
  var finishText = document.querySelector(".finishText");
  if (correctGuesses === wordLength) {
    finishText.innerHTML = "Congratulations! Your computer is safe.";
    gameFinish.style.display = "flex";
    $("#timer, .letters").hide();
    $(".magic-word").hide();
    $(".img-mask-win").show();
    $("#question1").hide();
    clearInterval(counter);
  }
}

function drawPenalty() {
  const penaltyTime = 5000;

  count -= penaltyTime;
  initialMillis = Date.now();
  counter = setInterval(timer, 1);
  $("#fiveSec").fadeIn().delay(100).fadeOut();
}

$(letters).on("click", function (e) {
  if (alphabet.includes(e.target.innerHTML)) {
    checkChar(e.target.innerHTML);
    e.target.style.opacity = "0.3";
  }
});

$(document).ready(function () {
  $(".letter").on("click", function () {
    $(this).css("opacity", "0.3");
  });
  $("#startBtn, #restartBtn").on("click", function () {
    $(".intro").hide();
    $("#question1").show();
  });
  $(".img-mask-win, .img-mask-loose, #fiveSec").hide();
});

startGame();

External CSS

  1. https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css
  2. https://fonts.googleapis.com/css2?family=Source+Code+Pro&amp;display=swap
  3. https://fonts.googleapis.com/css2?family=Roboto&amp;display=swap

External JavaScript

  1. https://code.jquery.com/jquery-3.7.1.min.js