创建两个相同但不同的卡片组,并同时从两个

时间:2018-04-04 15:12:24

标签: java

我正在利用标准的阵列驱动方法来创建,改组和绘制52张标准扑克牌。我的挑战是以两个相同但不同的甲板同时并排绘制的形式出现。

最初我认为在可执行的DeckDrawTest类中有两个Deck类实例就足够了,但是当我要求该类绘制104(52 x 2)次时,我得到了所有52张卡片中的一张牌和52张null条目。然后,我创建了一个名为Deck2的重复Deck类,并更改了所有方法和变量名称,同时保持功能相同 - 没有骰子,相同的结果。然后,我试图通过复制Deck和Deck2绘制的Card类来克服潜在的多重继承问题,使另一个类与Card相同,称为Card2,但具有不同的变量名。没有改变结果。代码如下所示。

public class Card
{
    private final String name;

    private final String suit;

    public Card(String cardName, String cardSuit) {
        this.name = cardName;
        this.suit = cardSuit;
    }

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

}

Deck2(暂时从Card提取,一旦我将其命名,就会修改名称):

public class Deck2
{
    private static final SecureRandom randomClam = new SecureRandom();
    private static final int DECKSIZE2 = 52;

    private Card[] deck = new Card[DECKSIZE2];
    private int currentCard = 0;

    public Deck2() {
        String[] names2 = {"A ", "2 ", "3 ","4 ", "5 ", "6 ", "7 ", "8 ", "9 ", "10 ", "J ", "Q ", "K "};
        String[] suits2 = {"♠ ", "♥ ", "♣ ", "♦ "};

        for (int count = 0; count < deck.length; count ++) {
            deck[count] =
                new Card(names2[count % 13], suits2[count /13]);
        }

    }

    public void shuffle2() {
        currentCard = 0;

        for (int first2 = 0; first2 < deck.length; first2++) {
            int second2 = randomClam.nextInt(DECKSIZE2);

            Card temp2 = deck[first2];
            deck[first2] = deck[second2];
            deck[second2] = temp2;
        }

    }

    public Card dealCard(){
        if (currentCard < deck.length) {
            return deck[currentCard++];
        }
        else {
            return null;
        }
    }
}

DeckDrawTest(来自DeckDeck2

public class DeckDrawTest
{
    public static void main(String[] args) {
        Deck myDeck = new Deck();
        myDeck.shuffle();
        Deck2 yourDeck = new Deck2();
        yourDeck.shuffle2();

        for(int i = 1; i <=104; i++){
            System.out.printf("%-20s", myDeck.dealCard(), "%-20s", yourDeck.dealCard());
            if(i %2 == 0) {
                System.out.println();
                System.out.println();
            }

        }

    }
}

那么如何让这个程序从两个不同但相同的甲板上绘制,而不是仅仅从一个绘制?

1 个答案:

答案 0 :(得分:1)

您的变量i最多可达104,但在每个循环中,您都会在两个套牌上调用dealCard。这是null值来自的地方。你只需要循环到52:

for (int i = 1; i <=52; i++) {

使用printf的输出错误,该函数只需要一个格式化程序。您的版本只输出myDeck.dealCard()的值,并调用(但不使用)yourDeck.dealCard()。要使用两个调用的输出创建一行,请使用以下内容:

 System.out.printf("%-20s %-20s", myDeck.dealCard(), yourDeck.dealCard());