Подтвердить что ты не робот

Палуба карт JAVA

Я создал свою колоду карт, которая касается каждой карты и костюма, пока не осталось карты. Для моего проекта мне нужно разделить его на 3 класса, которые включают класс драйвера. Сначала я создал один класс со всем, чтобы я знал, как заставить все это работать.

public class DeckOfCards2 {
  public static void main(String[] args) {
    int[] deck = new int[52];
    String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
    String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};

    // Initialize cards
    for (int i = 0; i < deck.length; i++) {
      deck[i] = i;
    }

    // Shuffle the cards
    for (int i = 0; i < deck.length; i++) {
      int index = (int)(Math.random() * deck.length);
      int temp = deck[i];
      deck[i] = deck[index];
      deck[index] = temp;
    }

    // Display the all the cards
    for (int i = 0; i < 52; i++) {
      String suit = suits[deck[i] / 13];
      String rank = ranks[deck[i] % 13];
      System.out.println( rank + " of " + suit);
    }
  }
}

Теперь попытаемся разбить его на 3 класса. Я получаю красные строчки для всех переменных колоды/костюма на моем классе DeckOfCards. Я не знаю, как это исправить.

public class DeckOfCards {
  private Card theCard;
  private int remainingCards = 52;

  DeckOfCards() {
    theCard = new Card();   
  }

  public void shuffle(){
    for (int i = 0; i < deck.length; i++) {
       int index = (int)(Math.random() deck.length);
       int temp = deck[i];
       deck[i] = deck[index];
       deck[index] = temp;
       remainingCards--;
     }
  }

  public void deal(){
    for (int i = 0; i < 52; i++) {
       String suit = suits[deck[i] / 13];
       String rank = ranks[deck[i] % 13];
       System.out.println( rank + " of " + suit);
       System.out.println("Remaining cards: " + remainingCards);
     }
   }
}

Класс карты:

public class Card {
  int[] deck = new int[52];
  String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
  String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};

  Card() {
    for (int i = 0; i < deck.length; i++) {
      deck[i] = i;
    }
  }
}

Дилерский класс

public class Dealer {
  public static void main(String[]args){
    System.out.println("The deck will randomly print out a card from a full deck each time");

    DeckOfCards player = new DeckOfCards();
    player.deal();
  }
}
4b9b3361

Ответ 1

Как уже сказал кто-то, ваш дизайн не очень ясен и объектно ориентирован.

Самая очевидная ошибка заключается в том, что в вашем дизайне карта знает о колоде карт. Палуба должна знать о картах и ​​создавать объекты в своем конструкторе. Например:

public class DeckOfCards {
    private Card cards[];

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

Впоследствии, если вы хотите, вы также можете расширить Deck, чтобы построить другую колоду карт (например, с более чем 52 картами, Jolly и т.д.). Например:

public class SpecialDeck extends DeckOfCards {
   ....

Еще одна вещь, которую я бы изменил, - использование массивов String для представления костюмов и рангов. Начиная с Java 1.5, язык поддерживает Enumeration, которые идеально подходят для таких проблем. Например:

public enum Suits {
    SPADES, 
    HEARTS, 
    DIAMONDS,
    CLUBS;  
}

С Enum вы получаете некоторые преимущества, например:

1) Enum безопасен по типу, вы не можете назначить что-либо другое, кроме предопределенных констант Enum для переменной Enum. Например, вы можете написать свой конструктор карты следующим образом:

public class Card {

   private Suits suit;
   private Ranks rank;

public Card(Suits suit, Ranks rank) {
    this.suit = suit;
    this.rank = rank;
}

Таким образом, вы обязательно создадите согласованные карты, которые принимают только значения вашего перечисления.

2) Вы можете использовать Enum в Java внутри оператора Switch, типа int или char примитивного типа данных (здесь мы должны сказать, что, поскольку оператор switch Java 1.7 разрешен также на String)

3) Добавление новых констант в Enum в Java легко и вы можете добавить новые константы, не нарушая существующий код.

