【发布时间】:2018-09-28 08:15:12
【问题描述】:
我正在尝试在中断后摆脱编码锈迹,因此承担了创建简单纸牌游戏的任务。我知道我犯了一个菜鸟错误,但我似乎找不到解决方案。
我正在尝试实现一些概念性的 shuffle 方法,其中一种涉及将牌组清空到多个单独的堆栈中,然后再次重新编译成牌组。
我的deck 是Cards 的标准List<T>。我的目标是从'temp_deck' 中取出一张顶牌[0] 并将其添加到堆/堆x,从而将其从temp_deck 的顶部移除。然后将最上面的牌添加到堆/堆叠y,然后是z,直到temp_deck 没有更多牌。然后我可以继续操作 3 堆并将它们添加回最后的甲板。
我的问题是,由于某种原因,它会将temp_deck 中的每个card 添加到每一堆中,因此每堆x, y, z 有52 张牌。我该如何解决这个问题,以便在这些堆之间划分我的列表而不是相乘?
这是我当前(第 n 次)划分列表的尝试:
public void Shuffle_b(Deck deck)
{
Deck temp_deck = deck;
Deck x = new Deck();
x.Cards.Clear();
Deck y = x;
Deck z = y;
while (temp_deck.Cards.Count !=0)
{
if (temp_deck.Cards.Count != 0)
{
x.Cards.Add(temp_deck.Cards[0]);
temp_deck.Cards.Remove(temp_deck.Cards[0]);
if (temp_deck.Cards.Count != 0)
{
y.Cards.Add(temp_deck.Cards[0]);
temp_deck.Cards.Remove(temp_deck.Cards[0]);
if (temp_deck.Cards.Count != 0)
{
z.Cards.Add(temp_deck.Cards[0]);
temp_deck.Cards.Remove(temp_deck.Cards[0]);
}
}
}
}
}
【问题讨论】:
-
无关,您的顶部
if是不必要的。您已经使用 while 循环对此进行了测试。一致性很好,但如果你想这样做,可以使用MoveCard函数,这将具有删除嵌套的额外好处。此外,您的函数中的唯一(有效)非临时变量是temp_deck。您应该在函数中重新考虑该名称。 -
您在代码中声明了 4 个新的卡组,但
x、y和z都指向同一个内存位置,temp_deck指向同一个内存位置为deck,因此您实际上总共只有 2 个卡组,它们之间有 5 个引用。 -
感谢各位的详细解释!这让我很头疼。
标签: c#