我是Java的初学者,目前正在为Android创建一个像gin rummy这样的纸牌游戏。我想知道创建Hand类的最佳实现方式是什么?在哪里存储由Deck.dealt()返回的卡牌是最好的方式?
- 数组
- ArrayList
- Vector
- HashSet
- LinkedList
另外,如果有人能提供gin rummy开源链接,我将不胜感激。
我是Java的初学者,目前正在为Android创建一个像gin rummy这样的纸牌游戏。我想知道创建Hand类的最佳实现方式是什么?在哪里存储由Deck.dealt()返回的卡牌是最好的方式?
另外,如果有人能提供gin rummy开源链接,我将不胜感激。
List
在技术上并不合适。
List
表示,如果一个手牌包含梅花A和K,而另一个手牌包含梅花K和A,那么这两个手牌基本上不是相同的手牌。这比仅仅“我想记住用户希望看到他们的卡片的顺序”要强烈得多,后者是许多非 List 集合都具有的特性,如 LinkedHashSet 和 Guava 的 ImmutableSet。
List
还意味着索引 N 上的卡牌有某种特殊的意义。 我所知道的没有一款纸牌游戏符合这个条件。
Set
通常不适用于纸牌游戏--只用于使用单副完全独特的卡牌的游戏。Multiset
。例如,HashMultiset
或 ImmutableMultiset
。请注意,大多数 multiset 实现通过仅存储卡牌和计数来表示多个“相等”卡牌,因此在对它们进行迭代时,您手中重复的卡牌必须始终一起出现。如果让用户自由控制手中卡牌的顺序很重要,则需要使用 LinkedListMultiset
。myHand.equals(yourHand)
,或使用整个手牌作为 Map
中的键实际上你永远不会这样做...所以放心地使用 ArrayList
,你会没问题的。 :-)List
就表示两个顺序不同的牌手是不同的。只有当你将Hand.equals()
实现传递到List.equals()
时才是真的。但我不会这样做。如果我要将Hand
放入HashMap
中(例如),我希望包含相同卡牌且顺序相同的两个不同的牌手仍被视为不同的牌手,并从对Hand.equals()
的调用中返回false
。 - Erick Robertson我认为一个好的想法是使用接口(List用于元素有序,Set用于元素无序)。你可以选择你喜欢的实现方式,例如:
List<Card> deck = new ArrayList<Card>();
或者
Set<Card> deck = new HashSet<Card>();
将它们存储在一个 ArrayList
中。
手牌中的卡牌是按照一定顺序排列的,而不是无序的堆叠。这种排序可以通过 List
而不是 Set
来保留。
ArrayList
还可以让您通过索引选择特定的卡牌,在实现游戏时非常有用。
请记住,只要您正确设计了 Hand
类,您就可以随时轻松地更改此数据结构。只要您在设计任何类时记住这一点,如果您意识到需要不同的东西,您就可以随时更改它。
LinkedHashSet
),它具有设置语义和迭代器使用时的排序(插入顺序)。 - ThomasDeck.dealt()
返回的卡牌放入手牌时的最佳存储方式。 - Erick Robertson嗯,据我所知,HashSet
更快,但如果你想制作一款纸牌游戏,那么也许你会希望对牌进行排序。这就是为什么我建议使用List。如果你是初学者,那么最好的选择可能是使用ArrayList
。它易于使用和理解。至少这是我会做的。如果你想了解更多,我建议阅读每个的独特属性,以便自己决定。是的,正如greuze之前所说,你应该使用接口来获得更多的灵活性。
首先,在最新版本的Java中,不建议使用Vector,因此您可以忽略它。
其次,如果您阅读了这些剩余类的Javadoc,就会知道它们都有优点或缺点。有些有顺序,有些可以接受重复值,有些则不能等等。因此,我认为最好的方法是为您的应用程序编写一些伪代码,而不是基于特定类(只需编写诸如“将卡添加到手中”,“从手中删除卡”之类的内容)。一旦您拥有了一些这样的伪代码,您将能够更清楚地看到自己的要求;您是否想按特定顺序保留手中的牌?您是否想通过关键字从手中检索卡片?
然后,您的选择将更加清晰。
将纸牌堆保持在列表中是有意义的,因为它确实维护了顺序。我倾向于使用Lists.newArrayList()来创建列表。Lists是Guava的一部分。 我强烈建议您使用并了解Guava,因为它具有许多有用的功能。
将手牌保存在某种数据结构中,可以轻松排序,以便更容易地比较手牌。 另一方面,据我所知,金鱼扑克牌手不是很大。
ArrayList
和LinkedList
之间有什么区别?),自己尝试一些东西,然后再提出更具体的问题。关于集合之间的区别,您可以尝试参考每个集合的JavaDoc文档。 - ThomasLinkedHashSet
或TreeSet
来获得集合语义和一些排序(具体取决于你想要哪种排序)。另外,一个映射表也可能是一个选项,例如Map<CardType, Card>
。 - Thomas