diff --git a/game-logic.js b/game-logic.js index 19d323aab2638f9546e3b2d877152e20eee0c15c..cf6f7200328f25ea05ec3d2aa0c3112e3b5f5d76 100644 --- a/game-logic.js +++ b/game-logic.js @@ -33,25 +33,27 @@ function drawCard(){ } function handValue(cards){ - let sum = cards.reduce( - (accumulator, item) => accumulator + item - ); - let aces = cards.filter( - (item) => item === 11 - ).length; - /* - for (let i = 0; i < cards.length; i++){ - sum = sum + cards[i]; - if (cards[i] == 11){ - aces++; - } - } - */ - while (sum > 21 && aces > 0){ - sum = sum - 10; - aces--; + let sum = 0; + if (cards.length > 0) { + sum = cards.reduce( + (accumulator, item) => accumulator + item + ); + let aces = cards.filter( + (item) => item === 11 + ).length; + /* + for (let i = 0; i < cards.length; i++){ + sum = sum + cards[i]; + if (cards[i] == 11){ + aces++; + } + } + */ + while (sum > 21 && aces > 0){ + sum = sum - 10; + aces--; + } } - return sum; } @@ -61,8 +63,32 @@ function resetGameState(){ gameState.hiddenCard = null; } +function updateGUI(){ + let walletElement = document.getElementById('player-wallet'); + walletElement.innerHTML = gameState.playerWallet; + let ids = ['player-cards', 'dealer-cards']; + let scoreIds = ['player-score', 'dealer-score']; + for (let k = 0; k < ids.length; k++){ + // clean all the cells of player's cards and dealer's cards + let table = document.getElementById(ids[k]); + let cells = table.getElementsByTagName('td'); + for (let i = 0; i < cells.length; i++){ + cells[i].innerHTML = ' '; + } + // 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]; + } + let curScore = handValue(gameState.cards[k]); + let scoreElement = document.getElementById(scoreIds[k]); + scoreElement.innerHTML = curScore; + } +} + function newGame(){ resetGameState(); + updateGUI(); + log(' '); let inputBetElement = document.getElementById('player-bet-input'); inputBetElement.disabled = false; let buttonBetElement = document.getElementById('player-bet-button'); @@ -76,6 +102,7 @@ function newGame(){ function collectBetAndDealCards(){ gameState.currentBet = collectBet(); + gameState.playerWallet -= gameState.currentBet; let inputBetElement = document.getElementById('player-bet-input'); inputBetElement.disabled = true; @@ -95,95 +122,52 @@ function collectBetAndDealCards(){ } } - let curPlayerScore = handValue(gameState.cards[0]); - let curDealerScore = handValue(gameState.cards[1]); - - console.log(`Player score is ${curPlayerScore}, Dealer score is ${curDealerScore}`); + updateGUI(); - let playerScoreElement = document.getElementById('player-score'); - let dealerScoreElement = document.getElementById('dealer-score'); - - playerScoreElement.innerHTML = curPlayerScore; - dealerScoreElement.innerHTML = curDealerScore; + let curPlayerScore = handValue(gameState.cards[0]); // check immediately that the player has blackjack // if so, we need to pay 2.5 the bet -> end the game if (curPlayerScore === 21){ - console.log('Player has blackjack!'); - gameState.playerWallet += gameState.currentBet*2.5; - return true; + log('Player has blackjack!'); + payBet(2.5); } -} -function blackjack(){ - // decide the bet, collect it - gameState.currentBet = collectBet(); + let buttonStay = document.getElementById('button-stay'); + buttonStay.disabled = false; + let buttonHit = document.getElementById('button-hit'); + buttonHit.disabled = false; +} - // we deal the first 2 cards for the player - // we deal the first 2 cards for the dealer - // one is hidden - for(let playerIndex = 0; playerIndex < gameState.cards.length; playerIndex++){ - for(let cardIndex = 0; cardIndex < 2; cardIndex++){ - if (cardIndex === 1 && playerIndex === 1){ - gameState.hiddenCard = drawCard(); - } else { - gameState.cards[playerIndex][cardIndex] = drawCard(); - } - } - } +function log(message){ + let logElement = document.getElementById('console-log'); + logElement.innerHTML = message; +} +function hit(){ + let curCard = drawCard(); + gameState.cards[0].push(curCard); let curPlayerScore = handValue(gameState.cards[0]); - let curDealerScore = handValue(gameState.cards[1]); - - console.log(`Player score is ${curPlayerScore}, Dealer score is ${curDealerScore}`); - - // check immediately that the player has blackjack - // if so, we need to pay 2.5 the bet -> end the game - if (curPlayerScore === 21){ - console.log('Player has blackjack!'); - gameState.playerWallet += gameState.currentBet*2.5; - return true; - } - - // REPEAT THIS ------ - // player makes a choice: hit or stand - // if player hits: - // we deal a new card to the player - // compute the new score - // if new score > 21 player loses -> end the game - // --- UNTIL THE PLAYER stands - - while(curPlayerScore < 21){ - let threshold = (21 - curPlayerScore) / 21; - let likelihood = Math.random(); - if (likelihood < threshold){ - console.log('Player hitting a new card'); - let curCard = drawCard(); - gameState.cards[0].push(curCard); - curPlayerScore = handValue(gameState.cards[0]); - console.log(`Player got ${curCard} and the current score is ${curPlayerScore}`); - } else { - console.log('Player is not taking any more card'); - break; - } - } - + updateGUI() if (curPlayerScore > 21){ - console.log(`The player has busted`); - return false; + log('Player busted!') + payBet(0); } +} - console.log(gameState.cards[0]); - - // show the hidden card of the dealer - console.log(`The hidden card of the dealer was ${gameState.hiddenCard}`); +function stay(){ + let buttonStay = document.getElementById('button-stay'); + buttonStay.disabled = true; + let buttonHit = document.getElementById('button-hit'); + buttonHit.disabled = true; gameState.cards[1].push(gameState.hiddenCard); gameState.hiddenCard = null; - curDealerScore = handValue(gameState.cards[1]); + let curPlayerScore = handValue(gameState.cards[0]); + let curDealerScore = handValue(gameState.cards[1]); - console.log(`The dealer current score is ${curDealerScore}`); + updateGUI(); // REPEAT THIS ----- // If dealer has less than 17 @@ -195,15 +179,14 @@ function blackjack(){ gameState.cards[1].push(curCard); curDealerScore = handValue(gameState.cards[1]); console.log(`The dealer got a score of ${curDealerScore}`); + updateGUI(); } // if new score > 21 dealer loses -> // need to pay the player 2 times the bet // -> end the game if (curDealerScore > 21){ - console.log(`Dealer has busted`); - console.log(`The player wins`); - gameState.playerWallet += gameState.currentBet*2; - return true; + log(`Dealer has busted. The player wins.`); + payBet(2); } // we need to compare player's score with dealer's score @@ -211,18 +194,33 @@ function blackjack(){ // -> pay 2 times the bet // end the game if (curDealerScore > curPlayerScore){ - console.log(`The player lost`); - return false; + log(`The player lost`); + payBet(0); } else if (curDealerScore === curPlayerScore){ - console.log(`That's a tie`); - gameState.playerWallet += gameState.currentBet; - return true + log(`That's a tie`); + payBet(1); } else { - console.log(`The player wins`); - gameState.playerWallet += gameState.currentBet*2; - return true; + log(`The player wins`); + payBet(2); } + +} + +function payBet(times){ + gameState.playerWallet += gameState.currentBet*times; + updateGUI(); + + let buttonBetElement = document.getElementById('player-bet-button'); + buttonBetElement.disabled = true; + + let buttonStay = document.getElementById('button-stay'); + buttonStay.disabled = true; + let buttonHit = document.getElementById('button-hit'); + buttonHit.disabled = true; + + let buttonRunElement = document.getElementById('button-run'); + buttonRunElement.disabled = false; } function addEventsListeners(){ @@ -242,5 +240,21 @@ function addEventsListeners(){ collectBetAndDealCards(); } ); + + let buttonStay = document.getElementById('button-stay'); + buttonStay.addEventListener( + 'click', + (event) => { + stay(); + } + ); + + let buttonHit = document.getElementById('button-hit'); + buttonHit.addEventListener( + 'click', + (event) => { + hit(); + } + ); }