0

やあみんな、私はこのサイトにenum不慣れですが、sに関する多くの情報を見てきました. 私がやろうとしているのは、カード クラスのカード コンストラクターに int 値を取り込ませ、それらの値に関連付けられたランクとスーツを返すことです。これは、私が Card クラスで取り組んでいるものです。


package blackjack;

public class Card {
    static Rank rank;
    static Suit suit;

    public enum Rank{ACE(1),TWO(2),THREE(3),FOUR(4),FIVE(5),SIX(6),SEVEN(7),
        EIGHT(8),NINE(9),TEN(10),JACK(11),QUEEN(12),KING(13);

        private int code;

        public int getCode() {
            return code;
        }

        private Rank(int code) {
            this.code = code;
        }

        public static Rank valueOf(int code) {
            for (Rank rank: Rank.values()) { 
                if (rank.getCode()==code) 
                    return rank;
             }
            throw new RuntimeException("INVALID CODE");
        }

        @Override public String toString() {
            String s = super.toString();
            return s.substring(0, 1) + s.substring(1).toLowerCase();
        }
    }


    public enum Suit{SPADES(1),HEARTS(2),CLUBS(3),DIAMONDS(4);

        private int code;



        public int getCode() {
            return code;
        }


        private Suit(int code) {
            this.code = code;
        } 

        public static Suit valueOf(int code) {
            for (Suit suit: Suit.values()) { 
                if (suit.getCode()==code) 
                    return suit;
             }
            throw new RuntimeException("INVALID CODE");
        }
        @Override public String toString() {
            String s = super.toString();
            return s.substring(0, 1) + s.substring(1).toLowerCase();
        }
    }

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

    public static void setRank(Rank rank) {
        Card.rank = rank;
    }

    public static Rank getRank() {
        return rank;
    }

    public static void setSuit(Suit suit) {
        Card.suit = suit;
    }

    public static Suit getSuit() {
        return suit;
    }
}

ここで、BlackJack と呼ばれるメイン クラスで本当にやりたいことは、新しいカードを作成し、Card で作成したコンストラクターからの int を使用してランクとスーツを割り当て、それを出力して動作を確認することだけです。理解できないこのクレイジーなエラーが発生し続けます。どんな助けでも大歓迎です!これは私の BlackJack/メイン クラスです。


package blackjack;

public class BlackJack {    

    public static void main(String[] args) {

        Card c1 = new Card(1,1);
        System.out.println(c1.rank.toString());
    }
}
4

2 に答える 2

1

次の編集を提案します。

  1. 列挙型を静的にする
  2. valueOfAlternateコードを取り除くことができる場合、これはカードに連続した番号があり、宣言がその順序である場合にのみ機能します。値は 0 ベースであるため、パラメーターから 1 を差し引く必要があります。
  3. パラメータを直接受け取るコンストラクタを提供する
  4. カードのフィールド、およびセッターとゲッターを非静的にします。

package blackjack;  

public class Card {
    private final Rank rank;
    private final Suit suit;

    public enum Rank {
        ACE(1),TWO(2),THREE(3),FOUR(4),FIVE(5),SIX(6),SEVEN(7),
        EIGHT(8),NINE(9),TEN(10),JACK(11),QUEEN(12),KING(13);

        private final int code;

        public int getCode() {
            return code;
        }

        private Rank(int code) {
            this.code = code;
        }

        public static Rank valueOf(int code) {
            for (Rank rank: Rank.values()) { 
                if (rank.getCode()==code) 
                    return rank;
             }
            throw new RuntimeException("INVALID CODE");
        }

        public static Rank valueOfAlternate(int code) {
            return Rank.values()[code-1];
        }

        @Override public String toString() {
            String s = super.toString();
            return s.substring(0, 1) + s.substring(1).toLowerCase();
        }
    }


    public enum Suit{
        SPADES(1),HEARTS(2),CLUBS(3),DIAMONDS(4);

        private final int code;

        public int getCode() {
            return code;
        }

        private Suit(int code) {
            this.code = code;
        } 

        public static Suit valueOf(int code) {
            for (Suit suit: Suit.values()) { 
                if (suit.getCode()==code) 
                    return suit;
             }
            throw new RuntimeException("INVALID CODE");
        }

        public static Suit valueOfAlternate(int code) {
            return Suit.values()[code-1];
        }

        @Override public String toString() {
            String s = super.toString();
            return s.substring(0, 1) + s.substring(1).toLowerCase();
        }
    }

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

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

    public Rank getRank() {
        return rank;
    }

    public Suit getSuit() {
        return suit;
    }

}

あなたのクレイジーなエラーの説明がなければ、これが私が提供できる最高のものです。

于 2013-04-19T20:17:32.283 に答える
0

複数の引数を持つコンストラクターを列挙に与えることができます。メソッドをオーバーライドして ( などtoString)、列挙内に独自のメソッドを作成することもできます ( などgetValue)。

したがって、カードクラスは次のようになります。

public class Card {

    public Enum Suit {

        SPADE(0, "Spade"), HEART(1, "HEART"), ... ;

        private int code = -1;
        private int name = null;

        private Suit(int code, String name) {
            this.code = code;
            this.name = name;
        }

        public int getValue() { return code; }

        @Override
        public String toString() { return name; }

    }

    private Suit suit = null;
    private Rank rank = null;

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

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

    @Override
    public String toString() {
        return suit.toString() + "-" + rank.toString();
    }
}
于 2013-04-19T19:57:59.623 に答える