0

I'm trying to solve a problem where I try to reset my deck of cards once I've draw all cards. When I reach the end of the deck I should indeed get message Deck is empty! You must recreate and reshuffle deck of cards! but once deck has been recreated and re-shuffled it still keeps showing up this message.

So I am passing Card object to Deck class where is stored in array in stack fashion.

Why am I getting such output where I do indeed reset the deck of cards?

deal, bet, hit, stay, split, leave: deal

Drawing Player's card... 9 ♥
Drawing Dealer's card... A ♣
Drawing Player's card... 7 ♦
Drawing Dealer's card... K ♦

Dealers Hand: K_♦ A_♣ = 21
Players Hand: 7_♦ 9_♥ = 16

Dealer has BLACKJACK!

deal, bet, hit, stay, split, leave: deal

Deck is empty! You must recreate and reshuffle deck of cards!
Creating deck...
Shuffling deck...
Drawing Player's card... 7 ♥
Drawing Dealer's card... 5 ♥
Drawing Player's card... K ♠
Drawing Dealer's card... 6 ♦

Dealers Hand: 6_♦ 5_♥ = 11
Players Hand: K_♠ 7_♥ = 17

deal, bet, hit, stay, split, leave: deal

Deck is empty! You must recreate and reshuffle deck of cards!
Creating deck...
Shuffling deck...
Drawing Player's card... Q ♦
Drawing Dealer's card... 9 ♥
Drawing Player's card... 8 ♥
Drawing Dealer's card... 10 ♠

Dealers Hand: 10_♠ 9_♥ = 19
Players Hand: 8_♥ Q_♦ = 18

deal, bet, hit, stay, split, leave: deal

Deck is empty! You must recreate and reshuffle deck of cards!
Creating deck...
Shuffling deck...
Drawing Player's card... 3 ♣
Drawing Dealer's card... 6 ♠
Drawing Player's card... 4 ♠
Drawing Dealer's card... K ♠

Dealers Hand: K_♠ 6_♠ = 16
Players Hand: 4_♠ 3_♣ = 7

deal, bet, hit, stay, split, leave:

This is how I reset my deck of cards:

private static Deck createDeck(Deck deck)
{
    System.out.println("Creating deck...");
    deck = new Deck(DECKSIZE);
    deck.createDeck();

    System.out.println("Shuffling deck...");
    deck.shuffleDeck();

    return deck;
}

This is how I check if deck is empty or not:

private static Deck checkDeck(Deck deck)
{
    if(deck == null)
        return createDeck(deck);
    if(deck.isEmpty())
    {
        deck = new Deck(DECKSIZE);
        System.out.print("Deck is empty! You must recreate and reshuffle deck of cards!\n");
        return createDeck(deck);
    }
    else
        return deck;
}

I check the deck every time before I draw a card:

public static void drawFromDeck(Deck deck, Hand hand)
{
    deck = checkDeck(deck);

    Card temp = new Card(deck.pop());
    System.out.println("Drawing " + hand.getName() + "'s card... " + temp.toString());
    hand.insert(temp);

    System.out.print("\n");
}

initialDraw()

