Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Hello. For some reason, my program is not stopping at 21 cards and allowing the

ID: 3603109 • Letter: H

Question

Hello. For some reason, my program is not stopping at 21 cards and allowing the player or dealer to bust. I have attached a picture of the results I have been getting back, as well as my 4 classes to run the program.

import java.util.Scanner;

public class BlackJackGame {

   public static void main (String args [])

   {

   boolean Run=true;

   Scanner input = new Scanner(System.in);

   while(Run) //loop until user exits

   {

   Deck theDeck = new Deck (1, true);

   Player me = new Player("Suz");

   Player dealer = new Player("Dealer");

  

   me.addCard(theDeck.dealNextCard());

   dealer.addCard(theDeck.dealNextCard());

   me.addCard(theDeck.dealNextCard());

   dealer.addCard(theDeck.dealNextCard());

   System.out.println("Enter you bid money Player 1");

   int money1 = input.nextInt();

   int money2= money1;

  

   System.out.println("Cards are dealt: ");

   me.printHand(true);

   dealer.printHand(false);

  

  

   boolean meDone = false;

   boolean dealerDone = false;

   String ans;

  

  

  

   while (!meDone || !dealerDone) {

   if (!meDone) {

   System.out.print("Hit [H] or Stay[S])? ");

   ans=input.next();

   //if player hits, then add next card to deck and store if player is busted

   if (ans.compareToIgnoreCase("H") == 0) {

   meDone = !me.addCard(theDeck.dealNextCard());

   me.printHand(true);

   //if busted, done

   } else {

   meDone = true;

   }

  

   }

  

   //dealer

   if (!dealerDone) {

   System.out.println("The Dealer hits. ");

   dealerDone = !dealer.addCard(theDeck.dealNextCard());

   dealer.printHand(false);

   } else {

   System.out.println("The Dealer stays. ");

   dealerDone = true;

   }

   System.out.println(dealer.getHandSum());

   System.out.println();

   }

  

   //print final hands

   me.printHand(true);

   dealer.printHand(true);

  

   int mySum = me.getHandSum();

   int dealerSum = dealer.getHandSum();

   if ((mySum > dealerSum && mySum <= 21 )|| dealerSum >21) {

   System.out.println("You win."+(money1+money2));

   } else {

   System.out.println("Dealer wins."+(money1+money2));

   }

   System.out.print("Want To Play Again (Yes or No): "); //printing

   String choice=input.next(); //taking input

   if(choice.equalsIgnoreCase("Yes")) //is yes run =true or run =false

   Run=true;

   else

   Run=false;

   }

   input.close();

   }

   }

/**

* This class displays the Deck using switch statement

* uses methods Card(int), getNumber(): void, and toString()

* @author suzettepalmer

* @version 8.1

* @since 10/23/2017

*/

public class Card {

   private int myNumber;

  

   /**

   * Number of card: Ace = 1, Jack = 11, Queen = 12, King = 13

   * @param aNumber = Number of the Card

   * @return Number of Card

   */

   public Card(int aNumber)

   {

       if (aNumber >=1 && aNumber <= 13)

       {

  

           this.myNumber = aNumber;

          

       } else {

           System.err.println(aNumber + "is not valid.");

           System.exit(1); //tells program error and exits program

       }

      

  

   }

  

  

   public int getNumber()

   {

       return myNumber;

   }

  

   /**

   * Switch statement for deck

   * @return numStr

   */

   public String toString() //returns name of card

   {

       String numStr = "Error";

      

       switch(this.myNumber)

       {

       case 1:

           numStr = "Ace";

           break;

       case 2:

           numStr = "Two";

           break;

       case 3:

           numStr = "Three";

           break;

       case 4:

           numStr = "Four";

           break;

       case 5:

           numStr = "Five";

           break;

       case 6:

           numStr = "Six";

           break;

       case 7:

           numStr = "Seven";

           break;

       case 8:

           numStr = "Eight";

           break;

       case 9:

           numStr = "Nine";

           break;

       case 10:

           numStr = "Ten";

           break;

       case 11:

           numStr = "Jack";

           break;

       case 12:

           numStr = "Queen";

           break;

       case 13:

           numStr = "King";

           break;

      

       }

      

       return numStr;

   }

}

import java.util.Random;

/**

* This class displays the Deck with random shuffling and decreases number of cards in deck

* uses methods Deck(int, boolean), dealNextCard(), shuffle():void and printDeck(int)

* @author suzettepalmer

* @version 8.1

* @since 10/23/2017

*/

public class Deck {

  

   /**

   * array of cards in deck, where top card is the first index

   */

   private Card [] myCards;

  

   /**

   * Number of cards that are in deck

   */

   private int numCards;

  

  

   public Deck(int numCards, boolean shuffle)

