import java.util.Scanner; import java.util.Vector; /* Simulation of console-I/O program Blackjack, using ConsoleApplet as a basis. See the file ConsoleApplet.java for more information. */ public class BlackjackConsole { private static Scanner scanner = new Scanner(System.in); private int[] deck; // An array of 52 Cards, representing the deck. private int currentPosition; // Current position in the deck private Vector hand; // The cards in the hand. public static void main(String[] args) { new BlackjackConsole().run(); } public void run() { /* This program lets the user play Blackjack. The computer acts as the dealer. The user has a stake of $100, and makes a bet on each game. The user can leave at any time, or will be kicked out when he loses all the money. House rules: The dealer hits on a total of 16 or less and stands on a total of 17 or more. Dealer wins ties. A new deck of cards is used for each game. */ int money; // Amount of money the user has. int bet; // Amount user bets on a game. boolean userWins; // Did the user win the game? System.out.println("Welcome to the game of blackjack."); System.out.println(); money = 100; // User starts with $100. while (true) { System.out.println("You have " + money + " dollars."); do { System.out.println("How many dollars do you want to bet? (Enter 0 to end.)"); System.out.print("? "); bet = scanner.nextInt(); if (bet < 0 || bet > money) { System.out.println("Your answer must be between 0 and " + money + '.'); } } while (bet < 0 || bet > money); if (bet == 0) { break; } userWins = playBlackjack(); if (userWins) { money = money + bet; } else { money = money - bet; } System.out.println(); if (money == 0) { System.out.println("Looks like you've are out of money!"); break; } } System.out.println(); System.out.println("You leave with $" + money + '.'); } // end main() private boolean playBlackjack() { // Let the user play one game of Blackjack. // Return true if the user wins, false if the user loses. Vector dealerHand; // The dealer's hand. Vector userHand; // The user's hand. // Create an unshuffled deck of cards. deck = new int[52]; int cardCt = 0; // How many cards have been created so far. for (int suit = 0; suit <= 3; suit++) { for (int value = 1; value <= 13; value++) { deck[cardCt] = value; cardCt++; } } currentPosition = 0; dealerHand = new Vector(); userHand = new Vector(); /* Shuffle the deck, then deal two cards to each player. */ shuffle(); dealerHand.addElement(dealCard()); dealerHand.addElement(dealCard()); userHand.addElement(dealCard()); userHand.addElement(dealCard()); System.out.println(); System.out.println(); /* Check if one of the players has Blackjack (two cards totaling to 21). The player with Blackjack wins the game. Dealer wins ties. */ if (value(dealerHand) == 21) { System.out.println("Dealer has the " + showCard(getCard(dealerHand, 0)) + " and the " + showCard(getCard(dealerHand, 1)) + "."); System.out.println("User has the " + showCard(getCard(userHand, 0)) + " and the " + showCard(getCard(userHand, 1)) + "."); System.out.println(); System.out.println("Dealer has Blackjack. Dealer wins."); return false; } if (value(userHand) == 21) { System.out.println("Dealer has the " + showCard(getCard(dealerHand, 0)) + " and the " + showCard(getCard(dealerHand, 1)) + "."); System.out.println("User has the " + showCard(getCard(userHand, 0)) + " and the " + showCard(getCard(userHand, 1)) + "."); System.out.println(); System.out.println("You have Blackjack. You win."); return true; } /* If neither player has Blackjack, play the game. The user gets a chance to draw cards (i.e., to "Hit"). The while loop ends when the user chooses to "Stand" or when the user goes over 21. */ while (true) { /* Display user's cards, and let user decide to Hit or Stand. */ System.out.println(); System.out.println(); System.out.println("Your cards are:"); for (int i = 0; i < userHand.size(); i++) { System.out.println(" " + showCard(getCard(userHand, i))); } System.out.println("Your total is " + value(userHand)); System.out.println(); System.out.println("Dealer is showing the " + showCard(getCard(dealerHand, 0))); System.out.println(); System.out.print("Hit (H) or Stand (S)? "); char userAction; // User's response, 'H' or 'S'. do { userAction = Character.toUpperCase(scanner.next().charAt(0)); if (userAction != 'H' && userAction != 'S') { System.out.print("Please respond H or S: "); } } while (userAction != 'H' && userAction != 'S'); /* If the user Hits, the user gets a card. If the user Stands, the dealer gets a chance to draw and the game ends. */ if (userAction == 'S') { // Loop ends; user is done taking cards. break; } else { // userAction is 'H'. // Give the user a card. If the user goes over 21, the user loses. int newCard = dealCard(); userHand.addElement(newCard); System.out.println(); System.out.println("User hits."); System.out.println("Your card is the " + showCard(newCard)); System.out.println("Your total is now " + value(userHand)); if (value(userHand) > 21) { System.out.println(); System.out.println("You busted by going over 21. You lose."); System.out.println("Dealer's other card was the " + showCard(getCard(dealerHand, 1))); return false; } } } // end while loop /* If we get to this point, the user has Stood with 21 or less. Now, it's the dealer's chance to draw. Dealer draws cards until the dealer's total is > 16. */ System.out.println(); System.out.println("User stands."); System.out.println("Dealer's cards are"); System.out.println(" " + showCard(getCard(dealerHand, 0))); System.out.println(" " + showCard(getCard(dealerHand, 1))); while (value(dealerHand) <= 16) { int newCard = dealCard(); System.out.println("Dealer hits and gets the " + showCard(newCard)); dealerHand.addElement(newCard); } System.out.println("Dealer's total is " + value(dealerHand)); /* Now, the winner can be declared. */ System.out.println(); if (value(dealerHand) > 21) { System.out.println("Dealer busted by going over 21. You win."); return true; } else { if (value(dealerHand) == value(userHand)) { System.out.println("Dealer wins on a tie. You lose."); return false; } else { if (value(dealerHand) > value(userHand)) { System.out.println("Dealer wins, " + value(dealerHand) + " points to " + value(userHand) + "."); return false; } else { System.out.println("You win, " + value(userHand) + " points to " + value(dealerHand) + "."); return true; } } } } // end playBlackjack() public int dealCard() { // Deals one card from the deck and returns it. if (currentPosition == 52) { shuffle(); } currentPosition++; return deck[currentPosition - 1]; } public void shuffle() { // Put all the used cards back into the deck, and shuffle it into // a random order. for (int i = 51; i > 0; i--) { int rand = (int) (Math.random() * (i + 1)); int temp = deck[i]; deck[i] = deck[rand]; deck[rand] = temp; } currentPosition = 0; } public int getCard(Vector hand, int position) { // Get the card from the hand in given position, where positions // are numbered starting from 0. If the specified position is // not the position number of a card in the hand, then null // is returned. if (position >= 0 && position < hand.size()) { return ((Integer)hand.elementAt(position)).intValue(); } else { return 0; } } public int value(Vector hand) { // Returns the value of this hand for the // game of Blackjack. int val; // The value computed for the hand. boolean ace; // This will be set to true if the // hand contains an ace. int cards; // Number of cards in the hand. val = 0; ace = false; cards = hand.size(); for (int i = 0; i < cards; i++) { // Add the value of the i-th card in the hand. int card; // The i-th card; int cardVal; // The blackjack value of the i-th card. card = getCard(hand, i); cardVal = getCardValue(card); // The normal value, 1 to 13. if (cardVal > 10) { cardVal = 10; // For a Jack, Queen, or King. } if (cardVal == 1) { ace = true; // There is at least one ace. } val = val + cardVal; } // Now, val is the value of the hand, counting any ace as 1. // If there is an ace, and if changing its value from 1 to // 11 would leave the score less than or equal to 21, // then do so by adding the extra 10 points to val. if (ace == true && val + 10 <= 21) { val = val + 10; } return val; } public int getCardValue(int card) { int result = card; switch (card) { case 11: case 12: case 13: result = 10; } return result; } public String showCard(int card) { switch (card) { case 1: return "Ace"; case 2: return "2"; case 3: return "3"; case 4: return "4"; case 5: return "5"; case 6: return "6"; case 7: return "7"; case 8: return "8"; case 9: return "9"; case 10: return "10"; case 11: return "Jack"; case 12: return "Queen"; case 13: return "King"; default: return "??"; } } } // end class