private static void initialDraw(Deck deck, Hand player, Hand dealer)
{
    deck = checkDeck(deck);
    drawFromDeck(deck, player); // drawing players card
    deck = checkDeck(deck);
    drawFromDeck(deck, dealer); // drawing dealers card
    deck = checkDeck(deck);
    drawFromDeck(deck, player); // drawing players card
    deck = checkDeck(deck);
    drawFromDeck(deck, dealer); // drawing dealers card

    System.out.print("Dealers Hand:");
    dealer.displayHand();
    System.out.print(" = " + dealer.getHandTotal() + "\n");
    System.out.print("Players Hand:");
    player.displayHand();
    System.out.print(" = " + player.getHandTotal() + "\n");

    checkInitialDraw(player, dealer);
}
HelpNeeder
  • 6,383
  • 24
  • 91
  • 155
  • 1
    Can you show the piece of code that calls checkdeck() ? – TJ- Nov 27 '12 at 10:42
  • Why are you invoking `deck.createDeck();` from createDeck()? That's a recursive call, without a base case. Doesn't that goe into infinite recursion? – Rohit Jain Nov 27 '12 at 10:44
  • @HelpNeeder That's the definition of checkDeck(), I want to see the piece of code which uses/calls it. – TJ- Nov 27 '12 at 10:45
  • @Rohit Jain, because my Deck class has it's own createDeck() – HelpNeeder Nov 27 '12 at 10:45
  • @HelpNeeder.. Ah! sorry, didn't see that you have invoked a different signature. – Rohit Jain Nov 27 '12 at 10:46
  • @ TJ, ok added on the bottom of my OP. – HelpNeeder Nov 27 '12 at 10:47
  • @HelpNeeder you need to show the complete call stack. The only reason why the "Deck is empty! You ..." message is shown because deck IS empty. Now where does drawFromDeck get the deck? Can you show your for/while loop that's repeating? I suspect that you are using something like deck = new Deck() inside the loop. – TJ- Nov 27 '12 at 10:49
  • @TJ, If it's really empty how can it draw more cards? I pop all cards out of Card stack, so no cards should be left. If I draw additional card it must come from somewhere... – HelpNeeder Nov 27 '12 at 10:52
  • If it is empty, you are creating the deck again. See your code :) – TJ- Nov 27 '12 at 10:53
  • @TJ, yes, then why is it telling me I must create new deck next time I enter deal? – HelpNeeder Nov 27 '12 at 10:54
  • Because it is empty! the 'deck' that you are passing is empty -> most probably a new object. Somewhere the 'deck' that you just created, is being reset. That's why I would prefer if you could show your complete caller code - otherwise I think I might just be talking in the air. – TJ- Nov 27 '12 at 10:55
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/20161/discussion-between-tj-and-helpneeder) – TJ- Nov 27 '12 at 10:58

2 Answers2

2

There are a couple of scoping issue (for the Deck variable).

To summarize, this is the type of mistake:

void createObj(MyObject objt)
{
    objt = new MyObject(); //Local Scope
}
//Caller
MyObject obj = null;
createObj(obj); // <-- New object will be created only within the function, obj will remain unaffected.
// obj is still null;

I suggest these changes (wrt http://ideone.com/S4Yv3l) for getting the code to work, however, you can improve your code.

i) Change the signature of createDeck.

    private static Deck createDeck()
    {
        System.out.println("Creating deck...");
        Deck deck = new Deck(DECKSIZE);
        deck.createDeck();

        System.out.println("Shuffling deck...");
        deck.shuffleDeck();

        return deck;
    }

ii) CheckDeck

    private static Deck checkDeck(Deck deck)
    {
        if(deck == null)
            return createDeck();

        if(deck.isEmpty())
        {
            System.out.print("Deck is empty! You must recreate and reshuffle deck of cards!\n");
            return createDeck();
        }

        return deck;
    }

iii) InitialDraw

private static Deck initialDraw(Deck deck, Hand player, Hand dealer)
{
    deck = checkDeck(deck);
    drawFromDeck(deck, player); // drawing players card
    deck = checkDeck(deck);
    drawFromDeck(deck, dealer); // drawing dealers card
    deck = checkDeck(deck);
    drawFromDeck(deck, player); // drawing players card
    deck = checkDeck(deck);
    drawFromDeck(deck, dealer); // drawing dealers card

    System.out.print("Dealers Hand:");
    dealer.displayHand();
    System.out.print(" = " + dealer.getHandTotal() + "\n");
    System.out.print("Players Hand:");
    player.displayHand();
    System.out.print(" = " + player.getHandTotal() + "\n");

    checkInitialDraw(player, dealer);
    return deck;
}

iv) In Main :

deck = initialDraw(deck, playersHand, dealersHand);

I have suggested changes only for one set of things, you can use the same principle to organize the other functions.

TJ-
  • 14,085
  • 12
  • 59
  • 90
0
 if(deck == null)
    return createDeck(deck);
else if(deck.isEmpty())
{
    deck = new Deck(DECKSIZE);
    System.out.print("Deck is empty! You must recreate and reshuffle deck of cards!\n");
    return createDeck(deck);
}
else
    return deck;

}

Try this