4) Вы можете выполнять итерацию через Enum, это может быть очень полезно при создании экземпляров карт. Например:

/* Creating all possible cards... */
for (Suits s : Suits.values()) {
    for (Ranks r : Ranks.values()) {
         Card c = new Card(s,r);
    }  
}

Чтобы не изобретать снова колесо, я также изменил бы способ хранения карт из массива в Java Collection, таким образом вы получите множество мощных методов для работы на своей колоде, но самое главное, что вы можете использовать Java Shuffle function, чтобы перетасовать вашу колоду. Например:

private List<Card> cards = new ArrayList<Card>();

//Building the Deck...

//...

public void shuffle() {
    Collections.shuffle(this.cards); 
}

Ответ 2

Это моя реализация:

public class CardsDeck {
    private ArrayList<Card> mCards;
    private ArrayList<Card> mPulledCards;
    private Random mRandom;

public static enum Suit {
    SPADES,
    HEARTS,
    DIAMONDS,
    CLUBS;
}

public static enum Rank {
    TWO,
    THREE,
    FOUR,
    FIVE,
    SIX,
    SEVEN,
    EIGHT,
    NINE,
    TEN,
    JACK,
    QUEEN,
    KING,
    ACE;
}

public CardsDeck() {
    mRandom = new Random();
    mPulledCards = new ArrayList<Card>();
    mCards = new ArrayList<Card>(Suit.values().length * Rank.values().length);
    reset();
}

public void reset() {
    mPulledCards.clear();
    mCards.clear();
    /* Creating all possible cards... */
    for (Suit s : Suit.values()) {
        for (Rank r : Rank.values()) {
            Card c = new Card(s, r);
            mCards.add(c);
        }
    }
}


public static class Card {

    private Suit mSuit;
    private Rank mRank;

    public Card(Suit suit, Rank rank) {
        this.mSuit = suit;
        this.mRank = rank;
    }

    public Suit getSuit() {
        return mSuit;
    }

    public Rank getRank() {
        return mRank;
    }

    public int getValue() {
        return mRank.ordinal() + 2;
    }

    @Override
    public boolean equals(Object o) {
        return (o != null && o instanceof Card && ((Card) o).mRank == mRank && ((Card) o).mSuit == mSuit);
    }


}

/**
 * get a random card, removing it from the pack
 * @return
 */
public Card pullRandom() {
    if (mCards.isEmpty())
        return null;

    Card res = mCards.remove(randInt(0, mCards.size() - 1));
    if (res != null)
        mPulledCards.add(res);
    return res;
}

/**
 * Get a random cards, leaves it inside the pack 
 * @return
 */
public Card getRandom() {
    if (mCards.isEmpty())
        return null;

    Card res = mCards.get(randInt(0, mCards.size() - 1));
    return res;
}

/**
 * Returns a pseudo-random number between min and max, inclusive.
 * The difference between min and max can be at most
 * <code>Integer.MAX_VALUE - 1</code>.
 *
 * @param min Minimum value
 * @param max Maximum value.  Must be greater than min.
 * @return Integer between min and max, inclusive.
 * @see java.util.Random#nextInt(int)
 */
public int randInt(int min, int max) {
    // nextInt is normally exclusive of the top value,
    // so add 1 to make it inclusive
    int randomNum = mRandom.nextInt((max - min) + 1) + min;
    return randomNum;
}


public boolean isEmpty(){
    return mCards.isEmpty();
}
}

Ответ 3

Сначала у вас есть архитектурная проблема с вашими классами. Вы переместили свойство deck внутри своего класса Card. Но couse это свойство колоды карт и, следовательно, должно быть внутри класса DeckOfCards. Тогда цикл инициализации не должен быть в конструкторе Card, а в классе вашей колоды. Кроме того, колода представляет собой массив int в данный момент, но должна быть массивом Card s.

Во-вторых, внутри метода Deal вы должны обратиться к suits как Card.suits и сделать этот элемент статическим окончательным. То же самое для ranks.

