/************************************************************ * * * BlackJack - 21 - A Card Game * * * ************************************************************ * AUTHOR: Jay Deuel * * DATE: July 5, 2001 * **************************************************/ /************************************************** * * * Declare and Initialize Variables * * * **************************************************/ var gameStatus = 0; // game in progress var endScenario = 0; // indicates reason for end of game var cardImage = new Image; // image of card to be displayed var playerBet = 1; // amount of bet for current hand var doubleBet = 1; // indicates Double Down var playerTotal = 100; // balance player has or owes var playerInsurance = false; // player insurance against dealer BlackJack var playerScore = 0; // value of player hand var playerAce = 0; // Aces in player hand var playerHand = new Array(8); playerHand[0] = 0; // number of cards delt to player // value of individual card in player hand playerHand[1] = 0; playerHand[2] = 0; playerHand[3] = 0; playerHand[4] = 0; playerHand[5] = 0; playerHand[6] = 0; playerHand[7] = 0; var dealerScore = 0; // value of dealer hand var dealerAce = 0; // Aces in dealer hand var dealerImage = new Image; // image of dealer 2nd card (delt face-down) var dealerHand = new Array(8); dealerHand[0] = 0; // number of cards delt to dealer // value of individual card in dealer hand dealerHand[1] = 0; dealerHand[2] = 0; dealerHand[3] = 0; dealerHand[4] = 0; dealerHand[5] = 0; dealerHand[6] = 0; dealerHand[7] = 0; var randomNumber = 0; // random number for shuffle var cardStack = new Array(53); cardStack[00] = 52; // number of cards delt from the top of current deck // value of individual card in deck cardStack[01] = 01; cardStack[02] = 02; cardStack[03] = 03; cardStack[04] = 04; cardStack[05] = 05; cardStack[06] = 06; cardStack[07] = 07; cardStack[08] = 08; cardStack[09] = 09; cardStack[10] = 10; cardStack[11] = 11; cardStack[12] = 12; cardStack[13] = 13; cardStack[14] = 14; cardStack[15] = 15; cardStack[16] = 16; cardStack[17] = 17; cardStack[18] = 18; cardStack[19] = 19; cardStack[20] = 20; cardStack[21] = 21; cardStack[22] = 22; cardStack[23] = 23; cardStack[24] = 24; cardStack[25] = 25; cardStack[26] = 26; cardStack[27] = 27; cardStack[28] = 28; cardStack[29] = 29; cardStack[30] = 30; cardStack[31] = 31; cardStack[32] = 32; cardStack[33] = 33; cardStack[34] = 34; cardStack[35] = 35; cardStack[36] = 36; cardStack[37] = 37; cardStack[38] = 38; cardStack[39] = 39; cardStack[40] = 40; cardStack[41] = 41; cardStack[42] = 42; cardStack[43] = 43; cardStack[44] = 44; cardStack[45] = 45; cardStack[46] = 46; cardStack[47] = 47; cardStack[48] = 48; cardStack[49] = 49; cardStack[50] = 50; cardStack[51] = 51; cardStack[52] = 52; /************************************************** * * * Deal Cards * * * **************************************************/ function dealCards() { if (gameStatus == 0) { newGame(); if (cardStack[00] > 39) // maximum number of cards needed per game: 6 player, 7 dealer { shuffleDeck() } scoreCard("player",++playerHand[0],cardStack[++cardStack[00]]); // player 1st card: who, position, face scoreCard("dealer",++dealerHand[0],cardStack[++cardStack[00]]); // dealer 1st card: who, position, face scoreCard("player",++playerHand[0],cardStack[++cardStack[00]]); // player 2nd card: who, position, face scoreCard("dealer",++dealerHand[0],cardStack[++cardStack[00]]); // dealer 2nd card: who, position, face top.display.message.document.forms[0].update.value = ""; top.display.message.document.forms[0].action.value = " Stand, Hit Me or Double Down"; top.display.message.document.forms[0].status.value = " Cards in the deck: " + (52 - cardStack[00]); top.display.player.document.forms[0].hand.value = "Player: " + playerScore; if ((playerAce > 0) || (dealerAce > 0)) { checkNatural(); } } else { alert("Deal cards to begin a new game, but not during one-in-progress!"); } } /************************************************** * * * Stand with Current Hand * * * **************************************************/ function lastStand() { if (gameStatus == 1) { displayCard(0,2,dealerImage.src,dealerHand[2]); if ((playerAce > 0) && ((playerScore + 10) <= 21)) { playerScore += 10; // count player Ace as 11 } if (endScenario == 0) { while (dealerScore <= 16) // play dealer hand, hard 17+ { if ((dealerAce > 0) && (((dealerScore + 10) >= 17) && ((dealerScore + 10) <= 21))) // soft 17+ { dealerScore += 10; // count dealer Ace as 11 } else if ((dealerHand[0] >= 7) && (dealerScore <= 21)) // dealer wins with 7 cards { endScenario = 10; // dealer did not bust } else { scoreCard("dealer",++dealerHand[0],cardStack[++cardStack[00]]); // who, position, face } } top.display.message.document.forms[0].status.value = " Cards in the deck: " + (52 - cardStack[00]); if (dealerScore > 21) { endScenario = 3; // dealer busted playerTotal += (playerBet * doubleBet); } else if (playerScore > dealerScore) { endScenario = 2; // player wins playerTotal += (playerBet * doubleBet); } else if (playerScore < dealerScore) { endScenario = 8; // dealer wins playerTotal -= (playerBet * doubleBet); } else if (playerScore == dealerScore) { endScenario = 1; // player and dealer equal } else { endScenario = 99; // error } } if (endScenario == 5) // player wins with BlackJack! { playerTotal += (playerBet * 1.5); } endGame(); } else { alert("Stand can only happen during a game-in-progress!"); } } /************************************************** * * * Hit Me with Another Card * * * **************************************************/ function hitMe() { if (gameStatus == 1) { scoreCard("player",++playerHand[0],cardStack[++cardStack[00]]); // player 3rd card: who, position, face top.display.message.document.forms[0].status.value = " Cards in the deck: " + (52 - cardStack[00]); if (playerScore > 21) { playerTotal -= playerBet; endScenario = 9; // player busted lastStand(); } else if ((playerHand[0] >= 7) && (playerScore <= 21)) // player dealt 7 cards, and did not bust { playerTotal += playerBet; endScenario = 4; // player wins with 7 cards lastStand(); } else if ((playerAce > 0) && ((playerScore + 10) <= 21)) { top.display.player.document.forms[0].hand.value = "Player: " + playerScore + " or " + (playerScore + 10); } else { top.display.player.document.forms[0].hand.value = "Player: " + playerScore; } } else { alert("Hit Me can only happen during a game-in-progress!"); } } /************************************************** * * * Change Bet and/or Total * * * **************************************************/ function changeBet() { if (gameStatus == 0) { playerBet = eval(prompt("Change the current bet to what value?","1")); top.display.message.document.forms[0].bet.value = "Bet: " + playerBet; playerTotal = eval(prompt("Change the current bet to what value?","100")); top.display.message.document.forms[0].total.value = "Total: " + playerTotal; } else { alert("Change Bet can not happen during a game-in-progress!"); } } /************************************************** * * * Double Down * * * **************************************************/ function doubleDown() { if (gameStatus == 1) { if (playerHand[0] > 2) { alert("Double Down can only happen before Player is delt a 3rd card!"); } else { doubleBet = 2; scoreCard("player",++playerHand[0],cardStack[++cardStack[00]]); // player 3rd card: who, position, face top.display.message.document.forms[0].status.value = " Cards in the deck: " + (52 - cardStack[00]); if (playerScore > 21) { playerTotal -= (playerBet * doubleBet); endScenario = 9; // player busted } else { if (playerAce > 0) { if ((playerScore + 10) <= 21) { playerScore += 10; } } // double down } lastStand(); } } else { alert("Double Down can only happen during a game-in-progress!"); } } /************************************************** * * * New Game * * * **************************************************/ function newGame() { gameStatus = 1; doubleBet = 1; endScenario = 0; playerAce = 0; playerScore = 0; playerHand[0] = 0; playerInsurance = false; top.display.player.document.forms[0].hand.value = "Player: "; dealerAce = 0; dealerScore = 0; dealerHand[0] = 0; top.display.dealer.document.forms[0].hand.value = "Dealer: "; for (i = 0; i < 7; i++) { top.display.dealer.document.images[i].src = "cards/blank.gif"; top.display.dealer.document.forms[0].elements[i + 1].value = ""; top.display.player.document.images[i].src = "cards/blank.gif"; top.display.player.document.forms[0].elements[i + 1].value = ""; } top.display.message.document.left.src = "cards/blank.gif"; top.display.message.document.right.src = "images/blank-r.gif"; } /************************************************** * * * Shuffle Deck * * * **************************************************/ function shuffleDeck() { var sameCards = 0; top.display.message.document.left.src = "cards/back.jpg"; top.display.message.document.forms[0].update.value = " The deck is being shuffled."; top.display.message.document.forms[0].action.value = ""; top.display.message.document.forms[0].status.value = ""; for (i = 1; i <= 52; i++) { randomNumber = Math.round(Math.random() * 52); if (randomNumber == 0) {randomNumber = 52} // even chance for all 52 combinations cardStack[i] = randomNumber; for (j = 1; j < i; j++) // assure 52 unique cards { if (cardStack[j] == cardStack[i]) {sameCards++} // detect if card is not unique } if (sameCards > 0) { i--; sameCards = 0; } else { top.display.message.document.forms[0].status.value = " Cards in the deck: " + i; } } top.display.message.document.left.src = "cards/blank.gif"; cardStack[00] = 0; } /************************************************** * * * Score Card * * * **************************************************/ function scoreCard(a,b,c) // who, position-in-hand, card-face { if (a == "player") // player card { playerHand[b] = determineValue(c); cardImage.src = "cards/" + determineSource(c) + ".gif" displayCard(2,b,cardImage.src,playerHand[b]); if (playerHand[b] == 1) // face is an Ace { playerAce++ } playerScore += playerHand[b]; } else // dealer card { dealerHand[b] = determineValue(c); cardImage.src = "cards/" + determineSource(c) + ".gif" if (b == 2) // dealer 2nd card { dealerImage.src = cardImage.src; top.display.dealer.document.images[1].src="cards/back.jpg"; // dealer 2nd card face-down } else { displayCard(0,b,cardImage.src,dealerHand[b]); } if (dealerHand[b] == 1) // face is an Ace { dealerAce++ } dealerScore += dealerHand[b]; } } /************************************************** * * * Determine Card Value * * * **************************************************/ function determineValue(u) { switch (u) { case (01): return 1; case (02): return 2; case (03): return 3; case (04): return 4; case (05): return 5; case (06): return 6; case (07): return 7; case (08): return 8; case (09): return 9; case (10): return 10; case (11): return 10; case (12): return 10; case (13): return 10; case (14): return 1; case (15): return 2; case (16): return 3; case (17): return 4; case (18): return 5; case (19): return 6; case (20): return 7; case (21): return 8; case (22): return 9; case (23): return 10; case (24): return 10; case (25): return 10; case (26): return 10; case (27): return 1; case (28): return 2; case (29): return 3; case (30): return 4; case (31): return 5; case (32): return 6; case (33): return 7; case (34): return 8; case (35): return 9; case (36): return 10; case (37): return 10; case (38): return 10; case (39): return 10; case (40): return 1; case (41): return 2; case (42): return 3; case (43): return 4; case (44): return 5; case (45): return 6; case (46): return 7; case (47): return 8; case (48): return 9; case (49): return 10; case (50): return 10; case (51): return 10; case (52): return 10; default: return 0; // invalid randomNumber } } /************************************************** * * * Determine Card Image Source * * * **************************************************/ function determineSource(v) { switch (v) { case (01): return "c-01"; case (02): return "c-02"; case (03): return "c-03"; case (04): return "c-04"; case (05): return "c-05"; case (06): return "c-06"; case (07): return "c-07"; case (08): return "c-08"; case (09): return "c-09"; case (10): return "c-10"; case (11): return "c-11"; case (12): return "c-12"; case (13): return "c-13"; case (14): return "d-01"; case (15): return "d-02"; case (16): return "d-03"; case (17): return "d-04"; case (18): return "d-05"; case (19): return "d-06"; case (20): return "d-07"; case (21): return "d-08"; case (22): return "d-09"; case (23): return "d-10"; case (24): return "d-11"; case (25): return "d-12"; case (26): return "d-13"; case (27): return "h-01"; case (28): return "h-02"; case (29): return "h-03"; case (30): return "h-04"; case (31): return "h-05"; case (32): return "h-06"; case (33): return "h-07"; case (34): return "h-08"; case (35): return "h-09"; case (36): return "h-10"; case (37): return "h-11"; case (38): return "h-12"; case (39): return "h-13"; case (40): return "s-01"; case (41): return "s-02"; case (42): return "s-03"; case (43): return "s-04"; case (44): return "s-05"; case (45): return "s-06"; case (46): return "s-07"; case (47): return "s-08"; case (48): return "s-09"; case (49): return "s-10"; case (50): return "s-11"; case (51): return "s-12"; case (52): return "s-13"; default: return "joker"; // invalid randomNumber } } /************************************************** * * * Display Card * * * **************************************************/ function displayCard(w,x,y,z) // FRAME, position-in-hand, card-face, card-value { top.display.frames[w].document.images[x-1].src = y; if (z == 10) { top.display.frames[w].document.forms[0].elements[x].value = " " + z; } else if (z > 1) { top.display.frames[w].document.forms[0].elements[x].value = " " + z; } else { top.display.frames[w].document.forms[0].elements[x].value = "1/11"; } } /************************************************** * * * Check for a Natural - BlackJack - 21 * * * **************************************************/ function checkNatural() { if (((playerHand[1] == 1) && (playerHand[2] == 10)) || ((playerHand[1] == 10) && (playerHand[2] == 1))) { top.display.player.document.forms[0].hand.value = "Player: BJ - 21"; playerScore += 10; endScenario = 5; // Player Natural! } if ((dealerHand[1] == 1) && (endScenario != 5)) { playerInsurance = confirm("Do you want to buy insurance against a dealer BlackJack?"); if (playerInsurance == true) { playerTotal -= (playerBet * .5); top.display.message.document.forms[0].total.value = "Total: " + playerTotal; } } if (((dealerHand[1] == 1) && (dealerHand[2] == 10)) || ((dealerHand[1] == 10) && (dealerHand[2] == 1))) { top.display.dealer.document.forms[0].hand.value = "Dealer: BJ - 21"; if (endScenario == 5) { endScenario = 6; // Player and Dealer Natural! } else { playerTotal -= playerBet; if (playerInsurance == true) { playerTotal += playerBet; } endScenario = 7; // Dealer Natural! } } if (endScenario == 0) { if (playerAce > 0) // player has an Ace, not a natural { top.display.player.document.forms[0].hand.value = "Player: " + playerScore + " or " + (playerScore + 10); } } else { lastStand(); } } /************************************************** * * * End Game * * * **************************************************/ function endGame() { if ((endScenario < 5) || (endScenario > 6)) { top.display.player.document.forms[0].hand.value = "Player: " + playerScore; } if ((endScenario < 6) || (endScenario > 7)) { top.display.dealer.document.forms[0].hand.value = "Dealer: " + dealerScore; } var leadingZero = ""; // notice comments herein if ((endScenario == 1)) { top.display.message.document.right.src = "images/suits.gif"; } else if ((endScenario >= 2) && (endScenario <= 4)) { randomNumber = Math.round(Math.random() * 21); // 21 right images if (randomNumber == 0) {randomNumber = 21} if (randomNumber < 10) {leadingZero += "0"} top.display.message.document.right.src = "images/display/r-" + leadingZero + randomNumber + ".gif"; } else if ((endScenario >= 5) && (endScenario <= 7)) { top.display.message.document.right.src = "images/bj.gif"; } else { top.display.message.document.left.src = "cards/joker.gif"; } var theMessage = ""; switch (endScenario) { case (01): theMessage = " Push: Player and Dealer Equal"; break; case (02): theMessage = " Player Wins! "; break; case (03): theMessage = " Player Wins: Dealer Busted! "; break; case (04): theMessage = "Player Wins: 7 Cards - No Bust"; break; case (05): theMessage = " Player Wins: Delt a Natural! "; break; case (06): theMessage = "Tie: Player and Dealer Natural"; break; case (07): theMessage = " Dealer Wins: Delt a Natural "; break; case (08): theMessage = " Dealer Wins "; break; case (09): theMessage = " Dealer Wins: Player Busted "; break; case (10): theMessage = "Dealer Wins: 7 Cards - No Bust"; break; case (99): theMessage = " ERROR: Dealer Hand "; break; default: theMessage = " ERROR! "; // invalid endScenario top.display.message.document.left.src = "cards/joker.gif"; } top.display.message.document.forms[0].update.value = theMessage; top.display.message.document.forms[0].action.value = ""; top.display.message.document.forms[0].total.value = "Total: " + playerTotal; gameStatus = 0; } /************************************************** * * * The End * * * **************************************************/