-1
public enum Suit
{
    CLUBS,
    HEARTS,
    SPADES,
    DIAMONDS 
}

public enum Value
{
    TWO,
    THREE,
    FOUR,
    FIVE,
    SIX,
    SEVEN,
    EIGHT,
    NINE,
    TEN,
    JACK,
    QUEEN,
    KING,
    ACE
}

Card.java

public class Card {

    private Suit suit;
    private Value value;

    public Card(Suit theSuit, Value theValue)
    {
        suit = theSuit;
        value = theValue;
    }

    public String toString()
    {
        return value + " of " + suit;
    }

    public Value getValue()
    {
        return value;
    }

    public Suit getSuit()
    {
        return suit;
    }

    public boolean equals(Card other)
    {
        if (value.ordinal() == other.value.ordinal()
                || suit.ordinal() == other.suit.ordinal())
        {
            return true;
        }
        else {
            return false;
        }
    }

}

CardPile.java

public class CardPile

{
    public Card[] cards;

    private int numCards;

    public CardPile()
    {
        this.cards = new Card[52];
        this.numCards = 0;

        // The problem is here, when I try to iterate through the enums and the
        // array to populate my cards[] of 52 objects Card it populates it with
        // 52 Card which are all ACE of DIAMONDS, it looks like the triple loops
        // populates 52 times the two last elements of my enum, but I can't
        // figure out how to fix that! Thanks in advance!

        for (Suit s : Suit.values())
        {
            for (Value v : Value.values())
            {
                for (int π = 0; π < cards.length; π++)
                {
                    cards[π] = new Card(s, v);
                }
            }
        }
    }

    public boolean isEmpty()
    {
        for (int i = 0; i < cards.length; i++)
        {
            if (cards[i] != null)
            {
                return false;
            }
        }
        return true;
    }

    public int getNumCards()
    {
        return numCards;
    }
}
4

2 に答える 2

6

問題はここにあります:

for (int π = 0; π < cards.length; π++) {
    cards[π] = new Card(s, v);
}

同じ変数sv変数を使用してインスタンスを作成し、それを配列Card内のすべての要素に割り当てて、すべてのcards(s, v) ペアの組み合わせのすべての値を置き換えます。

for-loop最初の 2秒だけを使用してコードを埋めるようにコードを変更します。

int count = 0;
for (Suit s : Suit.values()) {
    for (Value v : Value.values()) {
        if (count < cards.length) {
            cards[count++] = new Card(s, v);
        }
    }
}

ところで、π変数ように名前を使用するべきではなく、コードをインデントするようにしてください。

于 2013-03-20T17:04:11.403 に答える
1

すべてのスイートと値について、52 枚のカードすべてを反復処理し、それらをそのスーツと値に設定します。最後のスーツ/値のペアは DIAMOND と ACE であるため、最終的にすべてのカードがこのようになります。

π を使用してループを取り除き、代わりに次のようにします。

int counter = 0;
for (Suit s : Suit.values())
{
    for (Value v : Value.values())
    {
        cards[counter++] = new Card(s, v);
    }
}

それならうまくいくはずだと思います。

于 2013-03-20T17:07:51.560 に答える