2012-11-27 28 views
0

我试图解决一个问题,我尝试在绘制所有卡片后重置我的卡片组。当我到达甲板的末端时,我确实应该得到消息Deck is empty! You must recreate and reshuffle deck of cards!,但一旦甲板被重新创建并重新洗牌,它仍会不断显示此消息。我对输出感到困惑,因为它不会让我重新创建对象

因此,我将Card对象传递给Deck类,其中以堆栈方式存储在数组中。

为什么我得到这样的输出,我确实重置了一副牌?

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: 

这是我如何重置我的扑克牌:

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; 
} 

这是我如何检查,如果甲板为空:

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; 
} 

我检查之前每次甲板我画一张卡片:

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); 
} 
+1

你可以显示一段调用checkdeck()的代码吗? –

+0

为什么从createDeck()调用'deck.createDeck();'?这是一个递归调用,没有基本情况。这不是无限递归吗? –

+0

@HelpNeeder这是checkDeck()的定义,我想看看使用/调用它的那段代码。 –

回答

2

有几个作用域问题(在甲板变量)。

总之,这是错误的类型:用于获取代码工作,但是,你可以提高你的代码

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; 

我建议这些变化(WRT http://ideone.com/S4Yv3l)。

i)更改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; 
    } 

ⅱ) 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; 
    } 

ⅲ) 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; 
} 

ⅳ)在主:

deck = initialDraw(deck, playersHand, dealersHand); 

我建议只对一组事物进行更改,您可以使用相同的原则来组织其他功能。

+0

你修好了!感谢:D – HelpNeeder

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; 

}

试试这个

+0

这没有帮助。当我的牌组空时,我仍然得到相同的输出。 – HelpNeeder

+0

@Marian没有POC在'return'语句后执行。所以,“其他”是多余的。 –

+0

@ TJ.you是对的。对不起,我错了。 –