2012-06-27 3 views
2

Я пытаюсь создать дружественную к ООП игру Java BlackJack, чтобы продвигать свои знания.OOP BlackJack Game (Создание палубы)

Я ударил стену, и я просто не знаю достаточно, чтобы увидеть проблему. Интересно, может ли кто-нибудь указать на мои проблемы.

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

спасибо.

мой код:

public class BlackJack{ 

BlackJack() { 
    Deck deck = new Deck(); 
    deck.createDeck(); 
    System.out.println(deck.deckList); 
} 

public static void main(String[] args) { 

    new BlackJack(); 


    } 
} 


public class Card{ 

private String valueCard; 
private String suitCard; 

public Card(String value, String suit) { 
    this.valueCard = value; 
    this.suitCard = suit; 
} 

public String getValue() { 
    return valueCard; 
} 
public String getSuit() { 
    return suitCard; 
    } 
} 

import java.util.ArrayList; 


public class Deck { 

ArrayList<Card> deckList = new ArrayList<Card>(); 

String[] value = {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", 
     "Jack", "Queen", "King", "Ace"}; 
String[] suit = {"Hearts", "Clubs", "Spades", "Diamonds"}; 


Deck() { 

    deckList = new ArrayList<Card>(); 

} 

public void createDeck() { 
    for (int i = 0; i < value.length; i++) { 
     for (int x = 0; x < suit.length; x++) { 
      Card card = new Card(value[i], suit[x]); 
      deckList.add(card); 

      } 
     } 
    } 
} 

редактировать: на данный момент мой вне поставил из моего Println является: [Card @ addbf1, карты @ 42e816, карты @ 9304b1, ... и т.д.] Что это означает?

Спасибо за ваше время.

EDIT: Любой, кто также нуждается в ответ на это в будущем:

добавил:

@Override 
public String toString(){ 
    return valueCard + " of " + suitCard; 
} 
} 

мой класс карты, а затем использовали его в классе Deck:

import java.util.ArrayList; 


public class Deck { 

ArrayList<Card> deckList = new ArrayList<Card>(); 

String[] value = {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", 
     "Jack", "Queen", "King", "Ace"}; 
String[] suit = {"Hearts", "Clubs", "Spades", "Diamonds"}; 


Deck() { 

    deckList = new ArrayList<Card>(); 

} 

public void createDeck() { 
    for (int i = 0; i < value.length; i++) { 
     for (int x = 0; x < suit.length; x++) { 
      Card card = new Card(value[i], suit[x]); 
      deckList.add(card); 
      card.toString(); 
     } 
    } 
} 
} 

ENUM: общественный класс CardEnum {

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

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


} 


public class Card{ 

private CardEnum.Rank rank; 
private CardEnum.Suit suit; 

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

public Rank getRank() { 
    return rank; 
} 
public Suit getSuit() { 
    return suit; 
} 

@Override 
public String toString(){ 
    return rank + " of " + suit; 
} 
} 
+3

Если ваша цель состоять в том, чтобы быть более «ООП», вы должны рассмотреть возможность переноса ваших карточек в перечисление. См. Http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html пример колоды карт – assylias

+0

@assylias благодарим вас за ссылку, отличную информацию! Внедрение перечислений. Спасибо. – speak

ответ

5

На основе вашего редактирования я вижу, что ваш код печатает значение по умолчанию, возвращаемое методом Object toString(), которое является именем класса текущего объекта и хэш-кода объекта. Чтобы исправить это, и чтобы ваши строки имели смысл, вы должны дать каждому из своих классов переопределение метода public String toString(). Класс Card должен иметь метод toString(), который возвращает строку, которая описывает костюм и значение текущей карты, а класс Deck должен перебирать каждую карту и вызывать функцию toString().

Что-то вроде:

@Override 
public String toString() { 
    return /* code in here to get the contents of the fields held by the Card object */ 
} 

Редактировать относительно:

I'm just about to delv into enum's I was just curious as I am looking at: docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html But I have two separate classes: Card & Deck. Do I have to copy both sets of enums into both classes for this to work? So I have Card{ enum declaration, private final's, card(Value value, Suit suit) {} then in the deck class will I have to copy the list of enums there again? Bit confused how my deck and card class will be using the enums. Thanks for your patience with a noobie!

Нет, перечислений в этом примере ведут себя, как если бы они были объявлены общественности статическую - поэтому они не нуждаются в карты экземпляр для доступа и доступны за пределами класса карты. Вам просто нужно квалифицировать их, чтобы использовать их. то есть Card.Rank.FOUR для доступа к четвертому экземпляру Rank. Таким образом, вам не нужно повторно объявлять перечисления в любом месте. Я лично считаю, что чистить все перечисления в собственном файле, в том же пакете, что и класс Card, но не в том же файле.

Edit 2 Вы состояние:

OK I've created public class CardEnum { public enum RANK {//ranks} public enum Suit { //suits} how do I get it to interact with my Card class?

Вы дали бы открытку два частных поля, один из типов CardEnum.Rank (обратите внимание, что имя перечисления не должно быть все колпачок) и один из CardEnum .Suit type.Затем вы назначили эти значения в конструкторе карты. Я бы сделал этот класс «неизменным», что означает, что после того, как вы установили Ранг и Костюм для Карты, его никогда не следует изменять. Поэтому я бы дал каждому из этих полей метод getter, но я бы не дал ему метод setter.

Так

public class Card { 
    private CardEnum.Suit suit; 
    private CardEdum.Rank rank; 

    public Card(CardEnum.Suit suit, CardEnum.Rank rank) { 
    this..... etc... 
    } 

    // getter methods here, but no setter methods 

    // .... 

Редактировать 3

one last issue with my get methods: public Rank getRank() { return rank; } gives the error: "rank cannot be resolved" I have editted my main post with my current code to make it easy to read.

Вы встроили свой ранг перечисления внутри класса CardEnum, и поэтому вы должны квалифицировать ранг и костюм с именем класса CardEnum. Таким образом, вы могли бы сделать:

public CardEnum.Rank getRank() { 
    return rank; 
} 

Одно предложения, чтобы избавиться от все дополнительного многословия - просто избавиться от CardEnum вообще, и вместо того, чтобы поставить каждое перечисление в своем собственном файле, файл Rank.java и костюм. java-файл. т.е.

// this guy goes in the Suit.java file 
public enum Suit { 
    CLUBS, DIAMONDS, HEARTS, SPADES 
} 

Затем, когда вы ссылаетесь на костюм, вы не должны называть его CardEnum.Suit.

+1

Я только что попробовал: public String toString() { \t \t return valueCard + suitCard; \t} Редактировать: Да, теперь он отлично работает, спасибо! – speak

+1

return this.value + "of" + this.suuit; – steelshark

+0

Btw вы можете легко просмотреть эти вещи в Интернете .. – steelshark