2013-04-11 2 views
13

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

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; 
    } 
    } 
} 

Dealer класс

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(); 
    } 
} 
+0

Вы можете включать ошибку вы получаете? – BobTheBuilder

+0

В «DeckOfCards» нет никаких массивов, что может стать хорошим началом для исправления этих досадных красных squiggles. В вашем экземпляре карты также нет никакой логики, которая гарантировала бы, что я получу уникальную карточку (или карту фактического костюма и ранга), но это не вызовет сквигглей. – Makoto

+0

Я не получаю сообщение об ошибке. Моя колода и костюмы в моем классе DeckOfCards у всех есть красные squiggles под ней. Когда я нависаю над ним, он говорит, что «колода не может быть разрешена переменной» – Chris

ответ

0

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

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

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

+0

Что бы я добавил в класс карты? – Chris

+0

Вам не обязательно, но как только ваш класс «Карточка» представляет определенную карту, вы можете переместить код для обозначения карты внутри этого класса. – Howard

+0

То, с чем я борюсь, я не знаю, как назначить определенную карту в классе карты. Я переместил мой цикл for с моей карты() на мои DeckOfCards() – Chris

0

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

  • Классная карта должна представлять собой одну карту, то есть характер «Карты». Класс Card не должен знать о колодах.
  • Класс колоды должен содержать 52 объекта карты (плюс джокеры?).
+0

Я действительно понимаю, что вы имеете в виду. Если бы я должен был переместить колоду [] в класс DeckOfCards, как бы я ее разместил, чтобы сделать 52 карты? – Chris

+0

@Chris A DeckOfCards должен сделать 52 карты. карта не должна знать, что такое DeckOfCards. – Patashu

+0

@ Крис: Луиджи написал ясный пример того, как положить карты в колоду. – Mikkel

0

Есть много ошибок в коде, например, вы на самом деле не называя свою колоду, просто набрав 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 карты. Таким образом, ваш код будет более понятным.

31

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

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

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 
     } 
    } 

После этого, если вы хотите, вы можете также расширить колоду, чтобы построить другую колоду карт (например, с более чем 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 внутри коммутатора заявления как межды или полукокс примитивного типа данных (здесь мы должны сказать, что с Java заявления 1,7 переключателя допускаются также на строках)

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, таким образом, вы получите много мощных методов для работы на вашей колоде , но самое главное, вы можете использовать Java Collection's shuffle function, чтобы перетасовать вашу колоду. Например:

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

//Building the Deck... 

//... 

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

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

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

  2. На дисплее карты. По мне, вы должны сделать класс карты, которая имеет ранг костюм и сделать массив этого класса типа

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

0

Вот несколько кодов. Он использует 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; 
    } 
} 
0

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

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

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

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(); 
} 
} 
0
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)) ; 
     }  
    } 
} 
Смежные вопросы