【问题标题】:Deck of Cards (unable to print ordered deck)一副纸牌(无法打印订购的纸牌)
【发布时间】:2023-01-11 03:30:22
【问题描述】:

我正在创建一个纸牌游戏,需要根据用户输入在 5-10 之间分发多张纸牌。我创建了一个卡片类,现在我在甲板上工作,但感到迷茫,而且无法组织它按升序显示。

到目前为止,这是我的甲板

import java.util.Arrays;
import java.util.Collections;

public class Deck {
    private Card card[];

    public Deck() {
        this.card = new Card[52];
        for (int i = 0; i < 5; i++) {
            Card card = new Card(); //Instantiate a Card
            this.card[i] = card; //Adding card to the Deck
        }
    }


    private void Sort(Card[] deck){

        for (int i = 1; i < deck.length; i++){
            int nextToInsertRank = deck[i].getRankValue();
            Card nextToInsert = deck[i];
            int index;
            index = i - 1;

            while (index >= 0 && deck[index].getRankValue() > nextToInsertRank){
                deck[index + 1] = deck[index];
                index--;
            }
            deck[index + 1] = nextToInsert;
        }
        Collections.shuffle(Arrays.asList(this.card));
    }
}

这是我的卡片课。

导入 java.util.Random; 导入 java.util.Arrays;

公开课卡片{

private final int RANK, SUIT;
private static final Random GENERATOR = new Random();

private static final String[] RANKS = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
private static final String[] SUITS = {"Clubs", "Diamonds", "Hearts", "Spades"};

public Card(){
    RANK = GENERATOR.nextInt(RANKS.length);
    SUIT = GENERATOR.nextInt(SUITS.length);

}

public static void SortCards(Card[] hand) {
    for(int i = 0; i < 5; i++) {
        Arrays.sort(RANKS);
        System.out.println();
    }
}

public String getRank() {
    return RANKS[RANK];
}

public String getSuit(){
    return SUITS[SUIT];
}

public int getRankValue(){
   return RANK;
}

@Override
public String toString(){
    return getRank() + " of " + getSuit();
}

}

这是我用来打印它的代码。

Card card1 = new Card();
Card card2 = new Card();
Card card3 = new Card();
Card card4 = new Card();
Card card5 = new Card();

System.out.println("A: " + card1);
System.out.println("B: " + card2);
System.out.println("C: " + card3);
System.out.println("D: " + card4);
System.out.println("E: " + card5);

这是我得到的结果。

答:黑桃 9

B: 梅花 10

C:红心2

D:梅花2

E:黑桃 9

我尝试了几种不同的方法,但似乎无法正确打印。对代码进行任何改进以使其有效工作将不胜感激。

【问题讨论】:

  • 您期望的输出是什么?我没有看到 Deck 和 Deck.Sort 的任何用途
  • 我需要它按升序打印卡片,但我还不知道该怎么做。
  • 你能分享卡类吗?这样我们就可以重现
  • 此外,Sort 最后调用 Collections.shuffle 似乎很奇怪。为什么Sort需要一个参数?它不应该在 card 成员数组上工作吗?如果没有,你可以static。最后,Deck 构造函数创建了一个可以容纳 52 张卡片但只创建了 5 张的数组。
  • 我的建议:让 Deck 类创建所有 52 张牌并洗牌。然后制作一个Hand类,可以放5张卡片,并对它们进行排序。

标签: java arrays


【解决方案1】:

你可以Card implements Comparable,很简单

class Card implements Comparable<Card> {
    @Override
    public int compareTo(Card o) {
        return Integer.compare(rank, o.rank);
    }
}

那么甲板的种类很容易

class Deck {    
    public void sort() {
        Arrays.sort(this.cards);
    }
}

但是如果你的数组中有 null 元素(现在你的循环停止在 5 而不是 52)你需要一个比较器来处理这样的空值

所以 Deck.sort 看起来像这样

public void sort() {
    Arrays.sort(this.cards, (o1, o2) -> {
        if (o1 == null && o2 == null) return 0;
        if (o1 == null) return 1;
        if (o2 == null) return -1;
        return o1.compareTo(o2);
    });
}

这就是你想要的

Deck d = new Deck();
System.out.println(d); // [Jack of Hearts, Queen of Diamonds, 8 of Clubs, 7 of Diamonds ...
d.sort();
System.out.println(d); // [2 of Spades, 2 of Spades, 2 of Diamonds, 2 of Diamonds, 2 of C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2011-07-12
    • 2020-09-30
    • 2014-02-27
    相关资源
    最近更新 更多