我的交易方法有问题
I am having difficulty with my deal method
在我的 PokerDeck
class 中,如果不生成重复项,我无法将我的交易方法设为 运行。谁能告诉我我做错了什么?
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]);
}
}
我至少尝试了五种不同的代码,但所有代码要么没有 运行,要么 运行 和 return 重复。
这段代码有很多错误。你的问题是,因为你越来越随机而不是使用你在 deal 方法开始时声明的 te ran
变量。声明 ran
变量后,不要执行 dealer.nextInt(deck.length)
,将其替换为 ran
。
你的洗牌不是真的洗牌,检查一下:Random shuffling of an array。
比较(如if(something == false)
)应该用==
来完成,你正在用=
来做(但你可能只是粘贴错了)。
在你的 getter 这个 numberOfCardsInDeck = NUMBER_OF_CARDS;
是错误的,除非你想 'refresh' 一副牌而不是只得到一些牌,但我不这么认为,删除那条线。
你的构造函数中的三重 for 是错误的,你只需要第一个,它在这里没有什么区别(性能除外),但请修复它。
此外,我建议重写所有这些,用花色和等级枚举做一个 Card 对象 (class),用 Card 对象列表做一个 Deck 对象,做一个 deck.getCard() 方法从牌组中取出最后一张牌,制作 deck.shuffle() 洗牌的方法(你现在将有一个牌列表,而不是一个数组,所以你将能够做 Collections.shuffle(cardList) , 简单).
此外,更改此:
if (deck[dealer.nextInt(deck.length)] == false)
dealer.nextInt(deck.length);
像这样:
while (deck[ran] == false)
ran = dealer.nextInt(deck.length);
有一些可怕的错误让我想知道您阅读了多少自己的代码:
此处重用随机数:
if (deck[dealer.nextInt(deck.length)] == false)
表示你会再次随机化,不再使用之前生成的ran
。
这个街区
if (deck[dealer.nextInt(deck.length)] == false)
dealer.nextInt(deck.length);
没有用,因为 dealer.nextInt(deck.length)
只是创建一个值而不存储任何内容。
我猜你想 "keep trying until you find a valid card" 所以它应该看起来更像这样:
while (deck[ran] == false)
ran = dealer.nextInt(deck.length);
此处的 Shuffle()
方法只是简单地复制牌组中每个地方的值,因为不是交换,而是简单地将第一个值替换为第二个值,从而丢失第一个值。为避免这种情况,只需添加
boolean b = deck[i];
deck[i] = deck[index];
deck[index] = b;
使其成为交换。
这是我第一次阅读后发现的全部内容。
在我的 PokerDeck
class 中,如果不生成重复项,我无法将我的交易方法设为 运行。谁能告诉我我做错了什么?
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]);
}
}
我至少尝试了五种不同的代码,但所有代码要么没有 运行,要么 运行 和 return 重复。
这段代码有很多错误。你的问题是,因为你越来越随机而不是使用你在 deal 方法开始时声明的 te ran
变量。声明 ran
变量后,不要执行 dealer.nextInt(deck.length)
,将其替换为 ran
。
你的洗牌不是真的洗牌,检查一下:Random shuffling of an array。
比较(如if(something == false)
)应该用==
来完成,你正在用=
来做(但你可能只是粘贴错了)。
在你的 getter 这个 numberOfCardsInDeck = NUMBER_OF_CARDS;
是错误的,除非你想 'refresh' 一副牌而不是只得到一些牌,但我不这么认为,删除那条线。
你的构造函数中的三重 for 是错误的,你只需要第一个,它在这里没有什么区别(性能除外),但请修复它。
此外,我建议重写所有这些,用花色和等级枚举做一个 Card 对象 (class),用 Card 对象列表做一个 Deck 对象,做一个 deck.getCard() 方法从牌组中取出最后一张牌,制作 deck.shuffle() 洗牌的方法(你现在将有一个牌列表,而不是一个数组,所以你将能够做 Collections.shuffle(cardList) , 简单).
此外,更改此:
if (deck[dealer.nextInt(deck.length)] == false)
dealer.nextInt(deck.length);
像这样:
while (deck[ran] == false)
ran = dealer.nextInt(deck.length);
有一些可怕的错误让我想知道您阅读了多少自己的代码:
此处重用随机数:
if (deck[dealer.nextInt(deck.length)] == false)
表示你会再次随机化,不再使用之前生成的
ran
。这个街区
if (deck[dealer.nextInt(deck.length)] == false) dealer.nextInt(deck.length);
没有用,因为
dealer.nextInt(deck.length)
只是创建一个值而不存储任何内容。 我猜你想 "keep trying until you find a valid card" 所以它应该看起来更像这样:while (deck[ran] == false) ran = dealer.nextInt(deck.length);
此处的
Shuffle()
方法只是简单地复制牌组中每个地方的值,因为不是交换,而是简单地将第一个值替换为第二个值,从而丢失第一个值。为避免这种情况,只需添加boolean b = deck[i]; deck[i] = deck[index]; deck[index] = b;
使其成为交换。
这是我第一次阅读后发现的全部内容。