0

だから私はJavaでブラックジャックをコーディングしていて、スーツとランクの値を列挙型に保存しました

public enum Suit
{
   spades, hearts, clubs, diamonds
}



public enum Rank
{
    two, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace
}

「カード」のスタックを保持する Deck クラスがあります。カードには、スーツとランクのフィールドが含まれています。

public class Card
{
    static Suit suit;
    static Rank rank;


    Card(Suit suit, Rank rank)  
    {

    this.suit = suit;
    this.rank = rank;

    }


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

    //getters and setters ommitted
}

Deck のコンストラクターは、それぞれのスーツとランクを反復処理し、これらをパラメーターとして渡して 52 枚のカードのデッキを作成する必要がありますが、それぞれの最後の値に固執しているようで、52 個の「クラブのエース」になってしまいます. スーツとランクが正しく印刷されているように見えるのに、 add() にパラメーターとして渡されたときに誤動作しているように見える理由がわかりません。

public class Deck
{
    static Stack<Card> d = new Stack<Card>();

    Deck()
    {
    if (!d.isEmpty())
    {
        clear(); //Empties the stack if constructor is called again
    }

    for (Suit suit : Suit.values())
    {
        for (Rank rank : Rank.values())
        {
        //System.out.println(suit + " " + rank);
        //This seems to print the right values

        add(new Card(suit, rank)); //These are stuck on 'clubs' and 'ace'
        }
    }

    System.out.println(d);

    shuffle(); //Method which shuffles the deck

    }

    public static void add(Card c)
    {
    d.addElement(c);
    }

    //shuffle(), clear() and other methods omitted
}

プロジェクト全体はgithubで見ることができます。

4

3 に答える 3

4

カードのスーツとランク フィールドは静的であってはなりません。

あなたのデッキもフィールドに入れるべきではありません!

静的フィールドはクラスごとであるため、Card コンストラクターは呼び出されるたびに同じ値を上書きします。

于 2012-12-18T02:43:24.030 に答える
0

これは異常です。Deckから拡張できますStack

public class Deck
{
    static Stack<Card> d = new Stack<Card>();

その場合、コレクションから直接、、を呼び出すことができaddます。clearshuffleDeck

public class Deck extends Stack<Card> {
    //add, clear are already there from Stack
}
于 2012-12-18T02:28:03.783 に答える