从字典随机生成并返回键和值
本文关键字:返回 键和值 字典 随机 | 更新日期: 2023-09-27 18:19:09
这是一个由2部分组成的问题,我正在制作一个21点游戏,我正在尝试随机生成一个键和值(key = string(纸牌值例如Hearts2), value = int(特定纸牌值的得分)),我想尝试返回键和值。
我有一个牌组,发牌人和玩家职业。我的Deck类有2个方法,Deck()和Shuffel(), Deck()用于创建牌组,shuffle90将洗牌()。我想把随机牌发给发牌人类发牌。我不确定是否可以返回键和值,以便经销商类方法(dealCards())可以接收字符串和int作为参数。
我还找到了一种方法来随机化我的字典,但它是随机返回整个字典,但我只需要返回一张牌。
这是到目前为止我对Deck类所做的…
这是我的
public static Dictionary<string, int> deck()
{
string[] Suite = new string[4] { "Spades", "Clubs", "Hearts", "Diamonds" };
string[] FaceValue = new string[13] { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
int score;
Dictionary<string, int> deckOfCards = new Dictionary<string, int>();
for (int s = 0; s < 4; s++)
{
string sute = Suite[s];
for (int f = 0; f < 13; f++)
{
string fV = FaceValue[f];
if (f == 0)
{
score = 0;
}
else if (f >= 9)
{
score = 10;
}
else
{
score = (f + 1);
}
string card = (sute + fV);
deckOfCards.Add(card, score);
}
}
Dictionary<string, int> ranCard = deckOfCards.Shuffle();
return ranCard;
}
正如你所看到的,我创建了两个简单的数组,并使用for循环来迭代它们,并将它们添加到字典中。
最后两行,第一行是声明一个新字典来保存随机卡片并从Shuffle()
方法接收其值,(张贴在下面),我想知道是否有方法返回ranCard.Key, ranCard.Value
?所以我可以有我的经销商类方法像这样(dealCard(string card, int score)
)?
这是我的Deck
类的Shuffle()
方法…
public static Dictionary<TKey, TValue> Shuffle<TKey, TValue>(this Dictionary<TKey, TValue> Cards)
{
Random r = new Random();
Cards = Cards.OrderBy(x => r.Next(0, Cards.Count)).ToDictionary(item => item.Key, item => item.Value);
return Cards;
}
现在使用这个方法,整个字典是随机的,如果可能的话,我想只返回一个随机值。我试图删除r.Next(**)中的参数,但仍然相同。
我用的是vs2012。
重要的事情先做。
游戏规则要求你有状态。我的意思是,你没有一个无状态的随机返回值,但是你必须在随机值的生成过程中保持状态,因为概率发生了变化。通俗地说:你不能抽同一张牌超过n次,因为游戏规则规定了牌组的组成方式。
这就是说,很明显,无论如何你必须跟踪牌组中的牌。在你的代码中,你洗牌整副牌,然后返回。现在所需要的是一个对象来包装它并在内部保持它的状态,如下所示:
class Dealer
{
private List<Card> shuffledCards; // keep state of the current shuffle
public Dealer(...)
{
shuffledCards = Shuffle(...); // use your method to get the shuffled cards
}
public Card Deal() // remove the first card from the deck and hand it out
{
Card c;
c = shuffledCards[0];
shuffledCards.RemoveAt(0);
return c;
}
}
有更多的方法来实现这一点,至少另外两个浮现在我的脑海中,但结果是一样的
这里有几个问题:
- 字典是没有顺序的——所以当你稍后迭代字典时,
OrderBy
中出牌的顺序可能不会被反映出来。我相信在当前的实现中,可能会发生这样做,但从根本上说,你不应该依赖它。 - 你的洗牌方式无论如何都不好-它可能会使早期的项目保持较早,就好像有两个项目获得相同的随机"密钥",较早的项目将首先发出。考虑使用Fisher-Yates洗牌法的一种变体——有几个关于SO的例子,比如这个。
- 你把卡片和分数放在一起作为字典键/值对的方法对我来说很尴尬……如果你避免了这个,你会发现很多其他的东西都被忽略了。
基本上,一副牌不是字典——它是牌的序列。所以你应该建模一张卡片:
public sealed class Card
{
// Fields for face value and suit, and a property to compute the score
}
如何选择表示面值和花色取决于您,但您应该考虑使用枚举,因为这里有自然的有效值集。
一旦你有了一副List<Card>
(或Queue<Card>
)牌,你可以很容易地洗牌,然后把Card
的值发给玩家。