基本扑克计划 - 印刷甲板

时间:2014-12-06 21:25:37

标签: java arrays unit-testing poker

我正在制作一个扑克项目,该项目只是从洗牌的牌组中处理5张顶级牌,让用户拒绝全部,部分或全部。据我所知,理想情况下应该有2-3个班级,一个是实际的主,另外两个是卡和卡。我创建了Deck类和一个非常基本的Tester程序,它只是打印洗牌。然而,当我打印甲板时,我得到的东西是" Deck @ ### d ## a"。我做错了什么?

import java.util.Random;

public class Deck {
// Constructing a deck from two arrays
String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" };
String[] rank = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" };
String[] deck = new String[suit.length * rank.length];

// Storing public variables
int suits = suit.length;
int ranks = rank.length;
int deckSize = deck.length;

public Deck()
{
    for(int i = 0; i < suits; i++)
    {
        for(int j = 0; j < ranks; j++)
        {
            deck[ranks*i + j] = rank[j] + " of " + suit[i];
        }
    }
}

// Fisher-Yates Shuffle 
public void shuffle()
{
    Random rand = new Random();
    for (int i = 0; i < deckSize; i++) 
    {
        int x = rand.nextInt(deckSize);
        String temp = deck[x];
        deck[x] = deck[i];
        deck[i] = temp;
    }

}

}

测试人员班:

import java.util.Scanner;

public class DeckTester {
public static void main(String[] args) {
    Deck deck = new Deck();

    System.out.println(deck);
}

}

输出:Deck @ ### d ### a

2 个答案:

答案 0 :(得分:2)

您正在从Object类中看到默认的`toString()方法,并且您发现它不太有用。你也没有创建一个Card或一个真正的Deck类,所以你不能给任何类一个像样的toString()方法。

解决方案:

  • 创建卡类。
  • 给它一个等级和一个值字段。
  • 给它一个toString()方法。
  • 创建一个甲板类
  • 给它一组卡片。
  • 给它一个体面的toString()方法。

如,

// for Deck
@Override 
public String toString() {
   StringBuilder sb = new StringBuilder();
   for (Card card: cards) {
      sb.append(card.toString() + ", ");
   }
   return sb.toString();
}

答案 1 :(得分:0)

打印对象会调用其toString()方法。如果您的班级或其任何祖先未覆盖toString(),则会调用默认值,即toString()的{​​{1}}方法。

但是默认的Object并不是很聪明 - 它只是为你提供了套牌的名称和哈希码。

所以非常推荐,对于您要打印的任何类(甚至是那些您不打算但又可能需要调试的类)来覆盖toString()方法。在重写方法中,您应该构造一个表示类内容的字符串。它可以像在您的情况下调用toString()一样简单。

另外,请注意您已经定义了一个Arrays.toString()方法,但实际上并没有从任何地方调用它,因此一旦您成功打印了套牌,它就不会被洗牌。