我正在利用标准的阵列驱动方法来创建,改组和绘制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
(来自Deck
和Deck2
)
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();
}
}
}
}
那么如何让这个程序从两个不同但相同的甲板上绘制,而不是仅仅从一个绘制?
答案 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());