forked from rocketacademy/basics-blackjack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
363 lines (319 loc) · 11.3 KB
/
script.js
File metadata and controls
363 lines (319 loc) · 11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
//This ia a game of Blacjack!
//Assumes two users, player vs. dealer
//Allows player and dealer to hit or stand
//Calculates Blackjack win
//2 users; player vs. dealer (computer)
var player = "Player";
var dealer = "Dealer";
var playerHand = [];
var dealerHand = [];
var gameDeck = [];
//Modes to run the game
//1) Start game, 2) Calculate cards, 3) Player decides hit or stand, 4) Show results
var modeGameStart = "start game";
var modeCalculateValues = "calculate values of cards";
var modePlayerHitStand = "player hit or stand";
var modeShowResults = "show results";
//Start the game
var currentGameMode = modeGameStart;
//<----- DECK FUNCTIONS ----->
//Function to create a deck of cards
var createDeck = function () {
var suits = ["Hearts", "Diamonds", "Clubs", "Spades"];
var ranks = [
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"J",
"Q",
"K",
"A",
];
var deck = [];
for (var suitIndex = 0; suitIndex < suits.length; suitIndex++) {
for (var rankIndex = 0; rankIndex < ranks.length; rankIndex++) {
var card = {
rank: ranks[rankIndex],
suit: suits[suitIndex],
};
//Assign value to the card
if (
ranks[rankIndex] === "J" ||
ranks[rankIndex] === "Q" ||
ranks[rankIndex] === "K"
) {
card.value = 10;
} else if (ranks[rankIndex] === "A") {
card.value = 11;
} else {
card.value = parseInt(ranks[rankIndex]);
}
deck.push(card);
}
}
return deck;
};
//Function to shuffle deck that is created by swapping card's position with another card in the deck, loops through the entire deck until all cards are shuffled
var shuffleDeck = function (shuffle) {
// n is defined as the number of cards in the deck
var n = shuffle.length;
while (n > 1) {
// Generate a random index between 0 and n (n > 1 so that while loop continues as long as n is greater than 1)
// Math.random times n gives random number between 0 (inclusive) and n (exclusive), Math.floor to round down to integer
//Then, n-- decrements the value of n after it's been used, ensuring that the random index will always be between 0 and n-1.
var randomIndex = Math.floor(Math.random() * n--);
//Temporarily stores the card at position 'n'
var temp = shuffle[n];
//Swap the current card with the card at the random index
shuffle[n] = shuffle[randomIndex];
shuffle[randomIndex] = temp;
}
return shuffle;
};
//Function to create AND shuffle deck
var prepareDeck = function () {
var myDeck = createDeck();
var shuffledDeck = shuffleDeck(myDeck);
return shuffledDeck;
};
//Function to deal cards
//Use pop to hand out cards from deck (gameDeck)
//Use push to add to respective arrays (hand)
var dealCards = function (hand, numCards) {
for (var i = 0; i < numCards; i++) {
hand.push(gameDeck.pop());
}
};
//<----- GAME FUNCTIONS ----->
//Check for Blackjack scenario first, because if player or dealer has Blackjack, automatically wins the game
var checkForBlackjack = function (handArray) {
var userCardOne = handArray[0];
var userCardTwo = handArray[1];
var isBlackjack = false;
var isTenCard = function (rank) {
return rank === "10" || rank === "J" || rank === "Q" || rank === "K";
};
if (
(userCardOne.rank === "A" && isTenCard(userCardTwo.rank)) ||
(userCardTwo.rank === "A" && isTenCard(userCardOne.rank))
) {
isBlackjack = true;
}
return isBlackjack;
};
//Calculate total value of hand
//Ace has assigned value of 11 unless total score becomes > 21, then assume value of 1
var calculateHandValue = function (handArray) {
var handValue = 0;
var hasAce = false;
// Calculate the initial hand value
for (var i = 0; i < handArray.length; i++) {
var cardValue = handArray[i].value;
handValue += cardValue;
if (handArray[i].rank === "A") {
hasAce = true;
}
}
// If hand value exceeds 21 and there's an Ace, reduce Ace's value from 11 to 1
if (handValue > 21 && hasAce) {
handValue -= 10;
}
return handValue;
};
//Function to show player's hands and value
var displayPlayerHandValue = function (playerHandArray) {
var playerHandMessage = "Player's hand:<br>";
var playerValue = calculateHandValue(playerHandArray);
// Loop through each card in the player's hand
for (var i = 0; i < playerHandArray.length; i++) {
var card = playerHandArray[i];
playerHandMessage += `${card.rank} of ${card.suit}`;
// Add emoji based on the suit
if (card.suit === "Hearts") {
playerHandMessage += "❤️";
} else if (card.suit === "Diamonds") {
playerHandMessage += "💎";
} else if (card.suit === "Clubs") {
playerHandMessage += "🍀";
} else if (card.suit === "Spades") {
playerHandMessage += "🧹";
}
playerHandMessage += "<br>";
}
// Shows total value of hand
var playerValueMessage = `Player's value: ${playerValue}<br>`;
return playerHandMessage + "<br>" + playerValueMessage + "<br>";
};
//Function to show dealer's hands and values
var displayDealerHandValue = function (dealerHandArray) {
var dealerHandMessage = "Dealer's hand:<br>";
var dealerValue = calculateHandValue(dealerHandArray);
// Loop through each card in the dealer's hand
for (var i = 0; i < dealerHandArray.length; i++) {
var card = dealerHandArray[i];
dealerHandMessage += `${card.rank} of ${card.suit}`;
// Add emoji based on the suit
if (card.suit === "Hearts") {
dealerHandMessage += " ❤️";
} else if (card.suit === "Diamonds") {
dealerHandMessage += "💎";
} else if (card.suit === "Clubs") {
dealerHandMessage += "🍀";
} else if (card.suit === "Spades") {
dealerHandMessage += "🧹";
}
dealerHandMessage += "<br>";
}
//Shows total value of hand
var dealerValueMessage = `Dealer's value: ${dealerValue}`;
return dealerHandMessage + "<br>" + dealerValueMessage;
};
//<----- MAIN FUNCTION (YAY!) ----->
var main = function (input) {
var outputMessage = "";
// Check if user inputs "reset" to restart the game
if (input.toLowerCase() === "reset") {
// Reset all game variables to their initial values
gameDeck = [];
playerHand = [];
dealerHand = [];
currentGameMode = modeGameStart;
// Inform the player that the game has been reset
outputMessage =
"Game has been reset. Please click 'submit' to start a new game.";
return outputMessage;
}
//Create and shuffle deck of cards
if (currentGameMode === modeGameStart) {
gameDeck = prepareDeck();
//Deal cards
dealCards(playerHand, 2);
dealCards(dealerHand, 2);
currentGameMode = modeCalculateValues;
outputMessage =
"Two cards have been dealt. Click again to view and evaluate your cards.";
return outputMessage;
}
//Run cards for Blackjack first
if (currentGameMode === modeCalculateValues) {
var playerBlackjack = checkForBlackjack(playerHand);
var dealerBlackjack = checkForBlackjack(dealerHand);
var playerMessage = displayPlayerHandValue(playerHand);
var dealerMessage = displayDealerHandValue(dealerHand);
//console.log: check if either user has Blackjack
console.log("Player hit Blackjack? " + playerBlackjack);
console.log("Dealer hit Blackjack? " + dealerBlackjack);
//if only player has Blackjack, player wins
if (playerBlackjack && !dealerBlackjack) {
outputMessage =
"Player has Blackjack! Player wins! <br>" +
playerMessage +
dealerMessage;
}
//if only dealer has Blackjack, dealer wins
else if (!playerBlackjack && dealerBlackjack) {
outputMessage =
"Dealer has Blackjack! Dealer wins! <br>" +
playerMessage +
dealerMessage;
}
//if both has Blackjack, it's a tie
else if (playerBlackjack && dealerBlackjack) {
outputMessage =
"It's a tie! Both of dealer and player has Blackjack! <br>" +
playerMessage +
dealerMessage;
}
//if neither has Blackjack, player will only get to view his cards to decide
else {
outputMessage =
playerMessage +
"No one has Blackjack. The game continues! <br> Please input 'hit' for another card or else, input 'stand' to end your turn and see the results of this game.";
currentGameMode = modePlayerHitStand;
}
return outputMessage;
}
//Let player decide to hit or stand
if (currentGameMode === modePlayerHitStand) {
input = input.toLowerCase();
// Check if input is empty or not "hit" or "stand"
if (!input || (input !== "hit" && input !== "stand")) {
outputMessage = "Invalid input. Please input 'hit' or 'stand'.";
return outputMessage;
}
var playerMessage = displayPlayerHandValue(playerHand);
var dealerMessage = displayDealerHandValue(dealerHand);
if (input === "hit") {
playerHand.push(gameDeck.pop());
playerMessage = displayPlayerHandValue(playerHand);
outputMessage =
playerMessage +
"You drew another card.<br> Please input 'hit' for another card or else, input 'stand' to end your turn and see the results of this game.";
return outputMessage;
}
//If player chooses to "stand", then dealer's turn to decide push or stand
//Dealer to draw extra card if value is 16 and below
//Once dealer's value is 17 or higher, the dealer stands
else if (input === "stand") {
while (calculateHandValue(dealerHand) < 17) {
dealerHand.push(gameDeck.pop());
dealerMessage = displayDealerHandValue(dealerHand);
}
// Calculate final values after each draw
var playerFinalValue = calculateHandValue(playerHand);
var dealerFinalValue = calculateHandValue(dealerHand);
console.log("Player's final value:" + playerFinalValue);
console.log("Dealer's final value:" + dealerFinalValue);
currentGameMode = modeShowResults;
}
}
//Check for bust (more than 21 in value)
if (currentGameMode === modeShowResults) {
var playerBust = playerFinalValue > 21;
var dealerBust = dealerFinalValue > 21;
// Check if both player and dealer bust
if (playerBust && dealerBust) {
return (
"It's a tie! Both player and dealer bust.<br> Please input 'reset' to restart the game!<br><br>" +
playerMessage +
dealerMessage
);
} else if (playerBust) {
return (
"Dealer wins! Player busts. <br> Please input 'reset' to restart the game!<br><br>" +
playerMessage +
dealerMessage
);
} else if (dealerBust) {
return (
"Player wins! Dealer busts. <br> Please input 'reset' to restart the game!<br><br>" +
playerMessage +
dealerMessage
);
}
}
//Time to decide a winner!
if (playerFinalValue === dealerFinalValue) {
outputMessage =
"It's a tie! Both player and dealer has the same value. <br> Please input 'reset' to restart the game!<br><br>" +
playerMessage +
dealerMessage;
} else if (playerFinalValue < dealerFinalValue) {
outputMessage =
"Dealer wins! Dealer has a higher value than player. <br> Please input 'reset' to restart the game!<br><br>" +
playerMessage +
dealerMessage;
} else {
outputMessage =
"Player wins! Player has a higher value than dealer. <br> Please input 'reset' to restart the game!<br>" +
playerMessage +
dealerMessage;
}
return outputMessage;
};