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

2 に答える 2

2

スコープの問題がいくつかあります (Deck 変数の場合)。

要約すると、これは間違いのタイプです。

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;

コードを機能させるためにこれらの変更 ( 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;
    }

ii)チェックデッキ

    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)イニシャルドロー

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)メインで:

deck = initialDraw(deck, playersHand, dealersHand);

私は 1 つのセットについてのみ変更を提案しましたが、同じ原則を使用して他の機能を編成できます。

于 2012-11-27T11:43:22.833 に答える
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;

}

これを試して

于 2012-11-27T10:47:47.303 に答える