diff --git a/index.html b/index.html index bbc7dffd..dae83ae6 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,3 @@ - @@ -8,41 +7,83 @@ - - - - - - - - - - + + + + + + + + + + Blackjack - Basics - Rocket Academy - - + + - - - - - + + + + + - - - - - - - + + + + + + + - + -

- + Rocket Academy - +

♣️ Basics - Blackjack ♠️

@@ -131,7 +177,9 @@

♣️ Basics - Blackjack ♠️


Output:

-
+
+ Welcome to Josh's Cards! Click the submit button to get started! +
diff --git a/script.js b/script.js index bbe8a293..51061e60 100644 --- a/script.js +++ b/script.js @@ -1,4 +1,229 @@ +//game modes +const INIT_GAME = `initialize game`; +const EVAL_OPTIONS = `evaluate options after drawing cards`; +const HIT_OR_STAND = `players decide to hit or stand`; +const RESET_GAME = `reset game`; +let mode = INIT_GAME; + +//global variables +const playerHand = []; +const dealerHand = []; +const gameDeck = []; +let endGameState = false; +let didPlayerBust = false; + +//deck functions + +function createDeck() { + const cardDeck = []; + const suits = [`Hearts`, `Diamonds`, `Clubs`, `Spades`]; + for (let suitIndex = 0; suitIndex < suits.length; suitIndex += 1) { + for (let rankCount = 1; rankCount <= 13; rankCount += 1) { + let cardName = rankCount; + if (rankCount == 1) { + cardName = `Ace`; + } else if (rankCount == 11) { + cardName = `Jack`; + } else if (rankCount == 12) { + cardName = `Queen`; + } else if (rankCount == 13) { + cardName = `King`; + } + const card = { + name: cardName, + rank: rankCount, + suit: suits[suitIndex], + }; + cardDeck.push(card); + } + } + return cardDeck; +} + +function getRandomIndex(arrayLength) { + return Math.floor(Math.random() * arrayLength); +} + +function shuffleDeck(cardDeck) { + for (let i = 0; i < cardDeck.length; i += 1) { + const randomIndex = getRandomIndex(cardDeck.length); + const randomCard = cardDeck[i]; + cardDeck[i] = cardDeck[randomIndex]; + cardDeck[randomIndex] = randomCard; + } + return cardDeck; +} + +function generateNewDeck() { + const newDeck = createDeck(); + const shuffledDeck = shuffleDeck(newDeck); + for (let i = 0; i < shuffledDeck.length; i += 1) { + gameDeck.push(shuffledDeck[i]); + } +} + +function printSuitsIcon(suit) { + if (suit == `Hearts`) { + return `β™₯️`; + } + if (suit == `Diamonds`) { + return `♦️`; + } + if (suit == `Clubs`) { + return `♣️`; + } + if (suit == `Spades`) { + return `♠️`; + } +} + +//game functions + +function checkForBlackJack(hand) { + let isBlackJack = false; + const playerCardOne = hand[0]; + const playerCardTwo = hand[1]; + if ( + (playerCardOne.name == `Ace` && playerCardTwo.rank >= 10) || + (playerCardTwo.name == `Ace` && playerCardOne.rank >= 10) + ) { + endGameState = true; + isBlackJack = true; + } + return isBlackJack; +} + +function displayHands(playerHand, dealerHand) { + let playerHandMsg = `Player Hand:
`; + for (let i = 0; i < playerHand.length; i += 1) { + playerHandMsg += `- ${playerHand[i].name} of ${printSuitsIcon( + playerHand[i].suit + )}
`; + } + let dealerHandMsg = `Dealer Hand:
`; + for (let i = 0; i < dealerHand.length; i += 1) { + dealerHandMsg += `- ${dealerHand[i].name} of ${printSuitsIcon( + dealerHand[i].suit + )}
`; + } + + if (endGameState == false) { + dealerHandMsg = `Dealer Hand:
(hidden card)
${ + dealerHand[1].name + } of ${printSuitsIcon(dealerHand[1].suit)}
`; + } + + return `${playerHandMsg}
${dealerHandMsg}`; +} + +function calcHandTotal(hand) { + let handTotal = 0; + let aceCount = 0; + for (let i = 0; i < hand.length; i += 1) { + const pulledCard = hand[i]; + if ( + pulledCard.name == `Jack` || + pulledCard.name == `Queen` || + pulledCard.name == `King` + ) { + handTotal += 10; + } else if (pulledCard.name == `Ace`) { + handTotal += 11; + aceCount += 1; + } else handTotal += pulledCard.rank; + } + + for (let i = 0; i < aceCount; i += 1) { + if (handTotal > 21) { + handTotal -= 10; + } + } + return handTotal; +} + var main = function (input) { - var myOutputValue = 'hello world'; - return myOutputValue; + if (mode == INIT_GAME) { + generateNewDeck(); + playerHand.push(gameDeck.pop()); + playerHand.push(gameDeck.pop()); + dealerHand.push(gameDeck.pop()); + dealerHand.push(gameDeck.pop()); + mode = EVAL_OPTIONS; + return `Both the player and dealer has been dealt two cards. Click the submit button to evaluate the hands.`; + } + + if (mode == EVAL_OPTIONS) { + const playerBlackJack = checkForBlackJack(playerHand); + const dealerBlackJack = checkForBlackJack(dealerHand); + const cardsDrawn = displayHands(playerHand, dealerHand); + if (playerBlackJack || dealerBlackJack) { + if (playerBlackJack && dealerBlackJack) { + return `${cardsDrawn}
Both players got a black jack ✌. It's a tie!`; + } + if (playerBlackJack && !dealerBlackJack) { + return `${cardsDrawn}
Player wins by black jack! πŸ†`; + } + if (!playerBlackJack && dealerBlackJack) { + return `${cardsDrawn}
Dealer wins by black jack! πŸ†`; + } + } + mode = HIT_OR_STAND; + return `${cardsDrawn}
No one scored a black jack. Please input h for Hit and s for Stand`; + } + + if (mode == HIT_OR_STAND) { + if (input == `h`) { + playerHand.push(gameDeck.pop()); + const cardsDrawn = displayHands(playerHand, dealerHand); + const checkPlayerValue = calcHandTotal(playerHand); + if (checkPlayerValue > 21) { + didPlayerBust = true; + return `Player's hand has exceeded 21. Time for the reckoning!`; + } + return `Player has drawn another card. Press h to Hit or s to Stand.

