Проблема с колодой карт? (Java) - PullRequest
0 голосов
/ 12 марта 2020
public class Deck 
{
   Card[] cards; 

   Deck( )
   {
       //int [] ai = new int[4];
       //ai[0] = 6;

       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; 
      }
   }
  }
void layDownCards()
   {
       for(Card c: cards)
       {
           System.out.print("Card: " + c.getSuit() + " and the rank is " + c.getRank());
           System.out.println();
       }
       for(Card a: cards)
       {
           System.out.print("Card: " + a.getSuit() + " and the rank is " + a.getRank());
           System.out.println();
       }
       for(Card w: cards)
       {
           System.out.print("Card: " + w.getSuit() + " and the rank is " + w.getRank());
           System.out.println();
       }
   }

Вот мой код для вызова колоды карт. Когда я запускаю эту программу, я замечаю, что она работает, но вместо того, чтобы вызывать ее один раз (все пики, сердца и алмазы 1-10), она непрерывно вызывает карты и их номера на всех oop. Как мне это остановить?

1 Ответ

0 голосов
/ 12 марта 2020

Вам нужно сложить карты только один раз, так как вы зацикливаетесь на каждой карте в массиве. В приведенном выше примере вы трижды набираете 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...