2

OOP フレンドリーな Java BlackJack ゲームを作成して、知識を深めようとしています。

私は壁にぶつかりましたが、問題を理解するのに十分な知識がありません。誰かが私の問題を指摘できるかどうか疑問に思っていました。

さらに、これに関する関連トピックをグーグルで調べた後、列挙型を使用する方がより有益であると何度も言っている人を見つけました。初心者にはこれをお勧めしますか? または、当面は文字列配列に固執する必要があります。

ありがとうございました。

私のコード:

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, Card@42e816, Card@9304b1, ... etc] これはどういう意味ですか?

お時間をいただきありがとうございます。

編集:将来これに対する回答も必要な人:

追加した:

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

Card クラスに追加し、それを 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: 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;
}
}
4

1 に答える 1

5

あなたの編集に基づいて、コードがオブジェクトのメソッドによって返されたデフォルト値を出力していることがわかりますtoString()。これは、現在のオブジェクトのクラスの名前とオブジェクトの hashCode です。public String toString()これを修正し、文字列を意味のあるものにするには、各クラスにメソッド オーバーライドを与える必要があります。Card クラスには、現在のカードのスーツと値を表す文字列を返す toString() メソッドが必要です。Deck クラスは、各 Card を繰り返し処理し、カードの toString() を呼び出す必要があります。

何かのようなもの:

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

以下に関する編集:

docs.oracle.com/javase/1.5.0/docs/guide/language/enums.htmlを見ているときに興味があった列挙型を掘り下げようとしていますが、カードとデッキの2つの別々のクラスがあります. これを機能させるには、両方の列挙型セットを両方のクラスにコピーする必要がありますか? だから私は Card{ 列挙型宣言、プライベートファイナル、カード(値値、スーツスーツ) {} を持っているので、デッキクラスで列挙型のリストをもう一度コピーする必要がありますか? 私のデッキとカードクラスが列挙型をどのように使用するのか少し混乱しました. noobie をご利用いただきありがとうございます。

いいえ、その例の列挙型は、public static と宣言されているかのように動作します。そのため、Card インスタンスにアクセスする必要はなく、Card クラスの外部で使用できます。それらを使用するには、それらを修飾する必要があります。つまり、Card.Rank.FOUR は、Rank の FOUR インスタンスにアクセスします。つまり、列挙型をどこでも再宣言する必要はありません。個人的には、各列挙型を Card クラスと同じパッケージ内の独自のファイルに配置する方がクリーンだと思いますが、同じファイルには配置しません。

編集2 あなたは次のように述べています:

OK public class CardEnum { public enum RANK {//ranks} public enum Suit { //suits} を作成しました Card クラスとやり取りするにはどうすればよいですか?

Card に 2 つのプライベートフィールドを指定します。1 つは CardEnum.Rank 型 (列挙名はすべて大文字にしないでください) で、もう 1 つは CardEnum.Suit 型です。次に、Card のコンストラクターでこれらの値を割り当てます。このクラスを「不変」にします。つまり、カードのランクとスーツを設定したら、それを変更することはできません。したがって、これらの各フィールドに 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

get メソッドに関する最後の問題: public Rank getRank() { return rank; 「ランクを解決できません」というエラーが表示されます。読みやすくするために、メインの投稿を現在のコードで編集しました。

Rank 列挙型を CardEnum クラス内に埋め込んだため、CardEnum クラス名で Rank と Suit を修飾する必要があります。したがって、次のようにします。

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

余分な言い回しをすべて取り除くための 1 つの提案 - CardEnum を完全に取り除き、代わりに各列挙型を独自のファイル、Rank.java ファイルと Suit.java ファイルに入れます。すなわち

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

次に、Suit を参照するときに、CardEnum.Suit と呼ぶ必要はありません。

于 2012-06-27T16:36:17.923 に答える