在我的PokerDeck
课程中,我不能让我的交易方法在不产生重复的情况下运行。谁能告诉我我做错了什么?
import java.util.*;
public class PokerDeck {
public static final int NUMBER_OF_CARDS = PokerCard.NUMBER_OF_SUITS * PokerCard.NUMBER_OF_RANKS;
// Instance Variables
private boolean[] deck;
private int numberOfCardsInDeck;
// Constructor
public PokerDeck()
{
deck = new boolean[NUMBER_OF_CARDS];
for (int j = 0; j < deck.length; j++)
for (PokerCard.CardSuit suit : PokerCard.CardSuit.values())
for (PokerCard.CardRank rank : PokerCard.CardRank.values())
deck[j] = true;
}
// Accessor
public int getNumberOfCardsInDeck() {
numberOfCardsInDeck = NUMBER_OF_CARDS;
return this.numberOfCardsInDeck;
}
// Mutator:
// Return all 52 PokerCards to this PokerDeck
public void shuffle() {
for (int i = 0; i < deck.length; i++) {
int index = (int) (Math.random() * deck.length);
deck[i] = deck[index];
}
}
// Mutator:
// Return a randomly selected PokerCard from this PokerDeck
// Update the state of this PokerDeck to reflect removal of
// the selected PokerCard
// Exception thrown if this PokerDeck is "empty"
public PokerCard deal() {
Random dealer = new Random();
int ran = dealer.nextInt(deck.length);
if (numberOfCardsInDeck == 0)
throw new RuntimeException("Empty Deck");
if (deck[ran] == false)
ran = dealer.nextInt(deck.length);
deck[ran] = false;
int suit = ran / 13;
int rank = ran % 13;
return new PokerCard(PokerCard.CardSuit.values()[suit], PokerCard.CardRank.values()[rank]);
}
}
我尝试了至少五个不同的代码,所有代码都没有运行,或者它们运行并返回重复项。
答案 0 :(得分:0)
这段代码有很多问题。你的问题是,因为你越来越随机而不是使用你在交易方法开始时声明的te ran
变量。在您宣布ran
变量后,请不要dealer.nextInt(deck.length)
,请将其替换为ran
。
你的洗牌并不是真正的洗牌,请查看:Random shuffling of an array。
比较(例如if(something == false)
)应该与==
进行比较,你正在使用=
进行比较(但你可能只是粘贴错误)。
在你的getter中numberOfCardsInDeck = NUMBER_OF_CARDS;
是错误的,除非你想要刷新&#39;一副牌,而不只是得到一些牌,但我不这么认为,删除那条线。
你的构造函数中的三元组是错的,你只需要第一个,它在这里没有区别(性能除外),但修复它。
另外我建议重写所有这些,做一个带有套装和等级枚举的卡片对象(类),用卡片对象列表制作一个Deck对象,制作一个deck.getCard()方法,从卡片中删除最后一张卡片,制作decksh的deck.shuffle()方法(现在你将有一个List of Cards,而不是一个数组,所以你可以做Collections.shuffle(cardList),简单)。
另外,改变这个:
if (deck[dealer.nextInt(deck.length)] == false)
dealer.nextInt(deck.length);
对于这样的事情:
while (deck[ran] == false)
ran = dealer.nextInt(deck.length);
答案 1 :(得分:0)
有一些可怕的错误让我想知道你读了多少自己的代码:
在这里重复使用随机:
if (deck[dealer.nextInt(deck.length)] == false)
表示您将再次随机化而不使用之前生成的ran
。
此块
if (deck[dealer.nextInt(deck.length)] == false)
dealer.nextInt(deck.length);
没用,因为dealer.nextInt(deck.length)
只是创建一个值而不存储任何东西。
我想你一直在努力,直到你找到一张有效的卡片“#34;所以看起来应该更像这样:
while (deck[ran] == false)
ran = dealer.nextInt(deck.length);
这里的Shuffle()
方法只是复制了你的牌组中的值eveywhere,因为你不是交换,而是简单地用第二个值替换第一个值,丢失第一个值。为了避免这种情况,只需添加
boolean b = deck[i];
deck[i] = deck[index];
deck[index] = b;
使其成为交换。
这是我在第一次阅读后发现的所有内容。