避免纸牌游戏中重复牌的算法

时间:2013-08-07 04:18:58

标签: java algorithm duplicates

我犯了一个新手的错误,并试图找出一个修复而不重新编码整个程序。这是场景:

我正在从52张牌组创造6张牌。这些卡有2个字段:int rank和char suit。我正在拉随机排名并且适合并创建每张卡的新的未命名实例。这不是重复的原因。

所以我成功创建了6张卡,但我不想要重复。这可能是一个新的问题,但我们都在那里:)谢谢你的帮助!


public void displayCards(List<ImageView> disp) {
        int cardNumber = 0;
        for (ImageView c : disp) {

            cardNumber++;

            rank = rand(13) + 2;
            int i = rand(4);
            if (i == 0) {
                suit = 's';
            } else if (i == 1) {
                suit = 'h';
            } else if (i == 2) {
                suit = 'd';
            } else {
                suit = 'c';
            }

            if (cardNumber == 1) {
                dc1 = new Card(rank, suit);
            } else if (cardNumber == 2) {
                dc2 = new Card(rank, suit);
            } else if (cardNumber == 3) {
                dc3 = new Card(rank, suit);
            } else if (cardNumber == 4) {
                pc1 = new Card(rank, suit);
            } else if (cardNumber == 5) {
                pc2 = new Card(rank, suit);
            } else {
                pc3 = new Card(rank, suit);
            }}

3 个答案:

答案 0 :(得分:4)

选项1:使用两个(嵌套)循环(所有套装和所有等级)创建52张牌的完整套牌(例如,在列表中)。随机播放(使用Collections.shuffle())牌组并取六张牌。

选项2:只需创建所需的卡数(就像您尝试的那样)。在这里,您需要将每张卡片放入Set<Card>,直到该卡片具有所需数量的卡片。基本上,重复项将在集合中消失。为此,您需要为Card类实现equals()hashcode()

答案 1 :(得分:2)

创建所有52张牌的牌组并从牌组中提取牌。您还应该使用枚举器来表示排名和诉讼。

请参阅What variables do I have to compare in this java code?中的答案,例如卡片代码和套牌。

答案 2 :(得分:1)

首先,如果您尚未完成,请覆盖equals()课程中的hashCode()Card

其次,将已创建的卡添加到Set(这可以保证它不包含重复项)

修改你的代码:

public void displayCards(List<ImageView> disp) {

    int cardNumber = 0;
    Set<Card> myCards = new HashMap<Card>();
    for (ImageView c : disp) {

        cardNumber++;

        Card newCard;

        do {
            rank = rand(13) + 2;
            int i = rand(4);
            if (i == 0) {
                suit = 's';
            } else if (i == 1) {
                suit = 'h';
            } else if (i == 2) {
                suit = 'd';
            } else {
                suit = 'c';
            }
            newCard = new Card(rank, suit);
        } while(myCards.contains(newCard));

        myCards.add(newCard);


        if (cardNumber == 1) {
            dc1 = newCard;
        } else if (cardNumber == 2) {
            dc2 = newCard;
        } else if (cardNumber == 3) {
            dc3 = newCard;
        } else if (cardNumber == 4) {
            pc1 = newCard;
        } else if (cardNumber == 5) {
            pc2 = newCard;
        } else {
            pc3 = newCard;
        }
    }