Вам нужно сложить карты только один раз, так как вы зацикливаетесь на каждой карте в массиве. В приведенном выше примере вы трижды набираете oop карты ... Я бы не стал дублировать большие фрагменты кода. Кроме того, числа и строки волхвов c - это огромное нет-нет в OOP.
public class Deck {
private Card[] cards;
public static final class Card {
private String suit;
private int rank;
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
public String getSuit() {
return suit;
}
public int getRank() {
return rank;
}
}
public Deck() {
cards = new Card[30];
Card c;
for (int e = 0; e < 10; e++) {
c = new Card("SPADE", e + 1);
cards[e] = c;
}
Card a;
for (int b = 10; b < 20; b++) {
a = new Card("HEART", b - 9);
cards[b] = a;
}
Card w;
for (int y = 20; y < 30; y++) {
w = new Card("DIAMONDS", y - 19);
cards[y] = w;
}
}
public Card[] getCards() {
return cards;
}
private static void layDownCards(Deck deck) {
for (Card card : deck.getCards()) {
System.out.print("Card: " + card.getSuit() + " and the rank is " + card.getRank());
System.out.println();
}
}
public static void main(String[] args) {
Deck deck = new Deck();
layDownCards(deck);
}
}
Лучший подход
Передайте масти и количество карт в конструктор Deck
.
Вы также можете защититься от неверного размера колоды, купите проверку, делится ли количество карт на количество мастей.
public class Deck {
private Card[] cards;
public static final class Card {
private String suit;
private int rank;
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
public String getSuit() {
return suit;
}
public int getRank() {
return rank;
}
}
public Deck(int size, String[] suits) {
cards = new Card[30];
if (size % suits.length != 0) {
throw new IllegalArgumentException("Deck size must be divisible by suit count!");
}
int rankMax = size / suits.length;
for (int i = 0; i < size; i++) {
cards[i] = new Card(suits[i / rankMax], (i % rankMax) + 1);
}
}
public Card[] getCards() {
return cards;
}
private static void layDownCards(Deck deck) {
for (Card card : deck.getCards()) {
System.out.print("Card: " + card.getSuit() + " and the rank is " + card.getRank());
System.out.println();
}
}
public static void main(String[] args) {
Deck deck = new Deck(30, new String[] { "SPADE", "HEART", "DIAMONDS" });
layDownCards(deck);
}
}
Четный лучший подход
Код можно дополнительно очистить, создав объект колоды, который генерирует карты на основе списка возможных мастей и минимального / максимального ранга.
public interface Card {
}
import java.util.ArrayList;
import java.util.List;
public abstract class Deck<T extends Card> {
private List<T> cards;
public Deck() {
this.cards = new ArrayList<T>();
}
public List<T> getCards() {
return cards;
}
public void setCards(List<T> cards) {
this.cards = cards;
}
}
public class PokerCard implements Card {
private String suit;
private int rank;
public PokerCard(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
public String getSuit() {
return suit;
}
public int getRank() {
return rank;
}
@Override
public String toString() {
return String.format("Card: %s and the rank is %d", this.getSuit(), this.getRank());
}
}
public class PokerDeck extends Deck<PokerCard> {
private final String[] SUITS = { "SPADES", "HEARTS", "DIAMONDS" };
private final int MIN_RANK = 1;
private final int MAX_RANK = 10;
public PokerDeck() {
super();
for (String suit : SUITS) {
for (int rank = MIN_RANK; rank <= MAX_RANK; rank++) {
this.getCards().add(new PokerCard(suit, rank));
}
}
}
}
public class Casino {
public static void main(String[] args) {
Deck<? extends Card> deck = new PokerDeck();
for (Card card : deck.getCards()) {
System.out.println(card);
}
}
}