   {

      

       Random rng = new Random();

      

       Card temp; //temporary value used to perform swap to prevent data from being lost

      

       int j;

       for (int i = 0; i < this.numCards; i++) {

           j = rng.nextInt(this.numCards);

          

       temp = this.myCards[i];

       this.myCards[i] = this.myCards[j];

       this.myCards[j] = temp;

          

          

       }  

      

      

       this.numCards = 52;

       this.myCards = new Card [this.numCards];

      

      

       int c = 0; // initiate card index

      

  

       for (int n = 1; n <= 13; n++)    //for each number

       {

          

          

           this.myCards[c] = new Card(n); //add new card to deck and increment

           c++;

      

       }

  

   }

/**

* @param shuffle: shuffle before play

* @return void

*/

public void shuffle()

{

/**

* Deal top card

* @return dealt card

*/

}  

public Card dealNextCard() {

  

       Card top = this.myCards [0];

      

  

  

       for (int c = 1; c < this.numCards; c++)    //shift cards by 1 to the left

       {

           this.myCards[c-1] = this.myCards[c];

       }

       this.myCards[this.numCards-1] = null; //when last card is used.

      

  

       this.numCards--;    //decrement the number of cards in deck

      

       return top;

}

/**

* Print top of cards on deck

* @param numToPrint (# of cards from the top of deck to print)

*/

public void printDeck(int numToPrint)

{

   for (int c =0; c<numToPrint; c++)

   {

       //printf gives string and formatting guidelines; allows formating string, %3d print integer with width of 3 and padded to L with spaces, %s print string print new line

       System.out.printf("% 3d/%d%s ", c+1, this.numCards, this.myCards[c].toString());

       System.out.printf(" ");

   }

  

}

/**

* initiate hand and set max value of cards player/dealer can have

* uses methods Player(String), emptyHand(), addCard(Card), getHandSum(), printHand(boolean)

* @author suzettepalmer

* @version 8.1

* @since 10/23/2017

*/

public class Player {

   private String name;

  

   private Card[] hand = new Card [10]; //allocating memory block for cards drawn

  

   private int numCards;

  

   public Player (String aName)

   {

       this.name = aName;

      

      

       //set player's hand to zero

       this.emptyHand();

   }

   /**

   * Sets parameters for game initiation

   * @param player's hand is 0.

   * @return null

   */

   public void emptyHand() {

  

       for (int c = 0; c <10; c++)

       {

           this.hand[c] = null;

       }

      

       this.numCards = 0; //defaults to 0 if not specified

       }  

   /**

   * return handSum within bounds for each draw. If over 21, bust.

   * @param aCard

   * @return handSum

   */

   public boolean addCard(Card aCard) {

      

       if (this.numCards == 10) {

           System.err.printf("%s's hand already has 10 cards; " + "cannot add another ", this.name);

           System.exit(1);

       }

      

       this.hand[this.numCards] = aCard;

       this.numCards++;

      

       return (this.getHandSum() <= 21);

   }

  

   public int getHandSum() {

      

       int handSum = 0;

       int cardNum;

       int numAces = 0;

      

       for (int c = 0; c <this.numCards; c++) {

           cardNum = this.hand[c].getNumber();

          

           if (cardNum == 1) {

               numAces++;

               handSum += 11;

           } else if (cardNum > 10) {

               handSum += 10;

           } else {

               handSum += cardNum;

           }

       }

      

       while (handSum >21 && numAces > 0) {

           handSum -= 10;

           numAces--;

       }

       return handSum;

   }

   /**

   * Print First Card

   * @param showFirstCard

   */

   public void printHand(boolean showFirstCard) {

       System.out.printf("%s's cards : ", this.name);

       for (int c = 0; c<this.numCards; c++) {

       System.out.printf(" %s ", this.hand[c].toString());

   }

   }

Enter you bid money Player 1 200 Cards are dealt: Suz's cards: Ace Three -1. Dealer's cards : Two Four Hit [H] or Stay[S])? H Suz's cards: Ace Three Five The Dealer hits. Dealer's cards: Two Four Six 12 Hit [H] or Stay[S])? H -1. Suz's cards: Ace Three at Five Seven The Dealer hits. Dealer's cards: ro Two Four Six wn.j Eight 1, 20 Hit [H] or Stay[S])? H Suz's cards tio Ace tio Three Five Seven Nine The Dealer hits Dealer's cards: Two Four Six Eight Ten Va 30 Suz's cards: Ace Three Five

Explanation / Answer

public class BlackJackGame {

   public static void main (String args [])

