我正在研究一个二十一点程序,试图学习C#。我有一个卡类,以及一个由卡组成的卡座阵列对象。我使用了deck数组来填充一个deckInPlay列表(卡片),它实际上将在游戏中使用。我选择在游戏中使用列表而不是数组,因为列表可以动态地改变大小。到目前为止,我已经能够解决自己的问题了,但是现在我已经创建了一个shuffleDeck方法,我遇到了一个让我感到困惑的问题。
让我们从shuffleDeck方法的代码开始(我在经销商类构造函数中将Random实例化为rnd):
public void shuffleDeck(int timesToShuffle)
{
for (int i = 0; i <= timesToShuffle; i++)
{
for (int j = 0; j < 52; j++)
{
int randomNumber = rnd.Next(0, deckInPlay.Count - 1);
Card randomCard = deckInPlay[randomNumber];
shuffler.Add(randomCard);
deckInPlay.RemoveAt(randomNumber);
}
for (int j = 0; j < 52; j++)
{
int randomNumber = rnd.Next(0, shuffler.Count - 1);
Card randomCard = shuffler[randomNumber];
deckInPlay.Add(randomCard);
shuffler.RemoveAt(randomNumber);
}
}
}
正如你所看到的,我正在使用两个列表:deckInPlay列表,它是我想在游戏中使用的实际牌组,以及洗牌器列表,主要用于帮助洗牌。我打算让代码从deckInPlay列表中取出随机卡,然后将它们逐个添加到洗牌器列表中,同时从deckInPlay列表中删除卡片。然后我想要反向过程:从洗牌器列表中取出随机牌并将它们添加到deckInPlay列表中,从过程中的洗牌器列表中删除每张牌。
乍一看,似乎洗牌工作正常。当使用大于1的参数调用shuffleDeck时,它的效果会更好。但无论参数是什么,有一点都保持不变:黑桃之王总是洗牌过程后列表中的最后一张牌。黑桃之王恰好是我的初始牌组和deckInPlay列表中的默认最后一张牌。我不明白我在哪里错了。如果你能给我一个线索,我真的很感激。谢谢你的阅读!
答案 0 :(得分:7)
下一个的最大值是独占,所以这意味着你没有达到这个数字,然后我怀疑你的黑桃王#34;在你的牌组中是52号。
答案 1 :(得分:5)
使用
int randomNumber = rnd.Next(0, shuffler.Count);
rnd.Next在你的例子中得到一个从0到Count-1的数字,但不包括那个上限。