Kyle Funke
Kyle Funke

Reputation: 11

Null in the output while others do not have nulll

I am in a beginner's java course. I have to create a card. Then create a deck of cards and a few methods and then test it.

My card class is as follows

import java.util.*;

public class Card
{
   public final static int ACE   = 1;
   public final static int TWO   = 2;
   public final static int THREE = 3;
   public final static int FOUR  = 4;
   public final static int FIVE  = 5;
   public final static int SIX   = 6;
   public final static int SEVEN = 7;
   public final static int EIGHT = 8;
   public final static int NINE  = 9;
   public final static int TEN   = 10;
   public final static int JACK  = 11;
   public final static int QUEEN = 12;
   public final static int KING  = 13;

   public final static int CLUBS    = 1;
   public final static int DIAMONDS = 2;
   public final static int HEARTS   = 3;
   public final static int SPADES   = 4;

   private final static int NUM_FACES = 13;
   private final static int NUM_SUITS = 4;

   private int face, suit;
   private String faceName, suitName;

   private int myInt1, myInt2;

   Random rand = new Random();

   //-----------------------------------------------------------------
   //  Creates a random card.
   //-----------------------------------------------------------------
   public Card ()
   {
      face = rand.nextInt(4) + 1;
      setFaceName();

      suit = rand.nextInt(13) + 1;
      setSuitName();
   }



   //-----------------------------------------------------------------
   //  Sets the string representation of the face using its stored
   //  numeric value.
   //-----------------------------------------------------------------
   private void setFaceName()
   {
      switch (face)
      {
         case 1:
            faceName = "Ace";
            break;
         case 2:
            faceName = "Two";
            break;
         case 3:
            faceName = "Three";
            break;
         case 4:
            faceName = "Four";
            break;
         case 5:
            faceName = "Five";
            break;
         case 6:
            faceName = "Six";
            break;
         case 7:
            faceName = "Seven";
            break;
         case 8:
            faceName = "Eight";
            break;
         case 9:
            faceName = "Nine";
            break;
         case 10:
            faceName = "Ten";
            break;
         case 11:
            faceName = "Jack";
            break;
         case 12:
            faceName = "Queen";
            break;
         case 13:
            faceName = "King";
            break;
      }
   }

   //-----------------------------------------------------------------
   //  Sets the string representation of the suit using its stored
   //  numeric value.
   //-----------------------------------------------------------------
   private void setSuitName()
   {
      switch (suit)
      {
         case 1:
            suitName = "Clubs";
            break;
         case 2:
            suitName = "Diamonds";
            break;
         case 3:
            suitName = "Hearts";
            break;
         case 4:
            suitName = "Spades";
            break;
      }
   }

   //-----------------------------------------------------------------
   //  Determines if this card is higher than the passed card. The
   //  second parameter determines if aces should be considered high
   //  (beats a King) or low (lowest of all faces).  Uses the suit
   //  if both cards have the same face.
   //-----------------------------------------------------------------
   public boolean isHigherThan (Card card2, boolean aceHigh)
   {
      boolean result = false;

      if (face == card2.getFace())
      {
         if (suit > card2.getSuit())
            result = true;
      }
      else
      {
         if (aceHigh && face == ACE)
            result = true;
         else
            if (face > card2.getFace())
               result = true;
      }

      return result;
   }

   //-----------------------------------------------------------------
   //  Determines if this card is higher than the passed card,
   //  assuming that aces should be considered high.
   //-----------------------------------------------------------------
   public boolean isHigherThan (Card card2)
   {
      return isHigherThan (card2, true);
   }

   //-----------------------------------------------------------------
   //  Returns the face (numeric value) of this card.
   //-----------------------------------------------------------------
   public int getFace ()
   {
      return face;
   }

   //-----------------------------------------------------------------
   //  Returns the suit (numeric value) of this card.
   //-----------------------------------------------------------------
   public int getSuit ()
   {
      return suit;
   }

   //-----------------------------------------------------------------
   //  Returns the face (string value) of this card.
   //-----------------------------------------------------------------
   public String getFaceName ()
   {
      return faceName;
   }

   //-----------------------------------------------------------------
   //  Returns the suit (string value) of this card.
   //-----------------------------------------------------------------
   public String getSuitName ()
   {
      return suitName;
   }

   //-----------------------------------------------------------------
   //  Returns the string representation of this card, including
   //  both face and suit.
   //-----------------------------------------------------------------



   public String toString ()
   {
      return getFaceName() + " of " + getSuitName();
   }
}

My deck of cards class is as follows

import java.util.*;


public class DeckOfCards 
{

    private Card deckOfCards[];
    private int currentCardUsed;
    private final int NumberOfCards = 52;

    private int nextCard;

    private Random rand;

    String myString = "All Cards have been dealt.";




    public DeckOfCards()
    {
        deckOfCards = new Card[NumberOfCards];
        currentCardUsed = 0;

        rand = new Random();

        for(int index = 0; index < deckOfCards.length; index ++)
        {
            deckOfCards[index] = new Card();
        }
    }

    public void shuffleCards()
    {
            currentCardUsed = 0;

            for(int newCard = 0; newCard < deckOfCards.length; newCard ++)
            {
                int nextCard = rand.nextInt(NumberOfCards);

                Card temporaryDeck = deckOfCards[newCard];
                deckOfCards[newCard] = deckOfCards[nextCard];
                deckOfCards[nextCard] = temporaryDeck;
            }
    }

    public Card dealCard()
    {
        if(currentCardUsed < deckOfCards.length)
        {
            return deckOfCards[currentCardUsed ++];
        }
        else
        {
            return null;
        }
    }
}

And my driver class is as follows

public class DeckTester 
{
    public static void main(String [] args)
    {
        DeckOfCards deck = new DeckOfCards();

        deck.shuffleCards();

        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());

        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());



    }
}

Output:

Two of null
Ace of Hearts
Two of null
Four of null
Ace of null
Ace of Spades
Two of Diamonds
Ace of Clubs
Ace of null

Any help as to why not all cards have values would be greatly appreciated,

Upvotes: 1

Views: 63

Answers (3)

2787184
2787184

Reputation: 3881

Update Card constructor with following code.

public Card() {
        Random r = new Random();
        int Low = 1;
        int High = 13;
        face = r.nextInt(High - Low) + Low;
        setFaceName();

        Random r2 = new Random();
        int Low2 = 1;
        int High2 = 4;
        suit = r2.nextInt(High2 - Low2) + Low2;
        setSuitName();
    }

Upvotes: 0

Elliott Frisch
Elliott Frisch

Reputation: 201447

There are 13 faces, and 4 suits (you even defined constants). So,

face = rand.nextInt(4) + 1;
// ...
suit = rand.nextInt(13) + 1;

should be

face = rand.nextInt(13) + 1;
// ...
suit = rand.nextInt(4) + 1;

or use your previously defined Card constants, like

face = rand.nextInt(Card.NUM_FACES) + 1;
// ...
suit = rand.nextInt(Card.NUM_SUITS) + 1;

Upvotes: 0

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285403

simple error:

Change

   public Card ()
   {
      face = rand.nextInt(4) + 1;
      setFaceName();

      suit = rand.nextInt(13) + 1;
      setSuitName();
   }

to

   public Card ()
   {
      face = rand.nextInt(13) + 1;
      setFaceName();

      suit = rand.nextInt(4) + 1;
      setSuitName();
   }

Other suggestions:

  • Use enums, not magic numbers, and you wouldn't have this mess.
  • Don't create random cards, create a full deck and shuffle it.

Upvotes: 1

Related Questions