首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java程序设计--卡片疏通器

Java程序设计--卡片疏通器
EN

Stack Overflow用户
提问于 2011-09-15 15:35:00
回答 7查看 4K关注 0票数 1

我正在尝试写一个卡洗牌器,并且我知道我希望洗牌的方法。然而,我不知道用哪种最好的面向对象的方式来写它。

这种方法相当常见,具体如下:

  • 为每个人分配一个随机数值,介于0到2 147 483 647之间。
  • 如果有一个重复的键值(非常不可能),扔掉甲板,然后重新开始。
  • 将卡片储存在一套
  • 按每张卡的键值排序

我的问题在于用最好的面向对象的方式来写这个。首先,我想出了一个名为Card的对象,它包含一个适合值、一个数字值和一个随机键值。然后,我将有一个名为Deck的类,它扩展了一个HashSet,然后将每一张卡片存储到HashSet中,然后按键值对其进行排序。在我挣扎的地方,最有效的方法是首先“生成”52个Card对象,以及如何对集合排序。我是否会实现'SortedSet‘接口,如果是的话,我将如何编写比较器?

这是一个相当广泛的问题,更多的是基于面向对象的设计实践,但我希望这是一个非常平滑和基于对象的解决方案。

干杯,

蒂姆。

编辑:

谢谢大家的帮助。我的解决办法如下:

  • 2个Enum (CardValues,CardSuits),包含4套西装和13种可能值
  • 类,它以CardValue和CardSuit作为构造函数参数。
  • 扩展TreeMap的Deck类

当一个新的甲板被创建和洗牌时,我循环通过CardSuit Enum并创建卡片,然后在这个循环中,我遍历CardValue Enum。这会创建卡片,然后生成一个随机密钥并将它们放入TreeMap中。

由于总有一个小的机会,关键重复,如果最后甲板大小不是52,我抛出一个新的InvalidDeckException。

谢谢你的建议,我对这个解决方案感到很高兴。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-09-15 15:42:57

使用TreeMap,为每一张卡生成一个不存在于地图中的随机数,并将其插入到地图中作为卡片的密钥,完成。

地图现在由所生成的随机数排序。

另见算法

注意,这是一种延迟的洗牌方式,只需使用Collections.shuffle()即可。

票数 1
EN

Stack Overflow用户

发布于 2011-09-15 15:41:27

我写了一些扑克分析的东西。我为所有的卡片类型创建了一个Enum,其中包含rankvalue字段。然后我初始化了所有52个卡片枚举的可能性。所以,是的,我有52次防守(并且为所有可能的2牌起跑手,有时蛮力是最好的选择)。

然后,我创建了一个具有List of Enum<Card>类型的Enum<Card>类。

初始化Deck就像生成Enum的EnumSet一样简单,并将该设置传递给列表。然后,您可以将shuffle方法放在Deck类上,并让它为Deck使用列表。

这样做的好处是,你的应用程序中只有52张卡--就像FlyWeight模式一样。

票数 1
EN

Stack Overflow用户

发布于 2011-09-15 15:46:23

Card.java

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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;
     }
}

输出:

代码语言:javascript
运行
复制
 $ 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]

参考

  • Enum用法示例
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7433506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档