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

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

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

ユーティリティクラスとゲームクラス

今日でプログラミング演習を終えました。

f:id:yamakasa3:20180622153432p:plain

ユーティリティクラスは、JavaのMathクラスのような働きをします。ここでは、文字列の入力を受け付けます。

ゲームクラスでは、Card, CardDeck, Player, Dealerの4つのクラスを管理してブラックジャックをします。

Utilクラス

package mylib;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Util {
    public static String getString(String s) {
        BufferedReader in =
                new BufferedReader(new InputStreamReader(System.in));
        String str = "";
        try {
            System.out.println(s + " >");
            str = in.readLine();
            return (str.length() > 0) ?  str : null;
        }catch(Exception e) {
            return "";
        }
    }
}

BlackJackクラス

import mylib.Util;
public class BlackJack {
    private CardDeck deck;
    private Dealer dealer;
    private Player player;

    // クラス変数
    static final String DEALER_ICON = "□";
    static final String PLAYLER_ICON = "■";
    static final String BANNER = "\n■□■□ Blackjack □■□■";
    static final int CARDS = 52;
    static final String Q_CONTINUE = "続けますか(Enter)\n";
    static final String Q_DEAL = "さらにカードを引きますか(Enter)\n";
    static final String EVEN = "引き分け";
    static final String WIN = "あなたの勝ち";
    static final String LOST = "ディーラーの勝ち";
    static final String ANIMATION_ICON = "□■";
    static final int TIMES = 25;    // 表示回数
    static final int DELAY = 20;    // 表示時間

    //1ゲームに必要な最大カード枚数
    static final int LIMIT = 17;
    public BlackJack(String dname, String pname) {
        deck = new CardDeck(CARDS);
        dealer = new Dealer(dname, DEALER_ICON, deck);
        player = new Player(pname, PLAYLER_ICON, deck);
    }

    // デッキの枚数が17未満であれば、初期化する。
    public void initialize() {
        if(deck.size() < LIMIT) {
            deck.initialize();
            dealer.initialize();
            player.initialize();
        }
    }
    // 手札を公開する
    public void show() {
        System.out.println();
        System.out.println(dealer);
        System.out.println(player);
    }
    // ゲームを繰り返し実行する
    @SuppressWarnings("unused")
    public void play() {
        String str;
        do {
            System.out.println(BANNER);
            initialize();
            // 手札を公開 親の手札は一枚だけ
            showHalf();
            // プレイヤは必要なだけカードを引く
            deal();
            // ディーラーの手札のスコアが16以上になるまでカードを引く
            dealer.over16();
            // アニメーションを実行
            animation(TIMES, DELAY, ANIMATION_ICON);
            // 全ての手札を公開する
            show();
            // スコアを比較して判定結果を表示する
            judge();
        }while((str=Util.getString(Q_CONTINUE)) == null);

    }
    // 子の手札を公開し、親の手札を1枚公開する
    public void showHalf() {
        System.out.println();
        System.out.println(dealer.half());
        System.out.println(player);
    }
    // 子が必要なだけカードを引く
    public void deal() {
        while(player.score() < 21) {
            String str = Util.getString(Q_DEAL);
            if(str != null) {
                break;
            }
            player.addACard();
            showHalf();
        }
    }
    // スコアを比較して勝敗を表示する
    public void judge() {
        int d = dealer.score();
        int p = player.score();
        if((d > 21 && p > 21) || d == p) {
            System.out.println(EVEN);
        }else if(p <= 21 && (d > 21 || d < p)) {
            System.out.println(WIN);
        }else {
            System.out.println(LOST);
        }
    }
    // アニメーションを表示
    public void animation(int times, int delay, String icon) {
        System.out.println();
        try {
            for(int i = 0; i < times; i++) {
                System.out.println(icon);
                Thread.sleep(delay);
            }
        }catch(InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        BlackJack bj = new BlackJack("delaer", "plaer");
        bj.play();
    }
}

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

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

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

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