И последнее, пожалуйста, придерживайтесь соглашений об именах. Имена методов всегда начинаются с строчной буквы, т.е. shuffle вместо shuffle.

Ответ 4

В вашем дизайне что-то не так. Попробуйте сделать ваши классы реальными вещами. Например:

  • Карта класса должна представлять одну карту, то есть характер "Карты". Класс карты не обязательно должен знать о колодах.
  • Класс Deck должен содержать 52 объекта карты (плюс джокеры?).

Ответ 5

В коде есть много ошибок, например, вы не вызываете свою колоду, просто набрав deck в свой метод Shuffle. Вы можете вызвать его, набрав theCard.deck

Я изменил ваш метод тасования:

public void Shuffle(){
    for (int i = 0; i < theCard.deck.length; i++) {
        int index = (int)(Math.random()*theCard.deck.length );
        int temp = theCard.deck[i];
        theCard.deck[i] = theCard.deck[index];
        theCard.deck[index] = temp;
        remainingCards--;
    }
}

Кроме того, как сказано, у вас есть структурная проблема. Вы должны называть классы, как вы понимаете в реальной жизни, например, когда вы говорите о карте, это только одна карта, когда вы говорите, что колода должна быть 52 + 2 карты. Таким образом, ваш код будет более понятным.

Ответ 6

В вашей программе много ошибок.

  • Расчет индекса. Я думаю, что это должно быть Math.random()%deck.length

  • При отображении карты. По мне, вы должны сделать класс карты, который имеет костюм ранга и сделать массив этого типа класса

Если вы хотите, я могу дать вам полную структуру этого, но лучше, если вы сделаете это самостоятельно

Ответ 7

Вот какой код. Он использует 2 класса (Card.java и Deck.java) для решения этой проблемы, и, чтобы завершить его, он автоматически сортирует его для вас, когда вы создаете объект колоды.:)

import java.util.*;

public class deck2 {
    ArrayList<Card> cards = new ArrayList<Card>();

    String[] values = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    String[] suit = {"Club", "Spade", "Diamond", "Heart"};

    static boolean firstThread = true;
    public deck2(){
        for (int i = 0; i<suit.length; i++) {
            for(int j=0; j<values.length; j++){
                this.cards.add(new Card(suit[i],values[j]));
            }
        }
        //shuffle the deck when its created
        Collections.shuffle(this.cards);

    }

    public ArrayList<Card> getDeck(){
        return cards;
    }

    public static void main(String[] args){
        deck2 deck = new deck2();

        //print out the deck.
        System.out.println(deck.getDeck());
    }

}


//separate class

public class Card {


    private String suit;
    private String value;


    public Card(String suit, String value){
        this.suit = suit;
        this.value = value;
    }
    public Card(){}
    public String getSuit(){
        return suit;
    }
    public void setSuit(String suit){
        this.suit = suit;
    }
    public String getValue(){
        return value;
    }
    public void setValue(String value){
        this.value = value;
    }

    public String toString(){
        return "\n"+value + " of "+ suit;
    }
}

Ответ 8

Я думаю, что решение так же просто, как это:

Card temp = deck[cardAindex];
deck[cardAIndex]=deck[cardBIndex]; 
deck[cardBIndex]=temp;

Ответ 9

public class shuffleCards{

    public static void main(String[] args) {

        String[] cardsType ={"club","spade","heart","diamond"};
        String [] cardValue = {"Ace","2","3","4","5","6","7","8","9","10","King", "Queen", "Jack" };

        List<String> cards = new ArrayList<String>();
        for(int i=0;i<=(cardsType.length)-1;i++){
            for(int j=0;j<=(cardValue.length)-1;j++){
                cards.add(cardsType[i] + " " + "of" + " " + cardValue[j]) ;
            }
        }

        Collections.shuffle(cards);
        System.out.print("Enter the number of cards within:" + cards.size() + " = ");

        Scanner data = new Scanner(System.in);
        Integer inputString = data.nextInt();
        for(int l=0;l<= inputString -1;l++){
            System.out.print( cards.get(l)) ;
        }    
    }
}