From 694a9cabcc3c1d8db896596847472453a56c7c8f Mon Sep 17 00:00:00 2001
From: Jonathan Vitale <jvitale@une.edu.au>
Date: Thu, 19 Jan 2023 14:17:05 +1100
Subject: [PATCH] Final code for the game

---
 game-logic.js | 96 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 87 insertions(+), 9 deletions(-)

diff --git a/game-logic.js b/game-logic.js
index cf6f720..0ed2949 100644
--- a/game-logic.js
+++ b/game-logic.js
@@ -1,10 +1,82 @@
 const gameState = {
+    deck: null,
     playerWallet: 100,
     currentBet: null,
     cards: [[], []],
     hiddenCard: null
 }
 
+class Card{
+    constructor(face, suit){
+        this.face = face;
+        this.suit = suit;
+        this.visible = true;
+    }
+
+    setCardVisibility(visibility){
+        this.visible = visibility;
+    }
+
+    getValue(){
+        if (this.visible === true){
+            if (!isNaN(Number(this.face))){
+                return Number(this.face);
+            } else if (this.face === 'ace'){
+                return 11;
+            } else {
+                return 10;
+            }
+        } else {
+            return 0;
+        }
+    }
+
+    draw(){
+        if (this.visible){
+            return `<img style="background-color: white; width: 70px;" src="cards/${this.face}_of_${this.suit}.png" />`;
+        } else {
+            return `<img style="background-color: white; width: 70px;" src="cards/back.png" />`
+        }
+    }
+}
+
+class Deck{
+    constructor(){
+        this.buildDeck();
+        this.shuffle();
+    }
+
+    buildDeck(){
+        this.deck = [];
+        let suits = ['hearts', 'clubs', 'spades', 'diamonds'];
+        let faces = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'jack', 'queen', 'king', 'ace'];
+        for (let i = 0; i < suits.length; i++){
+            for (let j = 0; j < faces.length; j++){
+                this.deck.push(new Card(faces[j], suits[i]));
+            }
+        }
+    }
+
+    shuffle(){
+        /* Randomize array in-place using Durstenfeld shuffle algorithm */
+        for (let i = this.deck.length - 1; i > 0; i--) {
+            let j = Math.floor(Math.random() * (i + 1));
+            let temp = this.deck[i];
+            this.deck[i] = this.deck[j];
+            this.deck[j] = temp;
+        }
+    }
+
+    dealCard(){
+        let newCard = this.deck.pop();
+        if (this.deck.length <= 26){
+            this.buildDeck();
+            this.shuffle();
+        }
+        return newCard;
+    }
+}
+
 function collectBet(){
     let currentBet;
     let isValidBet = false;
@@ -32,8 +104,12 @@ function drawCard(){
     return rndNum;
 }
 
-function handValue(cards){
+function handValue(cardsObj){
     let sum = 0;
+    let cards = [];
+    for (let i = 0; i < cardsObj.length; i++){
+        cards.push(cardsObj[i].getValue());
+    }
     if (cards.length > 0) {
         sum = cards.reduce(
             (accumulator, item) => accumulator + item
@@ -58,6 +134,7 @@ function handValue(cards){
 }
 
 function resetGameState(){
+    gameState.deck = new Deck();
     gameState.currentBet = null;
     gameState.cards = [[], []];
     gameState.hiddenCard = null;
@@ -77,7 +154,7 @@ function updateGUI(){
         }
         // set values of player's cards and dealer's cards in each cell
         for (let i = 0; i < gameState.cards[k].length; i++){
-            cells[i].innerHTML = gameState.cards[k][i];
+            cells[i].innerHTML = gameState.cards[k][i].draw();
         }
         let curScore = handValue(gameState.cards[k]);
         let scoreElement = document.getElementById(scoreIds[k]);
@@ -114,11 +191,11 @@ function collectBetAndDealCards(){
     // one is hidden
     for(let playerIndex = 0; playerIndex < gameState.cards.length; playerIndex++){
         for(let cardIndex = 0; cardIndex < 2; cardIndex++){
+            let newCard = gameState.deck.dealCard();
             if (cardIndex === 1 && playerIndex === 1){
-                gameState.hiddenCard = drawCard();
-            } else {
-                gameState.cards[playerIndex][cardIndex] = drawCard();
+                newCard.setCardVisibility(false);
             }
+            gameState.cards[playerIndex][cardIndex] = newCard;
         }
     }
 
@@ -145,7 +222,7 @@ function log(message){
 }
 
 function hit(){
-    let curCard = drawCard();
+    let curCard = gameState.deck.dealCard();
     gameState.cards[0].push(curCard);
     let curPlayerScore = handValue(gameState.cards[0]);
     updateGUI()
@@ -161,8 +238,9 @@ function stay(){
     let buttonHit = document.getElementById('button-hit');
     buttonHit.disabled = true;
 
-    gameState.cards[1].push(gameState.hiddenCard);
-    gameState.hiddenCard = null;
+    for (let i = 0; i < gameState.cards[1].length; i++){
+        gameState.cards[1][i].setCardVisibility(true);
+    }
 
     let curPlayerScore = handValue(gameState.cards[0]);
     let curDealerScore = handValue(gameState.cards[1]);
@@ -174,7 +252,7 @@ function stay(){
     // dealer draws a card
     // --- UNTIL THE DEALER has 17 or more
     while(curDealerScore < 17){
-        let curCard = drawCard();
+        let curCard = gameState.deck.dealCard();
         console.log(`The dealer got a new card with value ${curCard}`);
         gameState.cards[1].push(curCard);
         curDealerScore = handValue(gameState.cards[1]);
-- 
GitLab