   {

   boolean Run=true;

   Scanner input = new Scanner(System.in);

   while(Run) //loop until user exits

   {

   Deck theDeck = new Deck (1, true);

   Player me = new Player("Suz");

   Player dealer = new Player("Dealer");

  

   me.addCard(theDeck.dealNextCard());

   dealer.addCard(theDeck.dealNextCard());

   me.addCard(theDeck.dealNextCard());

   dealer.addCard(theDeck.dealNextCard());

   System.out.println("Enter you bid money Player 1");

   int money1 = input.nextInt();

   int money2= money1;

  

   System.out.println("Cards are dealt: ");

   me.printHand(true);

   dealer.printHand(false);

  

  

   boolean meDone = false;

   boolean dealerDone = false;

   String ans;

  

  

  

   while (!meDone || !dealerDone) {

   if (!meDone) {

   System.out.print("Hit [H] or Stay[S])? ");

   ans=input.next();

   //if player hits, then add next card to deck and store if player is busted

   if (ans.compareToIgnoreCase("H") == 0) {

   meDone = !me.addCard(theDeck.dealNextCard());

   me.printHand(true);

   //if busted, done

   } else {

   meDone = true;

   }

  

   }

  

   //dealer

   if (!dealerDone) {

   System.out.println("The Dealer hits. ");

   dealerDone = !dealer.addCard(theDeck.dealNextCard());

   dealer.printHand(false);

   } else {

   System.out.println("The Dealer stays. ");

   dealerDone = true;

   }

   System.out.println(dealer.getHandSum());

   System.out.println();

   }

  

   //print final hands

   me.printHand(true);

   dealer.printHand(true);

  

   int mySum = me.getHandSum();

   int dealerSum = dealer.getHandSum();

   if ((mySum > dealerSum && mySum <= 21 )|| dealerSum >21) {

   System.out.println("You win."+(money1+money2));

   } else {

   System.out.println("Dealer wins."+(money1+money2));

   }

   System.out.print("Want To Play Again (Yes or No): "); //printing

   String choice=input.next(); //taking input

   if(choice.equalsIgnoreCase("Yes")) //is yes run =true or run =false

   Run=true;

   else

   Run=false;

   }

   input.close();

   }

   }

/**

* This class displays the Deck using switch statement

* uses methods Card(int), getNumber(): void, and toString()

* @author suzettepalmer

* @version 8.1

* @since 10/23/2017

*/

public class Card {

   private int myNumber;

  

   /**

   * Number of card: Ace = 1, Jack = 11, Queen = 12, King = 13

   * @param aNumber = Number of the Card

   * @return Number of Card

   */

   public Card(int aNumber)

   {

       if (aNumber >=1 && aNumber <= 13)

       {

  

           this.myNumber = aNumber;

          

       } else {

           System.err.println(aNumber + "is not valid.");

           System.exit(1); //tells program error and exits program

       }

      

  

   }

  

  

   public int getNumber()

   {

       return myNumber;

   }

  

   /**

   * Switch statement for deck

   * @return numStr

   */

   public String toString() //returns name of card

   {

       String numStr = "Error";

      

       switch(this.myNumber)

       {

       case 1:

           numStr = "Ace";

           break;

       case 2:

           numStr = "Two";

           break;

       case 3:

           numStr = "Three";

           break;

       case 4:

           numStr = "Four";

           break;

       case 5:

           numStr = "Five";

           break;

       case 6:

           numStr = "Six";

           break;

       case 7:

           numStr = "Seven";

           break;

       case 8:

           numStr = "Eight";

           break;

       case 9:

           numStr = "Nine";

           break;

       case 10:

           numStr = "Ten";

           break;

       case 11:

           numStr = "Jack";

           break;

       case 12:

           numStr = "Queen";

           break;

       case 13:

           numStr = "King";

           break;

      

       }

      

       return numStr;

   }

}

import java.util.Random;

/**

* This class displays the Deck with random shuffling and decreases number of cards in deck

* uses methods Deck(int, boolean), dealNextCard(), shuffle():void and printDeck(int)

* @author suzettepalmer

* @version 8.1

* @since 10/23/2017

*/

public class Deck {

  

   /**

   * array of cards in deck, where top card is the first index

   */

   private Card [] myCards;

  

   /**

   * Number of cards that are in deck

   */

   private int numCards;

  

  

   public Deck(int numCards, boolean shuffle)

   {

      

       Random rng = new Random();

      

       Card temp; //temporary value used to perform swap to prevent data from being lost

      

       int j;

       for (int i = 0; i < this.numCards; i++) {

           j = rng.nextInt(this.numCards);

          

       temp = this.myCards[i];

       this.myCards[i] = this.myCards[j];

       this.myCards[j] = temp;

          

          

       }  

      

      

       this.numCards = 52;

       this.myCards = new Card [this.numCards];

      

      

       int c = 0; // initiate card index

      

  

       for (int n = 1; n <= 13; n++)    //for each number

       {

          

          

           this.myCards[c] = new Card(n); //add new card to deck and increment

           c++;