diff --git a/script.js b/script.js
index bbe8a293..ed5c0bde 100644
--- a/script.js
+++ b/script.js
@@ -1,4 +1,213 @@
+var makeDeck = function () {
+ var deck = [];
+
+ var suits = ["hearts", "diamonds", "clubs", "spades"];
+
+ var suitIndex = 0;
+ while (suitIndex < suits.length) {
+ var currentSuit = suits[suitIndex];
+
+ var counter = 1;
+ while (counter <= 13) {
+ var rankCounter = counter;
+ var cardName = rankCounter;
+
+ if (cardName == 1) {
+ cardName = "ace";
+ } else if (cardName == 11) {
+ rankCounter = 10;
+ cardName = "jack";
+ } else if (cardName == 12) {
+ rankCounter = 10;
+ cardName = "queen";
+ } else if (cardName == 13) {
+ rankCounter = 10;
+ cardName = "king";
+ }
+
+ var card = {
+ name: cardName,
+ suit: currentSuit,
+ rank: rankCounter,
+ };
+
+ deck.push(card);
+
+ counter = counter + 1;
+ }
+ suitIndex = suitIndex + 1;
+ }
+
+ return deck;
+};
+
+var getRandomIndex = function (size) {
+ return Math.floor(Math.random() * size);
+};
+
+var shuffleCards = 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;
+};
+
+var deck = shuffleCards(makeDeck());
+
+var TWENTY_ONE = 21;
+var dealerHitThreshold = 16;
+var playerHasChosenToStand = false;
+var gameOver = false;
+
+var playerHand = [];
+var computerHand = [];
+
+var dealCardToHand = function (hand) {
+ hand.push(deck.pop());
+};
+
+var getHandSum = function (hand) {
+ var numAcesInHand = 0;
+ var sum = 0;
+ var counter = 0;
+ while (counter < hand.length) {
+ var currCard = hand[counter];
+ if (currCard.rank === 1) {
+ numAcesInHand += 1;
+ sum += 11;
+ } else {
+ sum += currCard.rank;
+ }
+
+ counter = counter + 1;
+ }
+ if (sum > TWENTY_ONE && numAcesInHand > 0) {
+ var aceCounter = 0;
+ while (aceCounter < numAcesInHand) {
+ sum -= 10;
+ if (sum <= TWENTY_ONE) {
+ break;
+ }
+ aceCounter = aceCounter + 1;
+ }
+ }
+ return sum;
+};
+
+//
+var isBlackjack = function (hand) {
+ return hand.length === 2 && getHandSum(hand) === TWENTY_ONE;
+};
+
+var convertHandToString = function (hand) {
+ var cards = "";
+ var handIndex = 0;
+
+ while (handIndex < hand.length) {
+ cards = cards + "," + hand[handIndex].name;
+ handIndex = handIndex + 1;
+ }
+
+ return cards;
+};
+
+var getDefaultOutput = function () {
+ return `Player has: ${convertHandToString(playerHand)} with sum ${getHandSum(
+ playerHand
+ )}.
+ Computer has: ${convertHandToString(computerHand)} with sum ${getHandSum(
+ computerHand
+ )}.`;
+};
+
var main = function (input) {
- var myOutputValue = 'hello world';
- return myOutputValue;
+ if (gameOver) {
+ return "The game is over. Please refresh to play again.";
+ }
+
+ if (playerHand.length === 0) {
+ dealCardToHand(playerHand);
+ dealCardToHand(computerHand);
+
+ dealCardToHand(playerHand);
+ dealCardToHand(computerHand);
+
+ if (isBlackjack(computerHand)) {
+ gameOver = true;
+ return `${getDefaultOutput()}
+ Computer has Blackjack and wins. Please refresh to play again.`;
+ }
+
+ if (isBlackjack(playerHand)) {
+ gameOver = true;
+
+ return `${getDefaultOutput()}
+ Player has Blackjack and wins. Please refresh to play again.`;
+ }
+
+ return `${getDefaultOutput()}
+ Please enter "hit" or "stand", then press Submit`;
+ }
+
+ if (!playerHasChosenToStand) {
+ if (input !== "hit" && input !== "stand") {
+ return 'Please input either "hit" or "stand" as possible moves in Blackjack';
+ }
+
+ if (input === "hit") {
+ dealCardToHand(playerHand);
+
+ if (getHandSum(playerHand) > TWENTY_ONE) {
+ gameOver = true;
+ return `${getDefaultOutput()}
+ Player has busted and loses. Please refresh to play again.`;
+ }
+ }
+
+ if (input === "stand") {
+ playerHasChosenToStand = true;
+ }
+ }
+
+ var computerHandSum = getHandSum(computerHand);
+ if (computerHandSum <= dealerHitThreshold) {
+ dealCardToHand(computerHand);
+
+ computerHandSum = getHandSum(computerHand);
+
+ if (computerHandSum > TWENTY_ONE) {
+ gameOver = true;
+ return `${getDefaultOutput()}
+ Computer has busted and loses. Please refresh to play again.`;
+ }
+ }
+
+ if (playerHasChosenToStand && computerHandSum > dealerHitThreshold) {
+ gameOver = true;
+
+ if (getHandSum(playerHand) > computerHandSum) {
+ return `${getDefaultOutput()}
+ Player wins! Please refresh to play again.`;
+ }
+
+ return `${getDefaultOutput()}
+ Computer wins! Please refresh to play again.`;
+ }
+
+ return `${getDefaultOutput()}
+ playerHasChosenToStand is ${playerHasChosenToStand}
+ If player has not yet chosen to stand, please enter "hit" or "stand".
+ Else, press Submit to see Computer's next move.`;
};