From 0572ce03c0a15b356332110d917342463d3c2725 Mon Sep 17 00:00:00 2001 From: siegefried Date: Thu, 15 Feb 2024 09:38:53 +0800 Subject: [PATCH 1/7] copied deck creation and shuffle functions, added check for blackjack --- script.js | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/script.js b/script.js index bbe8a293..e52b1727 100644 --- a/script.js +++ b/script.js @@ -1,4 +1,79 @@ +//game modes +const INIT_GAME = `initialize game`; +const EVAL_OPTIONS = `evaluate options after drawing cards`; +const CHECK_RESULTS = `check for any results such as blackjack`; +const HIT_OR_STAND = `players decide to hit or stand`; +let mode = INIT_GAME; + +//global variables +const playerHand = []; +const dealerHand = []; +const gameDeck = []; + +//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); + return shuffledDeck; +} + +//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) + ) { + isBlackJack = true; + } + return isBlackJack; +} + var main = function (input) { - var myOutputValue = 'hello world'; + var myOutputValue = "hello world"; return myOutputValue; }; From 606aafd2d3df4726e21079ab7936097046d2bd83 Mon Sep 17 00:00:00 2001 From: siegefried Date: Thu, 15 Feb 2024 12:54:35 +0800 Subject: [PATCH 2/7] added black jack logic --- script.js | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/script.js b/script.js index e52b1727..0eaa6157 100644 --- a/script.js +++ b/script.js @@ -55,7 +55,9 @@ function shuffleDeck(cardDeck) { function generateNewDeck() { const newDeck = createDeck(); const shuffledDeck = shuffleDeck(newDeck); - return shuffledDeck; + for (let i = 0; i < shuffledDeck.length; i += 1) { + gameDeck.push(shuffledDeck[i]); + } } //game functions @@ -65,8 +67,8 @@ function checkForBlackJack(hand) { const playerCardOne = hand[0]; const playerCardTwo = hand[1]; if ( - (playerCardOne.name = `Ace` && playerCardTwo.rank >= 10) || - (playerCardTwo.name = `Ace` && playerCardOne.rank >= 10) + (playerCardOne.name == `Ace` && playerCardTwo.rank >= 10) || + (playerCardTwo.name == `Ace` && playerCardOne.rank >= 10) ) { isBlackJack = true; } @@ -74,6 +76,30 @@ function checkForBlackJack(hand) { } 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); + if (playerBlackJack || dealerBlackJack) { + if (playerBlackJack && dealerBlackJack) { + return `Both players got a black jack ✌. It's a tie!`; + } + if (playerBlackJack && !dealerBlackJack) { + return `Player wins by black jack! πŸ†`; + } + if (!playerBlackJack && dealerBlackJack) { + return `Dealer wins by black jack! πŸ†`; + } + } + return `No one scored a black jack.`; + } }; From 5edd06e36492d09dfc43b6796d6bbb07f44c89b3 Mon Sep 17 00:00:00 2001 From: siegefried Date: Thu, 15 Feb 2024 13:22:15 +0800 Subject: [PATCH 3/7] added display of cards drawn --- script.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/script.js b/script.js index 0eaa6157..d249e5e3 100644 --- a/script.js +++ b/script.js @@ -75,6 +75,18 @@ function checkForBlackJack(hand) { return isBlackJack; } +function displayHands(playerHand, dealerHand) { + let playerHandMsg = `Player Hand:
`; + for (let i = 0; i < playerHand.length; i += 1) { + playerHandMsg += `- ${playerHand[i].name} of ${playerHand[i].suit}
`; + } + let dealerHandMsg = `Dealer Hand:
`; + for (let i = 0; i < dealerHand.length; i += 1) { + dealerHandMsg += `- ${dealerHand[i].name} of ${dealerHand[i].suit}
`; + } + return `${playerHandMsg}
${dealerHandMsg}`; +} + var main = function (input) { if (mode == INIT_GAME) { generateNewDeck(); @@ -89,17 +101,18 @@ var main = function (input) { if (mode == EVAL_OPTIONS) { const playerBlackJack = checkForBlackJack(playerHand); const dealerBlackJack = checkForBlackJack(dealerHand); + const cardsDrawn = displayHands(playerHand, dealerHand); if (playerBlackJack || dealerBlackJack) { if (playerBlackJack && dealerBlackJack) { - return `Both players got a black jack ✌. It's a tie!`; + return `${cardsDrawn}
Both players got a black jack ✌. It's a tie!`; } if (playerBlackJack && !dealerBlackJack) { - return `Player wins by black jack! πŸ†`; + return `${cardsDrawn}
Player wins by black jack! πŸ†`; } if (!playerBlackJack && dealerBlackJack) { - return `Dealer wins by black jack! πŸ†`; + return `${cardsDrawn}
Dealer wins by black jack! πŸ†`; } } - return `No one scored a black jack.`; + return `${cardsDrawn}
No one scored a black jack.`; } }; From 2af635d33882605a93a16c2e2a4eced2945b1c31 Mon Sep 17 00:00:00 2001 From: siegefried Date: Thu, 15 Feb 2024 16:41:08 +0800 Subject: [PATCH 4/7] single instance of game completed --- index.html | 120 +++++++++++++++++++++++++++++++++++++---------------- script.js | 90 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 170 insertions(+), 40 deletions(-) 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 d249e5e3..e12dae8b 100644 --- a/script.js +++ b/script.js @@ -1,8 +1,8 @@ //game modes const INIT_GAME = `initialize game`; const EVAL_OPTIONS = `evaluate options after drawing cards`; -const CHECK_RESULTS = `check for any results such as blackjack`; const HIT_OR_STAND = `players decide to hit or stand`; + let mode = INIT_GAME; //global variables @@ -60,6 +60,21 @@ function generateNewDeck() { } } +function printSuitsIcon(suit) { + if (suit == `Hearts`) { + return `❀`; + } + if (suit == `Diamonds`) { + return `πŸ”·`; + } + if (suit == `Clubs`) { + return `♣`; + } + if (suit == `Spades`) { + return `β™ `; + } +} + //game functions function checkForBlackJack(hand) { @@ -78,15 +93,44 @@ function checkForBlackJack(hand) { function displayHands(playerHand, dealerHand) { let playerHandMsg = `Player Hand:
`; for (let i = 0; i < playerHand.length; i += 1) { - playerHandMsg += `- ${playerHand[i].name} of ${playerHand[i].suit}
`; + 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 ${dealerHand[i].suit}
`; + dealerHandMsg += `- ${dealerHand[i].name} of ${printSuitsIcon( + dealerHand[i].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) { if (mode == INIT_GAME) { generateNewDeck(); @@ -113,6 +157,44 @@ var main = function (input) { return `${cardsDrawn}
Dealer wins by black jack! πŸ†`; } } - return `${cardsDrawn}
No one scored a 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); + return `Player has drawn another card. Press h to Hit or s to Stand.

${cardsDrawn}`; + } else if (input == `s`) { + 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}`; + const cardsDrawn = displayHands(playerHand, dealerHand); + + //draw scenario + if ( + playerHandTotal == dealerHandTotal || + (playerHandTotal > 21 && dealerHandTotal > 21) + ) { + return `${cardsDrawn}
It's a tie!
${cardValuesMsg}`; + } + //loss scenario + if ( + (playerHandTotal < dealerHandTotal && dealerHandTotal <= 21) || + (playerHandTotal > 21 && dealerHandTotal <= 21) + ) { + return `${cardsDrawn}
Dealer wins! πŸ’ΈπŸ’ΈπŸ’Έ
${cardValuesMsg}`; + } + //win scenario + 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}`; + } } }; From d17635b0701cc4f60502d96d2d6890cd0f87d6a4 Mon Sep 17 00:00:00 2001 From: siegefried Date: Mon, 19 Feb 2024 17:57:45 +0800 Subject: [PATCH 5/7] added hidden card and game reset --- script.js | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/script.js b/script.js index e12dae8b..9fc91057 100644 --- a/script.js +++ b/script.js @@ -2,13 +2,14 @@ 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; //deck functions @@ -62,16 +63,16 @@ function generateNewDeck() { function printSuitsIcon(suit) { if (suit == `Hearts`) { - return `❀`; + return `β™₯️`; } if (suit == `Diamonds`) { - return `πŸ”·`; + return `♦️`; } if (suit == `Clubs`) { - return `♣`; + return `♣️`; } if (suit == `Spades`) { - return `β™ `; + return `♠️`; } } @@ -85,6 +86,7 @@ function checkForBlackJack(hand) { (playerCardOne.name == `Ace` && playerCardTwo.rank >= 10) || (playerCardTwo.name == `Ace` && playerCardOne.rank >= 10) ) { + endGameState = true; isBlackJack = true; } return isBlackJack; @@ -103,6 +105,13 @@ function displayHands(playerHand, dealerHand) { dealerHand[i].suit )}
`; } + + if (endGameState == false) { + dealerHandMsg = `Player Hand:
(hidden card)
${ + dealerHand[1].name + } of ${printSuitsIcon(dealerHand[1].suit)}
`; + } + return `${playerHandMsg}
${dealerHandMsg}`; } @@ -174,6 +183,7 @@ var main = function (input) { dealerHandTotal = calcHandTotal(dealerHand); } const cardValuesMsg = `
Player's hand value: ${playerHandTotal}
Dealer's hand value: ${dealerHandTotal}`; + endGameState = true; const cardsDrawn = displayHands(playerHand, dealerHand); //draw scenario @@ -181,6 +191,7 @@ var main = function (input) { playerHandTotal == dealerHandTotal || (playerHandTotal > 21 && dealerHandTotal > 21) ) { + mode = RESET_GAME; return `${cardsDrawn}
It's a tie!
${cardValuesMsg}`; } //loss scenario @@ -188,13 +199,24 @@ var main = function (input) { (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; + mode = INIT_GAME; + return `Please press submit to start a new round of black jack.`; + } }; From e202d7270bdd9b27051e2a51031ef1c5feffd3fa Mon Sep 17 00:00:00 2001 From: siegefried Date: Mon, 19 Feb 2024 19:28:11 +0800 Subject: [PATCH 6/7] check for player bust --- script.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/script.js b/script.js index 9fc91057..05602da3 100644 --- a/script.js +++ b/script.js @@ -10,6 +10,7 @@ const playerHand = []; const dealerHand = []; const gameDeck = []; let endGameState = false; +let didPlayerBust = false; //deck functions @@ -174,8 +175,13 @@ var main = function (input) { 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`) { + } else if (input == `s` || didPlayerBust == true) { const playerHandTotal = calcHandTotal(playerHand); let dealerHandTotal = calcHandTotal(dealerHand); while (dealerHandTotal < 17) { @@ -216,6 +222,7 @@ var main = function (input) { 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.`; } From 37e500c78c469a7e6e3c20930e9c72a92552205a Mon Sep 17 00:00:00 2001 From: siegefried Date: Mon, 19 Feb 2024 20:26:16 +0800 Subject: [PATCH 7/7] fixed text error --- script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script.js b/script.js index 05602da3..51061e60 100644 --- a/script.js +++ b/script.js @@ -108,7 +108,7 @@ function displayHands(playerHand, dealerHand) { } if (endGameState == false) { - dealerHandMsg = `Player Hand:
(hidden card)
${ + dealerHandMsg = `Dealer Hand:
(hidden card)
${ dealerHand[1].name } of ${printSuitsIcon(dealerHand[1].suit)}
`; }