Master Mind

Wasin ALSHAMI

This is a JS puzzle game

Page index

<!DOCTYPE html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>JS Mastermind</title>
  <meta name="description" content="">
  <meta name="viewport" content="width=device-width, user-scalable=no">
  <link rel="stylesheet" href="css/normalize.css">
  <link rel="stylesheet" href="css/main.css">
</head>
<body>
  
  <div class="wrapper">
    <header>
      <h1>mastermind</h1>
      <button id="newGame" class="blue">Restart</button>
    </header>
    <div class="container">
      <div id="guesses">
        <div class="code row">
          <div class="secret socket">"?"</div>
          <div class="secret socket">"?"</div>
          <div class="secret socket">"?"</div>
          <div class="secret socket">"?"</div>
        </div>
        <div class="guess">
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
        </div>
        <div class="guess">
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
        </div>
        <div class="guess">
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
        </div>
        <div class="guess">
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
        </div>
        <div class="guess">
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
        </div>
        <div class="guess">
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
        </div>
        <div class="guess">
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
        </div>
        <div class="guess">
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
          <div class="socket"></div>
        </div>
      </div>

      <div id="hints">
        <div class="hint">
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
        </div>
        <div class="hint">
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
        </div>
        <div class="hint">
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
        </div>
        <div class="hint">
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
        </div>
        <div class="hint">
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
        </div>
        <div class="hint">
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
        </div>
        <div class="hint">
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
        </div>
        <div class="hint">
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
          <div class="row">
            <div class="js-hint-socket socket"></div>
            <div class="js-hint-socket socket"></div>
          </div>
        </div>
      </div>
    </div>

    <div id="options" class="container">
      <button value="1" id="green" class="option green"></button>
      <button value="2" id="purple" class="option purple"></button>
      <button value="3" id="red" class="option red"></button>
      <button value="4" id="yellow" class="option yellow"></button>
      <button value="5" id="blue" class="option blue"></button>
      <button value="6" id="brown" class="option brown"></button>
      <button id="delete" class="">&#8672;</button>
    </div>
  </div>

  <div id="modalOverlay">
    <div id="modalMessage">
      <button class="large">i lost </button>
      <button class="large primary">i never lose</button>
    </div>
  </div>


  <script src="js/main.js"></script>

  <script>
   

  </script>

</body>
</html>

Main Js File

