gpt4 book ai didi

c# - 将卡片添加到不可变卡片组的底部

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:37:09 25 4
gpt4 key购买 nike

背景:我创建了一个自定义 Card结构与 SuitValue用枚举表示的属性来模拟扑克牌。我创建了一个 Deck类,其中包含卡片并有几个操作它们的选项。它将卡片存储为 Queue<Card>因为这最合乎逻辑,并使大多数实现变得容易。

为了练习编码,我决定构建一个 ImmutableDeck那是无法修改的。它的方法返回新的 ImmutableDeck s 并使用 out参数返回绘制 Card秒。我以 Eric Lippert 的 ImmutableStack 为蓝本, 创建一个 Empty Deck,将构造函数设为私有(private),并有两个成员:“Top Card”和指向下一张的“指针”ImmutableDeck .

public class ImmutableDeck
{
static readonly EmptyDeck Empty = new EmptyDeck ();
readonly Card top;
readonly ImmutableDeck next;

ImmutableDeck ()
{
}

ImmutableDeck (Card top, ImmutableDeck next)
{
this.top = top;
this.next = next;
}

public int Count => 1 + next.Count;
public bool IsEmpty => this == Empty;
public Card Top => top;

public Card Bottom ()
{
var temp = next;
while (!temp.next.IsEmpty)
{
temp = temp.next;
}
return temp.Top;
}

public ImmutableDeck DrawCard (out Card c)
{
c = top;
return next;
}

public ImmutableDeck PutCardOnTop (Card c)
{
return new ImmutableDeck (c, this);
}

public ImmutableDeck PutCardOnBottom (Card c)
{
throw new NotImplementedException ("PutCardOnBottom");
}



public class EmptyDeck : ImmutableDeck
{
public new int Count
{
get;
} = 0;

public new bool IsEmpty
{
get;
} = true;

public new Card Top
{
get
{
throw new Deck.DeckEmptyException ();
}
}

public new Card Bottom ()
{
throw new Deck.DeckEmptyException ();
}

public new ImmutableDeck DrawCard (out Card c)
{
throw new Deck.DeckEmptyException ();
}

public new ImmutableDeck PutCardOnTop (Card c)
{
return new ImmutableDeck (c, this);
}

public new ImmutableDeck PutCardOnBottom (Card c)
{
return new ImmutableDeck (c, this);
}
}
}

问题:显然,这些牌组可以通过在空牌组之上的牌之上构建牌来构建。它相当强大。但我正在努力实现一种允许 Card 的方法要添加到底部。到目前为止,我所想到的就是我需要遵循 next通过链的指针,直到我到达终点(空),但我不确定接下来的步骤是什么。

一个好的解决方案将提供正确返回新 ImmutableDeck 的工作代码传入 Card 的实例现在是牌组中的最后一张牌,也是对解决方案工作原理的解释。

最佳答案

首先,如果您对可以廉价访问两端的不可变队列式数据结构感兴趣,请阅读我关于不可变双端队列的文章。

https://blogs.msdn.microsoft.com/ericlippert/2008/01/22/immutability-in-c-part-10-a-double-ended-queue/

双端队列通常比堆栈和队列复杂得多,但却是非常有趣的数据结构。

一个更简单的问题解决方案是:将其分解为三个较小的问题:

  • 插入到顶部——你已经解决了这个问题。
  • 从顶部移除 - 您已经解决了这个问题。
  • 反转一副牌。

如何实现逆向?好吧,如果一副牌是空的,那么它已经被颠倒了。如果它不是空的,则取出最上面的牌,将其插入空的牌组中,并继续这样做直到它是空的。

所以现在你可以反向操作了。插入底部是反向的,插入顶部,再反向。

当然,从底部移除也同样简单:反转,从顶部移除,再次反转。

关于c# - 将卡片添加到不可变卡片组的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38861635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com