山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

わかりやすいJava オブジェクト指向編 プログラミング演習 その2

CardクラスとCardDeckクラス

前回、Cardクラスを作成しましたが、今回はCardクラスのメソッドを追加し、新たにCardDeckクラスを作成します。

f:id:yamakasa3:20180610023444p:plain

Cardクラス

public class Card {
    // 1-52の物理番号
    private int n;
    // 1つの種類の情報のカードの枚数
    static final int RANK = 13;
    // カードの種類の数
    static final int SUIT = 4;
    // 札文字列の配列
    static final String[] NS = {"A", "2", "3", "4", "5", "6"
            , "7", "8", "9", "10", "J", "Q", "K"};
    // 札種類の文字列の配列
    static final String[] SS = {"スペード", "ダ イ ヤ", "ク ラ ブ",
            "ハ ー ト"};
    // 札スコアの配列
    static final int[] PS = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10
            , 10, 10, 10};


    public Card(int n) {
        this.n =  n;
    }
    public int getNum() {
        return n;
    }
    // 物理番号に対応する札番号(1~13)を返す
    public int cardNumber() {
        return (n - 1) % RANK + 1;
    }
    // 物理番号に対応する札の種類番号(0~3)を返す
    public int suitNumber() {
        return (n - 1) / RANK;
    }
    // 札の点数を返す
    public int score() {
        return PS[cardNumber() - 1];
    }
    // 札番号の文字列表現を返す
    public String cardNumberString() {
        return NS[cardNumber() - 1];
    }
    // 札の種類の名前
    public String suitName() {
        return SS[suitNumber()];
    }
    // このクラスの文字列表現を返す
    public String toString() {
        return suitNumber() + " " + cardNumberString();
    }
    public static void main(String[] args) {
        for(int i = 1; i <= 52; i++) {
            Card c = new Card(i);
            /*
           System.out.printf(
               "number=%2d cardNumber=%2d suitNumber=%1d\n",
               c.getNum(), c.cardNumber(), c.suitNumber()
                   );
                   */
            System.out.println(c);
        }
    }

}

CardDeckクラス

52枚のカードをランダムに表示させます。

import java.util.ArrayList;

public class CardDeck {
    // セッツするカード枚数
    private int max;

    // カードを格納するArrayList
    private ArrayList<Card> deck;

    public CardDeck(int max) {
        this.max = max;
        deck = new ArrayList<Card>();
        initialize();
        for(int i = 0; i < max; i++) {
            Card c = new Card(i + 1);
            deck.add(c);
        }
    }
    public void initialize() {
        deck.clear();
    }

    public int getMax() {
        return max;
    }

    // 現在の残りカード枚数を返す
    public int size() {
        return deck.size();
    }

    // 次のカードオブジェクトを返す。なければnullを返す。
    // 残りのカードからランダムに引く。
    public Card next() {
        int n = size();
        if(n == 0) {
            return null;
        }
        int p = (int)(Math.random() * n);
        Card c = deck.remove(p);
        return c;
    }
    void check() {
        for(Card c : deck) {
            System.out.println(c);
        }
    }
    /*
   public static void main(String[] args) {
       CardDeck cd = new CardDeck(52);
       cd.check();
   }
   */
    public static void main(String[] args) {
        // カードデッキを作成
        CardDeck cd = new CardDeck(52);
        Card card;
        // カードを取り出す
        while((card = cd.next()) != null) {
            System.out.println(card);
        }
    }
}

新わかりやすいJava オブジェクト指向徹底解説

新わかりやすいJava オブジェクト指向徹底解説

わかりやすいJavaオブジェクト指向編

わかりやすいJavaオブジェクト指向編