我正在尝试写一个卡洗牌器,并且我知道我希望洗牌的方法。然而,我不知道用哪种最好的面向对象的方式来写它。
这种方法相当常见,具体如下:
我的问题在于用最好的面向对象的方式来写这个。首先,我想出了一个名为Card
的对象,它包含一个适合值、一个数字值和一个随机键值。然后,我将有一个名为Deck
的类,它扩展了一个HashSet
,然后将每一张卡片存储到HashSet
中,然后按键值对其进行排序。在我挣扎的地方,最有效的方法是首先“生成”52个Card
对象,以及如何对集合排序。我是否会实现'SortedSet‘接口,如果是的话,我将如何编写比较器?
这是一个相当广泛的问题,更多的是基于面向对象的设计实践,但我希望这是一个非常平滑和基于对象的解决方案。
干杯,
蒂姆。
编辑:
谢谢大家的帮助。我的解决办法如下:
当一个新的甲板被创建和洗牌时,我循环通过CardSuit Enum并创建卡片,然后在这个循环中,我遍历CardValue Enum。这会创建卡片,然后生成一个随机密钥并将它们放入TreeMap中。
由于总有一个小的机会,关键重复,如果最后甲板大小不是52,我抛出一个新的InvalidDeckException。
谢谢你的建议,我对这个解决方案感到很高兴。
发布于 2011-09-15 15:42:57
使用TreeMap
,为每一张卡生成一个不存在于地图中的随机数,并将其插入到地图中作为卡片的密钥,完成。
地图现在由所生成的随机数排序。
另见算法
注意,这是一种延迟的洗牌方式,只需使用Collections.shuffle()
即可。
发布于 2011-09-15 15:41:27
我写了一些扑克分析的东西。我为所有的卡片类型创建了一个Enum,其中包含rank
和value
字段。然后我初始化了所有52个卡片枚举的可能性。所以,是的,我有52次防守(并且为所有可能的2牌起跑手,有时蛮力是最好的选择)。
然后,我创建了一个具有List
of Enum<Card>
类型的Enum<Card>
类。
初始化Deck就像生成Enum的EnumSet
一样简单,并将该设置传递给列表。然后,您可以将shuffle
方法放在Deck
类上,并让它为Deck使用列表。
这样做的好处是,你的应用程序中只有52张卡--就像FlyWeight模式一样。
发布于 2011-09-15 15:46:23
Card.java
import java.util.*;
public class Card {
public enum Rank { DEUCE, THREE, FOUR, FIVE, SIX,
SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }
private final Rank rank;
private final Suit suit;
private Card(Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public Rank rank() { return rank; }
public Suit suit() { return suit; }
public String toString() { return rank + " of " + suit; }
private static final List<Card> protoDeck = new ArrayList<Card>();
// Initialize prototype deck
static {
for (Suit suit : Suit.values())
for (Rank rank : Rank.values())
protoDeck.add(new Card(rank, suit));
}
public static ArrayList<Card> newDeck() {
return new ArrayList<Card>(protoDeck); // Return copy of prototype deck
}
}
Deal.java:
import java.util.*;
public class Deal {
public static void main(String args[]) {
int numHands = Integer.parseInt(args[0]);
int cardsPerHand = Integer.parseInt(args[1]);
List<Card> deck = Card.newDeck();
Collections.shuffle(deck);
for (int i=0; i < numHands; i++)
System.out.println(deal(deck, cardsPerHand));
}
public static ArrayList<Card> deal(List<Card> deck, int n) {
int deckSize = deck.size();
List<Card> handView = deck.subList(deckSize-n, deckSize);
ArrayList<Card> hand = new ArrayList<Card>(handView);
handView.clear();
return hand;
}
}
输出:
$ java Deal 4 5
[FOUR of HEARTS, NINE of DIAMONDS, QUEEN of SPADES, ACE of SPADES, NINE of SPADES]
[DEUCE of HEARTS, EIGHT of SPADES, JACK of DIAMONDS, TEN of CLUBS, SEVEN of SPADES]
[FIVE of HEARTS, FOUR of DIAMONDS, SIX of DIAMONDS, NINE of CLUBS, JACK of CLUBS]
[SEVEN of HEARTS, SIX of CLUBS, DEUCE of DIAMONDS, THREE of SPADES, EIGHT of CLUBS]
参考:
https://stackoverflow.com/questions/7433506
复制相似问题