${cardsDrawn}`; + } else if (input == `s` || didPlayerBust == true) { + const playerHandTotal = calcHandTotal(playerHand); + let dealerHandTotal = calcHandTotal(dealerHand); + while (dealerHandTotal < 17) { + dealerHand.push(gameDeck.pop()); + dealerHandTotal = calcHandTotal(dealerHand); + } + const cardValuesMsg = `
Player's hand value: ${playerHandTotal}
Dealer's hand value: ${dealerHandTotal}`; + endGameState = true; + const cardsDrawn = displayHands(playerHand, dealerHand); + + //draw scenario + if ( + playerHandTotal == dealerHandTotal || + (playerHandTotal > 21 && dealerHandTotal > 21) + ) { + mode = RESET_GAME; + return `${cardsDrawn}
It's a tie!
${cardValuesMsg}`; + } + //loss scenario + if ( + (playerHandTotal < dealerHandTotal && dealerHandTotal <= 21) || + (playerHandTotal > 21 && dealerHandTotal <= 21) + ) { + mode = RESET_GAME; + return `${cardsDrawn}
Dealer wins! πŸ’ΈπŸ’ΈπŸ’Έ
${cardValuesMsg}`; + } + //win scenario + mode = RESET_GAME; + return `${cardsDrawn}
Player wins! πŸ€‘πŸ€‘πŸ€‘
${cardValuesMsg}`; + } else { + const cardsDrawn = displayHands(playerHand, dealerHand); + return `This is an invalid input. Please input h for Hit or s for Stand.

${cardsDrawn}`; + } + } + + if (mode == RESET_GAME) { + playerHand.length = 0; + dealerHand.length = 0; + gameDeck.length = 0; + endGameState = false; + didPlayerBust = false; + mode = INIT_GAME; + return `Please press submit to start a new round of black jack.`; + } };