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
439 lines (370 loc) · 14.6 KB
/
script.js
File metadata and controls
439 lines (370 loc) · 14.6 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
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
var UNIVERSAL_GAME_MODE = ``;
var GAME_MODE_PLAYER_CHOICE = `Player turn: Choose to hit or stand!`;
var GAME_MODE_DEALER_CHOICE = `Dealer turn: Choose to hit or stand!`;
var GAME_MODE_EVALUATE = `Time to evaluate if player or dealer busts and winning condition!`;
var cardDeck = [];
//Captures dealer cards
var dealerHands = [];
//Captures player cards
var playerHands = [];
//Used to join dealer cards'names and suits
var fullDealerHand = [];
//Used to join player cards'names and suits
var fullPlayerHand = [];
//Capture sum of dealer cards
var sumOfDealerHand = 0;
//Capture sum of player cards
var sumOfPlayerHand = 0;
//set to true if player met blackjack
var playerBlackjack = ``;
//set to true if dealer met blackjack
var dealerBlackjack = ``;
var main = function (input) {
if (UNIVERSAL_GAME_MODE === ``) {
//Generates deck of cards
cardDeck = cardDeckGenerator();
//Shuffle deck of cards
cardDeck = shuffleCardDeck(cardDeck);
//Start assigning hands to dealer then player
dealerHands = assignCards(2);
playerHands = assignCards(2);
//Calculate sum of dealer cards & check if need to vary ace values
sumOfDealerHand = sumCards(dealerHands) + varyAceValues(dealerHands);
//check if blackjack is met for dealer
dealerBlackjack = checksForBlackjack(dealerHands);
//Calculate sum of player cards
sumOfPlayerHand = sumCards(playerHands) + varyAceValues(playerHands);
//check if blackjack is met for player
playerBlackjack = checksForBlackjack(playerHands);
//if blackjack is met by player, change game mode since they win automatically
if (playerBlackjack === `true` || dealerBlackjack === `true`) {
var winner = captureWinner();
return winner;
}
//Change game mode to allow player to choose to hit or stand
UNIVERSAL_GAME_MODE = GAME_MODE_PLAYER_CHOICE;
//append deck images for player and dealer
appendImagesWhenDeckHanded(`player`);
appendImagesWhenDeckHanded(`dealer`);
var myOutputValue = `Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Enter hit to draw a card or stand to end your turn then click the Submit button `;
//if player has less than dealer on first round and has less than 17, nudge to choose hit
if (sumOfPlayerHand < sumOfDealerHand && sumOfPlayerHand < 17) {
myOutputValue =
`Your current total is less than dealer so, it's wise to hit! <br>` +
myOutputValue;
} else if (sumOfPlayerHand < sumOfDealerHand && sumOfPlayerHand > 17) {
myOutputValue =
`Your current total is less than dealer but, be careful to avoid busting! <br>` +
myOutputValue;
}
return myOutputValue;
}
if (UNIVERSAL_GAME_MODE === GAME_MODE_PLAYER_CHOICE) {
//Checks if user input is either hit or stand
var userChoice = validatesInput(input);
//user chose to hit (draw a card)
if (userChoice === `hit`) {
playerHands = hit(playerHands);
//Calculate sum of player cards
sumOfPlayerHand = sumCards(playerHands) + varyAceValues(playerHands);
//check if blackjack is met for player
playerBlackjack = checksForBlackjack(playerHands);
//if blackjack is met by player, change game mode since they win automatically
if (playerBlackjack === `true` || dealerBlackjack === `true`) {
var winner = captureWinner();
return winner;
}
//append deck images for player
appendImagesWhenHit(`player`);
var myOutputValue = `You chose hit and have drawn a new card! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Enter hit to draw a card or stand to end your turn then click the Submit button!`;
UNIVERSAL_GAME_MODE = GAME_MODE_PLAYER_CHOICE;
return myOutputValue;
} else if (userChoice === "stand") {
var myOutputValue = `You chose stand so no cards were drawn! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Click button again to see what dealer chooses! `;
UNIVERSAL_GAME_MODE = GAME_MODE_DEALER_CHOICE;
return myOutputValue;
}
return userChoice;
}
if (UNIVERSAL_GAME_MODE === GAME_MODE_DEALER_CHOICE) {
//check if dealer sum > 17 and has to hit
if (sumOfDealerHand < 17) {
//Assign new card
dealerHands = hit(dealerHands);
//Calculate sum of dealer cards and change ace variable if preset
sumOfDealerHand = sumCards(dealerHands) + varyAceValues(dealerHands);
//check if blackjack is met for dealer
dealerBlackjack = checksForBlackjack(dealerHands);
//if blackjack is met by dealer, change game mode since they win automatically
if (playerBlackjack === `true` || dealerBlackjack === `true`) {
var winner = captureWinner();
return winner;
}
//change button text to nudge player to click for next steps
var button = document.querySelector("#submit-button");
button.innerText;
button.innerText = "Click to continue!";
//append deck images for dealer
appendImagesWhenHit(`dealer`);
var myOutputValue = `Dealer chose hit and has drawn a new card! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand}`;
} else {
var myOutputValue = `Dealer chose stand and no new cards are drawn! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} `;
UNIVERSAL_GAME_MODE = GAME_MODE_EVALUATE;
}
return myOutputValue;
}
if (UNIVERSAL_GAME_MODE === GAME_MODE_EVALUATE) {
//evaluate if either player or dealer bust
if (sumOfPlayerHand > 21 || sumOfDealerHand > 21) {
var winner = declaresWinnerIfBustReturnsTrue();
return winner;
}
// If bust condition not met-Compare dealer hands and player hands to see who wins
else var winner = captureWinner();
return winner;
}
};
//Function to append images when decks are assigned
var appendImagesWhenDeckHanded = function (playerOrDealer) {
//tracks if the function should append for player or dealer
var playerOrDealer = playerOrDealer;
counter = 0;
if (playerOrDealer === `player`) {
while (counter < playerHands.length) {
//in case there are existing images, remove to avoid duplicates
//adds images
var cardImage = document.createElement(`img`);
cardImage.src = `cards/` + playerHands[counter].image + `.png`;
document.getElementById("player-cards").append(cardImage);
counter += 1;
}
} else {
while (counter < dealerHands.length) {
//adds images
var cardImage = document.createElement(`img`);
cardImage.src = `cards/` + dealerHands[counter].image + `.png`;
document.getElementById("dealer-cards").append(cardImage);
counter += 1;
}
}
};
//Function to append images when cards are drawn --> only adds last card drawn
var appendImagesWhenHit = function (playerOrDealer) {
//tracks if the function should append for player or dealer
var playerOrDealer = playerOrDealer;
var counter = 0;
if (playerOrDealer === `player`) {
//variable to capture last drawn card
var number = playerHands.length - 1;
var cardImage = document.createElement(`img`);
cardImage.src = `cards/` + playerHands[number].image + `.png`;
document.getElementById("player-cards").append(cardImage);
counter += 1;
} else {
//variable to capture last drawn card
var number = dealerHands.length - 1;
//adds images
var cardImage = document.createElement(`img`);
cardImage.src = `cards/` + dealerHands[number].image + `.png`;
document.getElementById("dealer-cards").append(cardImage);
counter += 1;
}
};
//Function to create deck of cards
//Create a single card
var cardDeckGenerator = function () {
var cardSuits = [`heart`, `diamonds`, `club`, `spade`];
var cardSuitsCounter = 0;
while (cardSuitsCounter < cardSuits.length) {
var cardSuit = cardSuits[cardSuitsCounter];
var rankCounter = 1;
while (rankCounter <= 13) {
var cardName = rankCounter;
var score = rankCounter;
if (rankCounter === 1) {
cardName = `ace`;
} else if (rankCounter === 11) {
cardName = `jack`;
score = 10;
} else if (rankCounter === 12) {
cardName = `queen`;
score = 10;
} else if (rankCounter === 13) {
cardName = `king`;
score = 10;
}
var card = {
name: cardName,
suit: cardSuit,
rank: score,
image: cardSuit + "-" + cardName,
};
//return card to deck
cardDeck.push(card);
rankCounter += 1;
}
cardSuitsCounter += 1;
}
return cardDeck;
};
//Generate random number for shuffling
var getRandomNumber = function (limit) {
return Math.floor(Math.random() * limit);
};
//Function to shuffle cards
var shuffleCardDeck = function (cardDeck) {
var cardCounter = 0;
while (cardCounter < cardDeck.length) {
var randomNumber = getRandomNumber(cardDeck.length);
var currentCard = cardDeck[cardCounter];
var randomCard = cardDeck[randomNumber];
cardDeck[randomNumber] = currentCard;
cardDeck[cardCounter] = randomCard;
cardCounter += 1;
}
return cardDeck;
};
//Function to hit
var hit = function (hand) {
hand.push(assignCards(1));
hand = [].concat.apply([], hand);
return hand;
};
//Function to hand out cards
var assignCards = function (numberOfCardsNeeded) {
counter = 0;
var cardHands = [];
while (counter < numberOfCardsNeeded) {
var newCard = cardDeck.pop();
cardHands.push(newCard);
counter += 1;
}
return cardHands;
};
//Function to validate input; whether user entered hit or stand
var validatesInput = function (text) {
var input = text.toLowerCase();
if (input !== `hit` && input !== `stand`) {
errorMessage = `Wrong option! Please enter either hit or stand only.`;
return errorMessage;
}
return input;
};
//function that checks for blackjack
var checksForBlackjack = function (deck) {
//checks total
var total = sumCards(deck) + varyAceValues(deck);
var metBlackjack = ``;
//check if sum = 21 --> blackjack
if (total === 21) {
metBlackjack = `true`;
}
return metBlackjack;
};
//Function to sum values of hand using rank
var sumCards = function (hands) {
//captures position of array
var index = 0;
var sum = 0;
while (index < hands.length) {
var currentRank = hands[index].rank;
sum = sum + currentRank;
index += 1;
}
return sum;
};
//Function to check if hand busts >21
var checkIfHandBusts = function (hand) {
var sum = sumCards(hand) + varyAceValues(hand);
var handBust = ``;
//if hand sum is more more than 21
if (sum > 21) {
var handBust = `true`;
} else {
handBust = "false";
}
return handBust;
};
//Function to test winning conditions and capture output that declares winner
var captureWinner = function () {
//First the sum of both dealer (computer) and player hands is calculated
var sumOfDealerHands = sumCards(dealerHands) + varyAceValues(dealerHands);
var sumOfPlayerHands = sumCards(playerHands) + varyAceValues(playerHands);
// If both players have the same value or draw blackjack causing tie
if (
sumOfDealerHands === sumOfPlayerHands ||
(playerBlackjack === `true` && dealerBlackjack === `true`)
) {
var image = `<img src=" https://media.tenor.com/mOfIOlNpmmkAAAAi/hello-kitty-ok.gif"/>`;
var myOutputValue =
`It's a tie! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Refresh to play again. ` +
image;
}
//If dealer (computer) wins by blackjack so hand = 21
else if (dealerBlackjack === `true` && playerBlackjack !== `true`) {
var image = `<img src=" https://media.tenor.com/dVzwsfQxks0AAAAd/cursed-hello-kitty-balloon-hello-kitty.gif"/>`;
var myOutputValue =
`Dealer hits blackjack! You lose! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Refresh to play again. ` +
image;
}
//If player wins by blackjack so hand = 21
else if (playerBlackjack === `true` && dealerBlackjack !== `true`) {
var image = `<img src="https://media.tenor.com/fvQDMD0LjKgAAAAC/sanrio-hello-kitty.gif"/>`;
var myOutputValue =
`You hit blackjack! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Refresh to play again.` +
image;
}
// If neither draw blacjack and dealer (computer) has higher value
else if (sumOfDealerHands > sumOfPlayerHands) {
var image = `<img src=" https://media.tenor.com/dVzwsfQxks0AAAAd/cursed-hello-kitty-balloon-hello-kitty.gif"/>`;
var myOutputValue =
`Dealer wins! You lose! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Refresh to play again. ` +
image;
}
// If neither draw blacjack and player has higher value
else {
var image = `<img src="https://media.tenor.com/fvQDMD0LjKgAAAAC/sanrio-hello-kitty.gif"/>`;
var myOutputValue =
`You win! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Refresh to play again. ` +
image;
}
return myOutputValue;
};
//Function to capture winning conditions in event either or both player and deal bust (sum > 21)
var declaresWinnerIfBustReturnsTrue = function () {
var myOutputValue = ``;
if (sumOfPlayerHand > 21 && sumOfDealerHand > 21) {
var image = `<img src=" https://media.tenor.com/mOfIOlNpmmkAAAAi/hello-kitty-ok.gif"/>`;
myOutputValue =
`Both dealer and you bust! It's a tie! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand}<br> Refresh to play again. ` +
image;
} else if (sumOfPlayerHand < 21 && sumOfDealerHand > 21) {
var image = `<img src="https://media.tenor.com/fvQDMD0LjKgAAAAC/sanrio-hello-kitty.gif"/>`;
myOutputValue =
`Dealer bust! Player wins! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Refresh to play again. ` +
image;
} else {
var image = `<img src=" https://media.tenor.com/dVzwsfQxks0AAAAd/cursed-hello-kitty-balloon-hello-kitty.gif"/>`;
myOutputValue =
`Player bust and dealer wins! You lose! <br> Player Total: ${sumOfPlayerHand} <br> Dealer Total: ${sumOfDealerHand} <br> Refresh to play again.` +
image;
}
return myOutputValue;
};
//Function to check if hand contains ace and vary ace value
var varyAceValues = function (fullHand) {
//flatten array to remove bracket
var hand = [];
hand = fullHand.map(getHands);
function getHands(item) {
return [item.name].join(" ");
}
var increaseSumOfHand = 0;
//checks if array includes ace -> if yes= true / no = false
var aceCondition = hand.includes("ace");
if (aceCondition === true) {
//increases sum by 10 since ace was 1 and is now 11
increaseSumOfHand = 10;
}
return increaseSumOfHand;
};