diff --git a/script.js b/script.js
index bbe8a293..91df66fa 100644
--- a/script.js
+++ b/script.js
@@ -1,4 +1,349 @@
+// Blackjack Base Game Walkthrough
+// 1. playable game with minimum functions: creating deck, shuffling, dealing cards, evaluating winner
+// 2. ability for the player to hit or stand
+// 3. ability for the dealer to hit or stand
+// 4. variable value of Ace - either '1' or '11'.
+
+// ===== ===== Pseudocode for Version 1 ===== ===== //
+// 1. define player and dealer
+// 2. create and shuffle a game deck
+// 3. draw 2 cards for player and dealer respectively
+// 4. win conditions
+// -- blackjack
+// -- higher hand value
+// 5. display hands of both player and dealer and declare winner
+
+// ==== ==== Pseudocode for Version 2 ==== ==== //
+// 1. extra game mode "hit or stand"
+// 2. functionality for user to input hit or stand.
+
+// ===== ===== Pseudocode for Version 3 ===== ===== //
+// 1. Dear to hit or stand ONLY AFTER player choose to stand
+// 2. if dealer hand value is less than 17, dealer hits
+// 3. if dealer hand value is more than 17, dealer stands
+
+// ===== ===== Pseudocode for Version 4 ===== ===== //
+// if totalHandValue, including an ace, is less than 21, ace value is 11
+// when totalHandValue, including an ace, is more than 21, ace value is reduced to 1.
+
+/* ================================================== */
+/* =========== GLOBAL VARIABLES ======================= */
+/* ================================================== */
+
+// Declare game modes
+var GAME_START = "game start";
+var GAME_CARDS_DRAWN = "cards drawn";
+var GAME_RESULTS_SHOWN = "results shown";
+var GAME_HIT_OR_STAND = "hit or stand";
+var currentGameMode = GAME_START;
+
+// Declare variables to store player and dealer hands
+// We use arrays as each hand will be holding multiple card objects
+var playerHand = [];
+var dealerHand = [];
+
+// Declare variable to hold deck of cards
+var gameDeck = "empty at the start";
+
+/* ================================================== */
+/* =========== DECK CREATION FUNCTIONS ============== */
+/* ================================================== */
+
+// Function that creates a deck of cards, used by createNewDeck function
+var createDeck = function () {
+ // deck array
+ var deck = [];
+ // for 'while loop' to create suits for cards
+ var suits = ["Diamonds", "Clubs", "Hearts", "Spades"];
+ var indexSuits = 0;
+ while (indexSuits < suits.length) {
+ var currSuit = suits[indexSuits];
+ // 13 ranks... ace to king - rank to define "card positions"
+ var indexRanks = 1;
+ while (indexRanks <= 13) {
+ var cardName = indexRanks;
+ // define card value - differentiate from rank: 'ace' = 1 / 11, 'jack' & 'queen' & 'king' = 10
+ if (cardName == 1) {
+ cardName = "ace";
+ // define ace value as 11 all the way. if handValue > 10, -11 to total value
+ // vs. coding a function to redefine the value for ace
+ }
+ if (cardName == 11) {
+ cardName = "jack";
+ }
+ if (cardName == 12) {
+ cardName = "queen";
+ }
+ if (cardName == 13) {
+ cardName = "king";
+ }
+ var card = {
+ name: cardName,
+ suit: currSuit,
+ rank: indexRanks,
+ };
+ deck.push(card);
+ indexRanks = indexRanks + 1;
+ }
+ indexSuits = indexSuits + 1;
+ }
+ return deck;
+};
+
+// Function that generates a random number, used by shuffle deck function
+var getRandomIndex = function (size) {
+ return Math.floor(Math.random() * size);
+};
+
+// Function that shuffles a deck, used by createNewDeck function
+var shuffleDeck = function (cards) {
+ var index = 0;
+ while (index < cards.length) {
+ var randomIndex = getRandomIndex(cards.length);
+ var currentItem = cards[index];
+ var randomItem = cards[randomIndex];
+ cards[index] = randomItem;
+ cards[randomIndex] = currentItem;
+ index = index + 1;
+ }
+ return cards;
+};
+
+// Function that creates and shuffles a deck
+var createNewDeck = function () {
+ var newDeck = createDeck();
+ var shuffledDeck = shuffleDeck(newDeck);
+ return shuffledDeck;
+};
+
+// Function that checks a hand for blackjack
+var checkForBlackjack = function (handArray) {
+ // Check player hand
+ var playerCardOne = handArray[0];
+ var playerCardTwo = handArray[1];
+ var isBlackjack = false;
+
+ // if there is a blackjack, return true
+ // possible scenarios:
+ // 1st card ace, 2nd card 10 or picture cards
+ // 1st card 10 or picture cards, 2nd card, ace
+ if (
+ (playerCardOne.name == "ace" && playerCardTwo.rank >= 10) ||
+ (playerCardOne.rank >= 10 && playerCardTwo.name == "ace")
+ ) {
+ isBlackjack = true;
+ }
+
+ // else return false - don't need statement because variable already set to false
+ return isBlackjack;
+};
+
+/* ================================================== */
+/* =========== GAME FUNCTIONS ======================= */
+/* ================================================== */
+
+// Function that calculates a hand
+var calculateTotalHandValue = function (handArray) {
+ var totalHandValue = 0;
+ var aceCounter = 0;
+
+ // loop through player or dealer hand and add up the values
+ var index = 0;
+ while (index < handArray.length) {
+ var currentCard = handArray[index];
+
+ // for jack, queen, king, value is 10
+ if (
+ currentCard.name == "jack" ||
+ currentCard.name == "queen" ||
+ currentCard.name == "king"
+ ) {
+ totalHandValue = totalHandValue + 10;
+ } else if (currentCard.name == "ace") {
+ totalHandValue = totalHandValue + 11;
+ aceCounter = aceCounter + 1;
+ } else {
+ totalHandValue = totalHandValue + currentCard.rank;
+ }
+ index = index + 1;
+ }
+
+ index = 0;
+ while (index < aceCounter) {
+ if (totalHandValue > 21) {
+ totalHandValue = totalHandValue - 10;
+ }
+ index = index + 1;
+ }
+ return totalHandValue;
+};
+
+// Function that displays the player and dealer hands in a message
+var displayPlayerAndDealers = function (playerHandArray, dealerHandArray) {
+ // Player hand
+ var playerMessage = "Player Hand:
";
+ var index = 0;
+ while (index < playerHandArray.length) {
+ playerMessage =
+ playerMessage +
+ "- " +
+ playerHandArray[index].name +
+ " of " +
+ playerHandArray[index].suit +
+ "
";
+ index = index + 1;
+ }
+
+ // Dealer hand
+ index = 0;
+ var dealerMessage = "Dealer Hand:
";
+ while (index < dealerHandArray.length) {
+ dealerMessage =
+ dealerMessage +
+ "- " +
+ dealerHandArray[index].name +
+ " of " +
+ dealerHandArray[index].suit +
+ "
";
+ index = index + 1;
+ }
+
+ return playerMessage + "
" + dealerMessage;
+};
+
+// Function that displays the total hand values of the player and the dealer in a message
+var displayHandTotalValues = function (playerHandValue, dealerHandValue) {
+ var totalHandValueMessage = "
Player total hand value: " + playerHandValue;
+ return totalHandValueMessage;
+};
+/* ================================================== */
+/* =========== MAIN FUNCTIONS ======================= */
+/* ================================================== */
+
var main = function (input) {
- var myOutputValue = 'hello world';
- return myOutputValue;
+ var outputMessage = "";
+
+ // FIRST CLICK
+ if (currentGameMode == GAME_START) {
+ // Create the game deck
+ gameDeck = createNewDeck();
+
+ // Deal 2 cards to player and dealer respectively
+ playerHand.push(gameDeck.pop());
+ playerHand.push(gameDeck.pop());
+ dealerHand.push(gameDeck.pop());
+ dealerHand.push(gameDeck.pop());
+
+ // check player and dealer cards
+ console.log("player hand ==> ");
+ console.log(playerHand);
+ console.log("dealer hand ==>");
+ console.log(dealerHand);
+
+ // progress the gameMode
+ currentGameMode = GAME_CARDS_DRAWN;
+
+ // write and retrun the appropriate output message
+ outputMessage =
+ 'Everyone has been dealt a card. Click "submit button to evaluate cards!';
+
+ return outputMessage;
+ }
+
+ // SECOND CLICK
+ if (currentGameMode == GAME_CARDS_DRAWN) {
+ // check for blackjack
+ var playerHasBlackjack = checkForBlackjack(playerHand);
+ var dealerHasBlackjack = checkForBlackjack(dealerHand);
+
+ // console.log("Does Player have Black Jack? ==>", playerHasBlackjack);
+ // console.log("Does Dealer have Black Jack? ==>", dealerHasBlackjack);
+
+ // Condition when either player or dealer has black jack
+ if (playerHasBlackjack == true || dealerHasBlackjack == true) {
+ // both player and dealer has blackjack -> tie
+ if (playerHasBlackjack == true && dealerHasBlackjack == true) {
+ outputMessage = "It is a blackjack tie!";
+ }
+ // only player has blackjack -> player wins
+ else if (playerHasBlackjack == true && dealerHasBlackjack == false) {
+ outputMessage = "Player wins by blackjack!";
+ }
+ // only dealer has blackjack -> dealer wins
+ else {
+ outputMessage = "Dealer wins by blackjack";
+ }
+ } else {
+ outputMessage = "There is no blackjack!";
+
+ // change game mode
+ currentGameMode = GAME_HIT_OR_STAND;
+ }
+
+ // appropriate output message
+ return outputMessage;
+ }
+
+ // HIT OR STAND
+ if (currentGameMode == GAME_HIT_OR_STAND) {
+ // Player Hit
+ if (input == "hit") {
+ playerHand.push(gameDeck.pop());
+ outputMessage =
+ displayPlayerAndDealers(playerHand, dealerHand) +
+ '
You drew another card.
Please input "hit" or "stand".';
+ }
+
+ // Player Stand
+ else if (input == "stand") {
+ // calculate the total hand value of both player and dealer
+ var playerHandTotalValue = calculateTotalHandValue(playerHand);
+ var dealerHandTotalValue = calculateTotalHandValue(dealerHand);
+
+ while (dealerHandTotalValue < 17) {
+ dealerHand.push(gameDeck.pop());
+ dealerHandTotalValue = calculateTotalHandValue(dealerHand);
+ }
+
+ // compare total hand value
+ // same value -> tie
+ if (playerHandTotalValue == dealerHandTotalValue) {
+ outputMessage =
+ displayPlayerAndDealers(playerHand, dealerHand) +
+ "It is a tie!" +
+ displayHandTotalValues(playerHandTotalValue, dealerHandTotalValue);
+ }
+ // player higher value -> player wins
+ else if (playerHandTotalValue > dealerHandTotalValue) {
+ outputMessage =
+ displayPlayerAndDealers(playerHand, dealerHand) +
+ "Player wins!" +
+ displayHandTotalValues(playerHandTotalValue, dealerHandTotalValue);
+ }
+
+ // dealer higher value -> dealer wins
+ else {
+ outputMessage =
+ displayPlayerAndDealers(playerHand, dealerHand) +
+ "Dealer wins!" +
+ displayHandTotalValues(playerHandTotalValue, dealerHandTotalValue);
+ }
+ }
+ // Input validation
+ else {
+ outputMessage =
+ 'Wrong input... only "hit" or "stand" are valid.
' +
+ displayPlayerAndDealers(playerHand, dealerHand);
+ }
+
+ return outputMessage;
+ }
};
+
+// calculate the total hand value of both player and dealer
+// compare total hand value
+// same value -> tie
+// player higher value -> player wins
+// dealer higher value -> dealer wins
+// change game mode
+// appropriate output messag