我犯了一个新手的错误,并试图找出一个修复而不重新编码整个程序。这是场景:
我正在从52张牌组创造6张牌。这些卡有2个字段:int rank和char suit。我正在拉随机排名并且适合并创建每张卡的新的未命名实例。这不是重复的原因。
所以我成功创建了6张卡,但我不想要重复。这可能是一个新的问题,但我们都在那里:)谢谢你的帮助!
public void displayCards(List<ImageView> disp) {
int cardNumber = 0;
for (ImageView c : disp) {
cardNumber++;
rank = rand(13) + 2;
int i = rand(4);
if (i == 0) {
suit = 's';
} else if (i == 1) {
suit = 'h';
} else if (i == 2) {
suit = 'd';
} else {
suit = 'c';
}
if (cardNumber == 1) {
dc1 = new Card(rank, suit);
} else if (cardNumber == 2) {
dc2 = new Card(rank, suit);
} else if (cardNumber == 3) {
dc3 = new Card(rank, suit);
} else if (cardNumber == 4) {
pc1 = new Card(rank, suit);
} else if (cardNumber == 5) {
pc2 = new Card(rank, suit);
} else {
pc3 = new Card(rank, suit);
}}
答案 0 :(得分:4)
选项1:使用两个(嵌套)循环(所有套装和所有等级)创建52张牌的完整套牌(例如,在列表中)。随机播放(使用Collections.shuffle()
)牌组并取六张牌。
选项2:只需创建所需的卡数(就像您尝试的那样)。在这里,您需要将每张卡片放入Set<Card>
,直到该卡片具有所需数量的卡片。基本上,重复项将在集合中消失。为此,您需要为Card类实现equals()
和hashcode()
。
答案 1 :(得分:2)
创建所有52张牌的牌组并从牌组中提取牌。您还应该使用枚举器来表示排名和诉讼。
请参阅What variables do I have to compare in this java code?中的答案,例如卡片代码和套牌。
答案 2 :(得分:1)
首先,如果您尚未完成,请覆盖equals()
课程中的hashCode()
和Card
。
其次,将已创建的卡添加到Set
(这可以保证它不包含重复项)
修改你的代码:
public void displayCards(List<ImageView> disp) {
int cardNumber = 0;
Set<Card> myCards = new HashMap<Card>();
for (ImageView c : disp) {
cardNumber++;
Card newCard;
do {
rank = rand(13) + 2;
int i = rand(4);
if (i == 0) {
suit = 's';
} else if (i == 1) {
suit = 'h';
} else if (i == 2) {
suit = 'd';
} else {
suit = 'c';
}
newCard = new Card(rank, suit);
} while(myCards.contains(newCard));
myCards.add(newCard);
if (cardNumber == 1) {
dc1 = newCard;
} else if (cardNumber == 2) {
dc2 = newCard;
} else if (cardNumber == 3) {
dc3 = newCard;
} else if (cardNumber == 4) {
pc1 = newCard;
} else if (cardNumber == 5) {
pc2 = newCard;
} else {
pc3 = newCard;
}
}