2012-06-27 2 views
2

지식을 향상시키기 위해 OOP 친화적 인 자바 블랙 잭 게임을 만들려고합니다.OOP 블랙 잭 게임 (갑판 만들기)

나는 벽에 부딪쳤다. 그리고 나는 그 문제를보기에 충분하지 않다. 누군가 내 문제를 지적 할 수 있는지 궁금합니다.

또한 관련 주제에 대한 검색을 수행 한 후 사람들에게 enum을 사용하여 다시 시간과 시간을 사용하는 것이 더 유용 할 것이라고 생각한 후 초보자에게이 사실을 알리는 것이 좋습니다. 또는 나는 당분간 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에서이 순간 : [카드 @의 addbf1, 42e816 @ 카드, 9304b1 @ 카드, ... 등] 어떻게합니까 이거는?

감사합니다.

는 편집 : 또한 앞으로이에 대한 답변을 필요로 누군가 내 카드 클래스에

@Override 
public String toString(){ 
    return valueCard + " of " + 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); 
      card.toString(); 
     } 
    } 
} 
} 

ENUM : public class 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

목표가 더 "OOP"가되는 경우 열거 형으로 카드를 포장해야합니다. 카드 갑판 예제 http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html을 참조하십시오. – assylias

+0

@assylias 링크, 훌륭한 정보를 제공해 주셔서 감사합니다! 열거 형 구현하기. 고맙습니다. – speak

답변

5

편집 결과에 따르면 현재 코드가 객체의 toString() 메소드에 의해 반환 된 기본값을 출력하고있는 것을 볼 수 있습니다.이 메소드는 현재 객체의 클래스 이름과 객체의 hashCode입니다. 이 문제를 해결하고 문자열을 이해하려면 각 클래스에 메서드를 재정의해야합니다. public String toString() Card 클래스에는 현재 카드의 값과 값을 설명하는 String을 반환하는 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 클래스 외부에서 사용할 수 있습니다. 당신은 그 (것)들을 사용하기 위하여 그 (것)들을 한정해야한다. 즉, Card.Rank.FOUR을 사용하여 Rank의 FOUR 인스턴스에 액세스합니다. 요약하면 어디에서나 열거 형을 다시 선언 할 필요가 없습니다. 필자는 개인적으로 각각의 열거 형을 자신의 파일에 Card 클래스와 동일한 패키지에 있지만 동일한 파일에 포함시키지 않는 것이 더 낫다고 생각합니다.

편집 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 중 하나를 줄 것이다 . 유형을 입력하십시오.그런 다음이 값들을 Card의 생성자에 할당합니다. 나는이 클래스를 "불변"으로 만들 것입니다. 즉, 카드에 대한 순위와 수트를 설정하면 절대 변경해서는 안됩니다. 그래서 나는이 필드들 각각에 게터 메소드를 주겠다. 그러나 나는 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 파일과 소송을 넣어 : 그래서 당신이 할 것입니다. 자바 파일. 즉

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

그렇다면 Suit를 참조 할 때 CardEnum.Suit이라고 부를 필요가 없습니다.

+1

방금 ​​시도 : public String toString() { \t \t return valueCard + suitCard; \t} 편집 : 예, 현재 잘 작동합니다. 감사합니다. – speak

+1

this + return "this + this.suit; – steelshark

+0

당신은 쉽게 인터넷에서 이러한 것들을 볼 수 있습니다. – steelshark

관련 문제