c# - 我如何在 C# 中处理这副牌(字典)

标签 c# asp.net .net

我有 2 个玩家,我希望他们每个人都能从这 52 张卡片中随机获得 26 张。有谁知道我如何从 52 张牌组中随机给每位玩家 26 张牌?

这应该清空原来的 52 张卡片组字典,并创建 2 个较小的 26 张卡片组字典。

我已经为此苦苦挣扎了 3 天,并且已经完成了我能做的所有研究。 这是我的甲板类:

class Deck
{
    public Dictionary<int, string> CreateNewDeck()
    {
        Dictionary<int, string> newDeck = new Dictionary<int, string>()
        {
            {1, "~/cards/c1.png"}, {2, "~/cards/c2.png"}, {3, "~/cards/c3.png"}, {4, "~/cards/c4.png"},
            {5, "~/cards/c5.png"}, {6, "~/cards/c6.png"}, {7, "~/cards/c7.png"}, {8, "~/cards/c8.png"},
            {9, "~/cards/c9.png"}, {10, "~/cards/c10.png"}, {11, "~/cards/cj.png"}, {12, "~/cards/cq.png"}, {13, "~/cards/ck.png"},
            {14, "~/cards/d1.png"}, {15, "~/cards/d2.png"}, {16, "~/cards/d3.png"}, {17, "~/cards/d4.png"},
            {18, "~/cards/d5.png"}, {19, "~/cards/d6.png"}, {20, "~/cards/d7.png"}, {21, "~/cards/d8.png"},
            {22, "~/cards/d9.png"}, {23, "~/cards/d10.png"}, {24, "~/cards/dj.png"}, {25, "~/cards/dq.png"}, {26, "~/cards/dk.png"},
            {27, "~/cards/h1.png"}, {28, "~/cards/h2.png"}, {29, "~/cards/h3.png"}, {30, "~/cards/h4.png"},
            {31, "~/cards/h5.png"}, {32, "~/cards/h6.png"}, {33, "~/cards/h7.png"}, {34, "~/cards/h8.png"},
            {35, "~/cards/h9.png"}, {36, "~/cards/h10.png"}, {37, "~/cards/hj.png"}, {38, "~/cards/hq.png"}, {39, "~/cards/hk.png"},
            {40, "~/cards/s1.png"}, {41, "~/cards/s2.png"}, {42, "~/cards/s3.png"}, {43, "~/cards/s4.png"},
            {44, "~/cards/s5.png"}, {45, "~/cards/s6.png"}, {46, "~/cards/s7.png"}, {47, "~/cards/s8.png"},
            {48, "~/cards/s9.png"}, {49, "~/cards/s10.png"}, {50, "~/cards/sj.png"}, {51, "~/cards/sq.png"}, {52, "~/cards/sk.png"},
        };
        return newDeck;
    }
}

下面是我尝试编写的划分牌组的方法 正如您可能看到的那样,我是一个新手:

class Dealer
{
    public Dictionary<int, string> DealPlayersDeck(Deck deck, Player human, Player computer)
    {
        Deck cards = new Deck();
        Player humanPlayer = new Player();
        Player computerPlayer = new Player();

        var fullDeck = cards.CreateNewDeck();
        var playerDeck = humanPlayer.PlayerCards;
        var computerDeck = computerPlayer.PlayerCards;

        int halfDeck = fullDeck.Count() / 2;

        foreach (object i in fullDeck)
        {
            List<int> keyList = new List<int>(fullDeck.Keys);
            Random rand = new Random();
            int randomKey = keyList[rand.Next(keyList.Count)];

            if (!playerDeck.ContainsKey(randomKey))
            {
                playerDeck.Add(randomKey, fullDeck[randomKey]);
                fullDeck.Remove(randomKey);
            }
        }
        return playerDeck;
    }
}

Here is a reference Link

最佳答案

你可以像下面那样做:keyList 会给你一个包含 26 个唯一键的列表。遍历键并将其添加到 playerDeck 中,同时从 fullDeck 中删除相同的键,以便在循环迭代后完整的甲板包含不在的键playerDeck 所以你可以把它移到 computerDeck

 List<int> keyList = new List<int>(fullDeck.Keys);
 Random rand = new Random();
 var keyList = keyList.OrderBy(item => rand.Next()).Take(26).ToList();//will take only 26 random keys
 foreach (var randKey in keyList) // loop on keylist
  {
       playerDeck.Add(randKey, fullDeck[randKey]);
       fullDeck.Remove(randKey);        
  }
 computerDeck =fullDeck;

关于c# - 我如何在 C# 中处理这副牌(字典),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32918995/

相关文章:

c# - 调整 Infragistics UltraGrid 的大小以完美适应其内容

c# - 通过代码启用标志 AllowArbitraryDataSetTypeInstantiation

c# - ListPicker中的数据模板和固定项

c# - 如何获取现有函数并在 C# 中使用 Func<..> 编写它?

c# - 在 ASP.NET MVC 4 中使用 id 路由到索引

asp.net - 使用 CSS 将彩色边框应用到 Asp.net 应用程序。怎么了?

asp.net - 在 WebPart 编辑器区域中添加自定义属性

.net - 签名中类型前面的 # 符号 (F#) 有何含义?

.net - 在 xUnit 中正确使用 Theory

c# - 使用 .NET 进行 Java RSA/ECB/PKCS1Padding 加密