首页 > 解决方案 > 如何将对象列表均匀分布到其他对象数组

问题描述

我正在使用控制台制作纸牌游戏。一个类,分发器,包含一个名为public void DistributeCards(Player[] players).

此方法接受一个播放器数组作为参数,其中包含所有实例化的播放器对象。分发器类还包含一个名为的字段List<Card> deck = new List<Card>()以及属性Deck

如何将卡片均匀地分配distributor.Deck到给定数组中所有玩家的牌组中?数组中给定的玩家数量限制为 2 或 4(以平均分配牌组)。

这是我到目前为止所尝试的:

public void DistributeCards(Player[] players)
{
    int amountOfCardsTodistribute = Deck.Count / players.Length;
    for (int i = 0; i < amountOfCardsTodistribute; i++)
    {
        players[0].Deck.Add(Deck[i])
        Deck.RemoveAt(i)
    }
    Console.WriteLine("Distributor distributed deck.");
}

^ 在这个例子中,给定的玩家数量是 2。正如我所希望的那样,分发者的一半牌库给了玩家[0]。当我复制第 6 行和第 7 行中的代码并将其粘贴到原始 (, 更改播放器索引, ) 下方时,出现错误 (NullReferenceException)。该索引不在列表的可能索引内。

具体来说,我要求一种能够将一副牌 (52) 中的牌张数量分配给 <= 4 的偶数玩家的结构,以便每个玩家在他/她的牌组中获得相同数量的牌。玩家的牌组是一张空的卡片列表,因此它们的容量是无限的。手牌将是玩家中的一个单独的 Card[]-array。我希望这足以澄清。如果某些事情不清楚,请随时提出问题。

标签: c#arrayslistsorting

解决方案


我之前用 java 构建了一个扑克游戏,并在 c# 中构建了一个二十一点游戏,你最好将你的牌组建模为Stack,这更好地模拟了真正的牌组的工作方式。您最好阅读堆栈文档Stack。您会发现很多纸牌游戏都将套牌建模为堆叠,这应该使您更容易在线找到帮助。我已经为扑克中的玩家表编写了处理函数,该函数在.Stack

如果你的意思是平均每个玩家有相同的数量,那么我们可以做这样的事情

int amountOfCardsTodistribute = Math.Floor(Deck.Count / players.Length);
for (int i = 0; i < amountOfCardsTodistribute; i+=amountOfCardsTodistribute )
{
    Player[i].Cards.AddRange(Deck.Skip(i).Take(amountOfCardsTodistribute));
}

如果我们需要从牌堆中取出卡片并均匀地“发牌”,

while(Deck.Count > players.Length)
{
    for(int i = 0; i < Players.Length; i++) 
    {
        Player[i].Cards.Add(Deck.ElementAt(0));
        Deck.RemoveAt(0);
    }
}

推荐阅读