1

我正在尝试构建二十一点游戏。我已经创建了一个套牌,现在我想展示它。

我知道我做错了什么,因为我无法在 CardStack 类中访问 displayStack。另外,我有一种感觉,我没有正确地进行继承。我该如何解决这个问题?

这是我的代码:

public class CreateCardDeck {
    int deckSize = 52;
    CardStack cardStack = new CardStack(deckSize);

    public void CreateDeck() {
        String[] suit = {"clubs", "diamonds", "hearts", "spades"};
        int[] rank = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

        for (int i = 0; i < rank.length; i ++) {
            for (int j = 0; j < suit.length; j++) {
                cardStack.push(suit[j], rank[i]);
            }
        }
    }
}

卡类:

class Card {
    String suit;
    int rank;

    Card(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public String getSuit() {
        return suit;
    }

    public String getRank() {
        String nameTheRank;
        if (rank == 1)
            nameTheRank = "Ace";
        else if (rank == 11)
            nameTheRank = "Jack";
        else if (rank == 12)
            nameTheRank = "Queen";
        else if (rank == 13)
            nameTheRank = "King";
        else
            nameTheRank = String.valueOf(rank);
        return nameTheRank;
    }
}

CardStack 类:

class CardStack {
    public void displayDeck() {
        for (int i = 0; i < stackArray.length; i ++)
            System.out.println(stackArray[i]);
    }
}

主类:

public class MainClass {
    public static void main(String[] args) throws IOException {
        CreateCardDeck c = new CreateCardDeck();
        c.CreateDeck();
        // How to display my deck?
    }
}
4

4 回答 4

2

我会重新设计你的类型开始。CreateCardDeck听起来它应该是一个createDeck在一个CardDeck或可能只是Card类型中调用的静态方法。听起来花色和数字的知识也不应该成为该方法的一部分。卡片通常用作 Java 中枚举的演示 - 一个枚举用于值(从王牌到国王),一个用于花色。

想想拥有一个实例CreateCardDeck真正含义——这对你来说真的有意义吗?感觉更像是动词(一种方法)而不是名词(一种类型)。

现在你可以有一个CardDeckFactory或类似的东西——但我不希望牌组成为对象状态的一部分;它只会由方法返回。

于 2012-11-14T07:31:20.933 回答
1

你在找这个,即。扩展类CreateCardDeck并引用它的cardStack变量?

 class Card extends CreateCardDeck
 {
    public void displayDeck()
    {
        for (int i = 0; i < cardStack.size(); i ++)
            System.out.println(cardStack.get(i));
    }
 }
于 2012-11-14T07:33:17.253 回答
1

让我们尽可能简单:你需要一张牌才能开始打牌,这样更好。
然后你需要一个甲板来储存你所有的卡。

所以你可以只有两个类:Deck 和 Card。当你创建一个套牌实例时,它会生成你需要玩的 52 张牌。

public class Card{}

public class Deck
{
    int deckSize = 52;
    // Here you certainly need a list or a stack to stock your card
    SomeContainer cardStack;

    public Deck()
    {
        String[] suit = {"clubs", "diamonds", "hearts", "spades"};
        int[] rank = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

        for (int i = 0; i < rank.length; i ++)
        {
            for (int j = 0; j < suit.length; j++)
            {
                cardStack.push(new Card(suit[j], rank[i]));
            }
        }
    }

    public void Display()
    {
        for (int i = 0; i < cardStack.length; i ++)
            System.out.println(cardStack[i]);
    }
}

public class MainClass 
{
    public static void main(String[] args) throws IOException
    {
        Deck deck = new Deck();
        deck.Display();
    }
}
于 2012-11-14T07:45:46.897 回答
1

你没有显示你的 CardStack 类,也没有显示所有的 Card 类

基本上你应该有一个 showCards() 方法,而且在卡片本身中,实现代表卡片的 toString 会很有用:像这样:

假设您有一个卡片列表或数组:

public void showCards() {
   for (Card card : cards) {
       System.out.println(card);
   }
}

并在卡片中:

public class Card {

   private String suit;
   private int rank;

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

   //...the rest of the code   
} 

在 CreateCardDeck 添加一个吸气剂:

public CardSTack getCardStack() {
    return cardStack; 
}

然后在你的主要只是添加:

c.getCardStack().showCards();
于 2012-11-14T07:47:18.110 回答