text: console.log('JavaScript Beginner Projects: Rock Paper Scissors Lizard Spock!');
  
  window.addEventListener('DOMContentLoaded', () => {
    _Setup();
  });
  
  // The general idea here is that these represent all the possible ways to
  // win for a given choice. So, for example, if you were to lookup "scissors",
  // you can see that it cuts paper and decapitates lizard.
  const _SHAPES = {
    scissors: {paper: 'cuts', lizard: 'decapitates'},
    paper: {rock: 'covers', spock: 'disproves'},
    rock: {lizard: 'crushes', scissors: 'crushes'},
    lizard: {spock: 'poisons', paper: 'eats'},
    spock: {scissors: 'smashes', rock: 'vaporizes'},
  };
  
  let _AIChoice = null;
  let _PlayerChoice = null;
  let _Score = [0, 0];
  
  
  // This sets up the choices by creating elements programmatically, and then
  // assigning the images to them and setting the onclick handler to handle
  // player choices.
  function _Setup() {
    for (const k in _SHAPES) {
      const div1 = document.createElement('div');
      const div2 = document.createElement('div');
      const img = document.createElement('img');
      img.src = k + '.png';
      div1.id = k;
      div1.className = 'base unselected';
      div1.appendChild(img);
      div1.onclick = (e) => {
        _Select(e);
      };
  
      div2.id = 'ai-' + k;
      div2.className = 'base unselected';
      div2.appendChild(div1);
  
      document.getElementById('selection').appendChild(div2);
    }
    _UpdateScore();
  }
  
  function _UpdateScore() {
    document.getElementById('score').innerText = _Score[0] + ':' + _Score[1];
  }
  
  // This is called when a player selects one of the choices, ie. rock, paper, etc...
  function _Select(evt) {
    for (const k in _SHAPES) {
      const node = document.getElementById(k);
      node.className = "base unselected";
    }
    evt.currentTarget.className = "base selected";
  
    _PlayerChoice = evt.currentTarget.id;
  
    _AIChoose(50);
  }
  
  function _AIChoose(delay) {
    for (const k in _SHAPES) {
      const node = document.getElementById(k);
      node.parentNode.className = "base unselected";
    }
  
    const possibleSelections = Object.keys(_SHAPES);
    const roll = Math.floor(Math.random() * possibleSelections.length);
  
    const choice = possibleSelections[roll];
    const node = document.getElementById(choice);
    node.parentNode.className = "base aiSelected";
    _AIChoice = choice;
  
    if (delay < 200) {
      setTimeout(() => {
        _AIChoose(delay + 5);
      }, delay);
    } else {
      _ResolveWinner();
    }
  }
  
  function _ResolveWinner() {
    let desc = '';
    if (_AIChoice == _PlayerChoice) {
      desc = 'Tie game.'
    } else if (_AIChoice in _SHAPES[_PlayerChoice]) {
      desc = 'Player Wins: ';
      desc += (_PlayerChoice + ' ' + _SHAPES[_PlayerChoice][_AIChoice] +
          ' ' + _AIChoice + '.');
      _Score[0] += 1;
    } else {
      desc = 'AI Wins: ';
      desc += (_AIChoice + ' ' + _SHAPES[_AIChoice][_PlayerChoice] +
          ' ' + _PlayerChoice + '.');
      _Score[1] += 1;
    }
    document.getElementById('description').innerText = desc;
    _UpdateScore();
  }
  
  
  function _IsWinner(player1, player2) {
    return player2 in _CHOICES[player1];
  }
  