从字典随机生成并返回键和值

本文关键字:返回 键和值 字典 随机 | 更新日期: 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的值发给玩家。