c# - 如何将对象列表均匀分布到其他对象数组
问题描述
我正在使用控制台制作纸牌游戏。一个类,分发器,包含一个名为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。我希望这足以澄清。如果某些事情不清楚,请随时提出问题。
解决方案
我之前用 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);
}
}
推荐阅读
- c++ - C++ 多个嵌套的 If-else 语句有效,但组合无效
- apache - Apache2 mod_proxy_fcgi ProxyFCGISetEnvIf 目录特定覆盖
- android - try-catch 中 Exception 和 JSONException 的区别
- qt - PyQt 3D for QtQuick (QML) 支持
- assets - Spark Ar headOccluder.obj 加载未发生
- node.js - 在 macOS 终端中找不到 Google Lighthouse 命令
- r - R dplyr - 按名称模式重新排列列
- python - 向记录器添加特定名称
- c++ - 无法在 Windows 中链接 grpc 库
- google-chrome-extension - 与网站链接的 Google Chrome 扩展程序