(function () {
  'use strict';

  var code = [], // Color sequence the player needs to guess
      guess = [], // Color sequence of player's guesses
      options = document.getElementsByClassName('option'),
      inputRows = document.getElementsByClassName('guess'),
      hintContainer = document.getElementsByClassName('hint'),
      secretSockets = document.getElementsByClassName('secret socket'),
      modalOverlay = document.getElementById('modalOverlay'),
      modalMessage = document.getElementById('modalMessage'),
      rowIncrement = 1,
      hintIncrement = 1,
      pegs = {
        1: 'green',
        2: 'purple',
        3: 'red',
        4: 'yellow',
        5: 'blue',
        6: 'brown'
      };

  function gameSetup () {
    generateSecretCode(1, 7);

    for (var i = 0; i < options.length; i++)
      options[i].addEventListener('click', insertGuess, false);

    document.getElementById('newGame').onclick = newGame;
    document.getElementById('delete').onclick = deleteLast;
  }

  function insertGuess () {
    var self = this;
    var slots = inputRows[inputRows.length - rowIncrement].getElementsByClassName('socket');

    slots[guess.length].className = slots[guess.length].className + ' peg ' + self.id; 

    guess.push(+(self.value));

    if (guess.length === 4) {
      if (compare())
        gameState('won');
      else
        rowIncrement += 1;
    }

    if ( rowIncrement === inputRows.length + 1 && !compare() )
      gameState('lost');
  }
    
  function compare () {
    var isMatch = true;
    var codeCopy = code.slice(0);

    // circles in right color in the right place
    for (var i = 0; i < code.length; i++) {
      if (guess[i] === code[i]) {
        insertPeg('hit');
        codeCopy[i] = 0;
        guess[i] = -1;
      } else
        isMatch = false;
    }

    // circles in right color but NOT in the right place
    for (var j = 0; j < code.length; j++) {
      if (codeCopy.indexOf(guess[j]) !== -1) {
        insertPeg('almost');
        codeCopy[codeCopy.indexOf(guess[j])] = 0;
      }
    }

    hintIncrement += 1; // Set the next row of hints as available
    guess = [];         // Reset guess s

    return isMatch;
  }

  function insertPeg (type) {
    var sockets = hintContainer[hintContainer.length - hintIncrement].getElementsByClassName('js-hint-socket');
    sockets[0].className = 'socket ' + type;
  }

  function deleteLast () {
    if (guess.length !== 0) {
      var slots = inputRows[inputRows.length - rowIncrement].getElementsByClassName('socket');
      slots[guess.length - 1].className = 'socket'; // Insert node into page
      guess.pop();
    }
  }

  function newGame () {
    guess = [];        // Reset guess array
    clearBoard();
    rowIncrement = 1;  // Set the first row of sockets as available for guesses
    hintIncrement = 1; // Set the first row of sockets as available for hints
    hideModal();
    gameSetup();           // Prepare the game
  }

  function hideModal () {
    modalOverlay.className = '';
  }
// delete the color guessed
  function clearBoard () {
    // Clear the guess sockets
    for (var i = 0; i < inputRows.length; i++) {
      inputRows[i].innerHTML = '';
      for (var j = 0; j < 4; j++) {
        var socket = document.createElement('div');
        socket.className = 'socket';
        inputRows[i].appendChild(socket);
      }
    }

    // Clear the hint sockets
    for (var i = 0; i < hintContainer.length; i++) {
      var socketCollection = hintContainer[i].getElementsByClassName('socket');
      for (var j = 0; j < 4; j++) {
        socketCollection[j].className = 'js-hint-socket socket';
      }
    }

    // Reset secret code sockets
    for (var i = 0; i < secretSockets.length; i++) {
      secretSockets[i].className = 'secret socket';
      secretSockets[i].innerHTML = '?';
    }

    document.getElementsByTagName('body')[0].className = ''; // Reset background
  }

  // Creates a color code the 
  function generateSecretCode (min, max) {
    for (var i = 0; i < 4; i++)
      code[i] = Math.floor(Math.random() * (max - min)) + min;
  }

  // 0 more guesses or cracked the code - the code is shown
  function revealCode () {
    for (var i = 0; i < secretSockets.length; i++) {
      secretSockets[i].className += ' ' + pegs[code[i]];
      secretSockets[i].innerHTML = ''; // Remove "?" from the socket
    }
  }

  function gameOver () {
    // Disable color options
    for (var i = 0; i < options.length; i++)
      options[i].removeEventListener('click', insertGuess, false);

    revealCode();
  }
// finishing the game
  function gameState (state) {
    gameOver();
    document.getElementsByTagName('body')[0].className = state;
    modalOverlay.className = state;
// if i win or lose 
    if (state === 'won') {
      modalMessage.innerHTML = '<h2>You cracked the code!</h2> <p>Great! You are awesome! You should feel good now...</p> <button class="large" id="hideModal">im the best</button> <button id="restartGame" class="large primary">lits win again</button>';
      document.getElementById('restartGame').onclick = newGame;
      document.getElementById('hideModal').onclick = hideModal;
    } else
      modalMessage.innerHTML = '<h2>You failed...</h2> <p>What a shame... Look on the bright side - you weren\'t even close.</p> <button class="large" id="hideModal">i lost -_-</button> <button id="restartGame" class="large primary">i never lose</button>';
      document.getElementById('restartGame').onclick = newGame;
      document.getElementById('hideModal').onclick = hideModal;
  }

  gameSetup(); // Run the game
}());