存储在玩家手中的扑克牌的最佳数据结构是什么?

时间:2012-02-03 12:12:30

标签: java arrays data-structures collections

我是java的初学者,我正在创建一款像杜松子酒这样的纸牌游戏。我想知道创建Hand类的最佳实现是什么?存储Deck.dealt()返回的卡的最佳方式是什么?

  1. 阵列
  2. 的ArrayList
  3. 矢量
  4. HashSet的
  5. 链表
  6. 另外,如果有人能提供杜松子酒的开源链接,我将不胜感激。

6 个答案:

答案 0 :(得分:24)

如果您真的想了解集合类型之间的细微差别,请点击此处。

List在技术上不合适,除非游戏是Bohnanza(咳咳,这是有史以来最伟大的纸牌游戏之一,但我还是让我完成)。

除了其他方面,

List说,一方面包含俱乐部的王牌和王牌,另一手牌包含国王和俱乐部的王牌,从根本上说它们不是同一只手。这是对订单的强烈依赖,而不仅仅是“好吧,我想记住用户想要看到他们的卡片的顺序”,这是大量非List集合所具有的属性,如LinkedHashSet和番石榴的ImmutableSet

List也意味着对于位于索引N的卡片有一些特别重要的意义。对于我所知道的没有纸牌游戏,这是正确的。

Set通常不适合纸牌游戏 - 只使用一副完全独特的纸牌游戏。

要允许重复但仍具有与顺序无关的相等性,要使用的类型是Guava的Multiset。例如HashMultisetImmutableMultiset。请注意,大多数multiset实现通过仅存储卡和计数来表示多个“相等”卡,因此当迭代它们时,您手中的卡的副本必须始终一起显示。如果让用户自由控制她手中的卡片顺序很重要,则需要LinkedListMultiset

现在上课时间结束了......好吧,老实说吧。调用myHand.equals(yourHand)或使用整只手作为Map中的密钥并不是实际您将要做的事情......所以请继续使用{ {1}},你会没事的。 : - )

答案 1 :(得分:3)

我认为一个好主意是使用接口(如果元素是有序的,则为List;如果元素未被排序,则为Set。您可以使用您喜欢的实现,例如:

List<Card> deck = new ArrayList<Card>();

Set<Card> deck = new HashSet<Card>();

答案 2 :(得分:1)

将它们存储在ArrayList

手中的牌按一定的顺序排列,而不是无序的牌。此排序保留在ListSet

ArrayList还为您提供了按索引选择特定卡片的机会,这将有助于您实施游戏。

请注意,只要您正确设计了Hand课程,您就可以在将来的任何时候轻松更改此数据结构。只要你在设计的任何课程中都记住这一点,如果你发现自己需要不同的东西,你可以随时改变它。

答案 3 :(得分:1)

嗯,HashSet更快(据我所知),但是如果你想制作纸牌游戏,那么也许你会希望对卡片进行分类。这就是我建议使用List的原因。如果你是初学者,那么最好的方法就是使用ArrayList。它易于使用和理解。至少这是我会做的。如果你想了解更多,我建议阅读每个人的独特属性,以便你自己决定。是的,就像之前greuze说的那样,你应该使用一个界面来提高灵活性。

答案 4 :(得分:1)

首先,在最新版本的Java中不鼓励使用Vector,因此您可以忽略它。

其次,你会知道你是否在那些剩余的类上阅读了Javadoc,它们都有优点或缺点。有些有订单,有些可以取重复值,有些则不能等等。因此,我认为最好的方法是为您的应用程序编写一些伪代码,而不是基于特定的类(只需编写“添加卡到手”,“从手中删除卡”等内容)。一旦你有了这些伪代码,你就能更清楚地看到你的要求;您是否希望按特定顺序将卡片保存在手中?您希望能够通过钥匙从手上取回卡片吗?

然后,您的选择会更清楚。

答案 5 :(得分:0)

将牌组保持在列表中是有意义的,因为它确实维持秩序。我倾向于默认使用Lists.newArrayList()来创建List。列表是番石榴的一部分。我强烈建议使用并了解Guava,因为它有许多有用的产品。

能够将手放在一些可以轻松排序的数据结构中以便更容易比较手是有意义的。 OTOH,IIRC,杜松子酒拉米手并不是那么大。