【问题标题】:Is there any way to make this code into 3 distinct classes?有没有办法把这段代码分成 3 个不同的类?
【发布时间】:2018-07-15 13:37:43
【问题描述】:

大家,我完成了我实验室的代码,但我意识到它必须有 3 个名为:Card、Deck 和 DeckOfCards 的类,它还最好需要有数组列表,问题是我真的不能了解多个类以及如何从另一个类中调用事物。如果有人帮忙就好了。现在我只有一个名为 DeckOfCards 的类,它创建 3 个数组,然后将它们与循环组合,将它们打乱并打印组合数组

public class DeckOfCards{
    public static void main(String[] args) {
        String[] s = {
            "Clubs", "Diamonds", "Hearts", "Spades"
        };

        String[] face = {
        "1" ,"2", "3", "4", "5", "6", "7", "8", "9", "10",
        "Jack", "Queen", "King", "Ace"
        };
        String[] ranks = {"1", "2", "3", "4", "5", "6", "7", "8", "9",
        "10", "10", "10","10", "1 or 11"
        };
        int n = s.length * face.length;
        String[] deck = new String[n];
        for (int i = 0; i < face.length; i++) {
            for (int j = 0; j < s.length; j++) {
                deck[s.length*i+j] = s[j] + ", " + face[i] + ", " + ranks[i];
            }
        }
        for (int i = 0; i < n; i++) {
            int r = i + (int) (Math.random() * (n-i));
            String temp = deck[r];
            deck[r] = deck[i];
            deck[i] = temp;
        }
        for (int i = 0; i < n; i++) {
            System.out.println("["+deck[i]+"]");
        }
    }

}

【问题讨论】:

  • Deck of Cards 类需要打印出最终的洗牌数组
  • 我确定有。
  • 首先确定每种对象的属性。您现有的代码将帮助您。例如,卡片有花色和等级。它们也可能具有面值(但您的代码似乎将排名与面值混淆)。一副牌可能包含多张牌。我不知道是什么让 DeckOfCardsDeck 不同,但也许它只是用作程序的主类。
  • 我真的无法理解 [...] 如何从另一个类调用事物 - 但您已经在这样做了。你觉得 System.out.println()Math.random()face.length 会做什么?

标签: java arrays class arraylist


【解决方案1】:

您可能正在寻找这样的东西:

enum Suit {
    Clubs,
    Diamonds,
    Hearts,
    Spades;
}

enum Face {
    Ace(1,11),
    Two(2),
    Three(3),
    Four(4),
    Five(5),
    Six(6),
    Seven(7),
    Eight(8),
    Nine(9),
    Ten(10),
    Jack(10),
    Queen(11),
    King(12);
    private final int rank;
    private final int alternativeRank;

    private Face(int rank, int alternativeRank) {
        this.rank = rank;
        this.alternativeRank = alternativeRank;
    }

    private Face(int rank) {
        // Default to 0 for alternative rank.
        this(rank,0);
    }

    public int getRank() {
        return rank;
    }

    public int getAlternativeRank() {
        return alternativeRank;
    }

}

class Card {
    private final Suit suit;
    private final Face face;

    public Card(Suit suit, Face face) {
        this.suit = suit;
        this.face = face;
    }

    public Suit getSuit() {
        return suit;
    }

    public Face getFace() {
        return face;
    }

    @Override
    public String toString() {
        return "Card{" +
                "suit=" + suit +
                ", face=" + face +
                '}';
    }
}

public void test(String[] args) {
    // This should look familliar.
    Suit[] suits = Suit.values();
    Face[] faces = Face.values();
    Card[] deck = new Card[suits.length * faces.length];
    int c = 0;
    for ( Suit s : Suit.values()) {
        for (Face f : Face.values()) {
            deck[c++] = new Card(s,f);
        }
    }
    for (int i = 0; i < deck.length; i++) {
        int r = i + (int) (Math.random() * (deck.length-i));
        Card temp = deck[r];
        deck[r] = deck[i];
        deck[i] = temp;
    }
    for (int i = 0; i < deck.length; i++) {
        System.out.println("["+deck[i]+"]");
    }
}

【讨论】:

  • enum Face 的构造函数最好是私有的。
  • @ThomasFritsch 没有必要。枚举构造函数是隐式私有的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2020-09-14
相关资源
最近更新 更多