본문 바로가기

Programming language/Java

Java - 실무6 [블랙잭]

Card.java

- 카드 클래스이다.

public class Card {
    // 상수들, 바뀔 필요가 없기에 final로 정의하였고 getter, setter 함수가 없어도 된다. (상수기 떄문에)
    public final int suitNumber;
    public final int rankNumber;

    // 생성자 인수 : 카드 종류, 카드 랭크
    public Card(int suitNumber, int rankNumber) {
        this.suitNumber = suitNumber;
        this.rankNumber = rankNumber;

    }

    // suitNumber의 getter
    // 현재카드의 suitNumber를 문자열출력의 모양으로 바꾼다.
    public String getSuit() {
        String suit = null;
        switch (this.suitNumber) {
            case 1: {
                suit = "Clubs";
                break;
            }
            case 2: {
                suit = "Hearts";
                break;
            }
            case 3: {
                suit = "Diamonds";
                break;
            }
            case 4: {
                suit = "Spaces";
                break;
            }
            default: {
                System.out.println("1,2,3,4 중 하나의 값만 입력하세요.");
                break;
            }

        }
        return suit;
    }

    // suitRank의 getter
    // 현재카드의 suitRank를 문자열출력의 모양으로 바꾼다.
    public String getRank() {
        String rank = null;
        switch (this.rankNumber) {
            case 1: {
                rank = "Ace";
                break;
            }
            case 2: {
                rank = "2";
                break;
            }
            case 3: {
                rank = "3";
                break;
            }
            case 4: {
                rank = "4";
                break;
            }
            case 5: {
                rank = "5";
                break;
            }
            case 6: {
                rank = "6";
                break;
            }
            case 7: {
                rank = "7";
                break;
            }
            case 8: {
                rank = "8";
                break;
            }
            case 9: {
                rank = "9";
                break;
            }
            case 10: {
                rank = "10";
                break;
            }
            case 11: {
                rank = "Jack";
                break;
            }
            case 12: {
                rank = "Queen";
                break;
            }
            case 13: {
                rank = "King";
                break;
            }
            default: {
                System.out.println("1 ~ 13 중 하나의 값만 입력하세요.");
                break;
            }
        }
        return rank;
    }
    //String 함수의 toString 함수의 오버라이드
    @Override
    public String toString(){
        return this.getRank() + " of " + this.getSuit();
    }
}

Deck.java

import java.util.ArrayList;

import java.util.Collections;
import java.util.Random;
// 카드들을 모아둔 Deck 클래스 이므로 카드 ArrayList가 존재한다.
public class Deck {
    private ArrayList<Card> cards = new ArrayList<>();
    // 카드리스트를 private으로 설정하여 getter 메소드
    public ArrayList<Card> getCards() {
        return this.cards;
    }

    // 카드덱에 카드를 넣는 add 메소드
    public void addCard(Card card) {
        this.cards.add(card);
    }

    // 덱안의 카드를 보여주는 print 메소드
    public void print() {
        for (Card card : this.cards) {
            //System.out.println(card); <- toString을 오버라이드 하였으므로 같은 역할을 수행한다.
            System.out.println(card.toString());
        }
    }
    // 카드덱 안의 카드들을 랜덤으로 섞는다.
    public void shuffle() {
        Random random = new Random();
        int shuffleTimes = random.nextInt(46);
        for (int i = 0; i < shuffleTimes; i++) {
            int shuffleCard1 = random.nextInt(this.cards.size());
            int shuffleCard2 = random.nextInt(this.cards.size());
            Collections.swap(this.cards, shuffleCard1, shuffleCard2);
        }
        //Collections.shuffle(this.cards); 위 전체 코드와 같은 역할을 수행한다.
    }

    // 덱의 마지막 부분 5장을 가져와서 dealing 한다.
    public Deck deal(int count){
        Deck hand = new Deck();
        for (int i = 0; i < count; i++) {
            hand.addCard(this.cards.get(cards.size() - 1));
            this.cards.remove(this.cards.size() -1);
        }
        return hand;
    }
}

- 카드를 넣어놓는 덱 클래스이다.

- 셔플을 하고 손안에 dealing한다.

 

 

public class Main {
    public static void main(String[] args) {
        // 52장 스탠다드 카드 덱 생성
        Deck standardDeck = new Deck();

        for (int suit = 1; suit <= 4; suit++) {
            for (int rank = 1; rank <= 13; rank++) {
                Card newCard = new Card(suit, rank);

                standardDeck.addCard(newCard);
            }
        }

        // 카드 셔플
        standardDeck.shuffle();

        // 딜링
        Deck hand1 = standardDeck.deal(5);
        Deck hand2 = standardDeck.deal(5);

        // 각 핸드 출력
        hand1.print();
        System.out.println("----------");
        hand2.print();
    }
}
King of Spaces
4 of Spaces
Jack of Spaces
10 of Spaces
9 of Spaces
----------
8 of Spaces
7 of Spaces
King of Diamonds
5 of Spaces
Queen of Spaces

BlackjackCard.java

- Card 클래스를 상속받아 만든 클래스이다.

- value 라는 블랙잭 카드가치가 추가되었고 이를 위한 getter, 생성자 변경이있다.

- Ace라는 카드를 구분하는 메소드도 추가된다. 

public class BlackjackCard extends Card {
    // 블랙잭게임에서의 카드의 가치
    public final int value;
    
    // 생성자 : 인수 suitNumber, rankNumber
    
    public BlackjackCard(int suitNumber, int rankNumber) {
        // 부모클래스의 생성자 기능을 받고
        super(suitNumber, rankNumber);
        // value 값의 지정을 해준다.
        if (this.getRank().equals("Ace")) {
            this.value = 11;
        } else if (this.getRank().equals(("Jack")) || this.getRank().equals(("King")) || this.getRank().equals(("Queen"))) {
            this.value = 10;
        } else if (this.getRank().equals(("2"))) {
            this.value = 2;
        } else if (this.getRank().equals(("3"))) {
            this.value = 3;
        } else if (this.getRank().equals(("4"))) {
            this.value = 4;
        } else if (this.getRank().equals(("5"))) {
            this.value = 5;
        } else if (this.getRank().equals(("6"))) {
            this.value = 6;
        } else if (this.getRank().equals(("7"))) {
            this.value = 7;
        } else if (this.getRank().equals(("8"))) {
            this.value = 8;
        } else if (this.getRank().equals(("9"))) {
            this.value = 9;
        } else {
            System.out.println("숫자값이 Ace, Jack, King, Queen, 2~9값이 아닙니다.");
            this.value = -1;
        }
    }

    // 블랙잭카드의 value getter 
    public int getValue() {
        return this.value;
    }

    // 블랙카드는 1혹은 11모두 있을 수 있으므로 Ace인지 확인하는 메소드
    public boolean isAce() {
        if (this.getRank().equals("Ace") || this.getRank().equals("11")) {
            return true;
        } else {
            return false;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        BlackjackCard card1 = new BlackjackCard(1, 1);
        BlackjackCard card2 = new BlackjackCard(2, 6);
        BlackjackCard card3 = new BlackjackCard(4, 12);

        System.out.println(card1.getValue());
        System.out.println(card1.isAce());
        System.out.println(card2.getValue());
        System.out.println(card2.isAce());
        System.out.println(card3.getValue());
        System.out.println(card3.isAce());
    }
}
11
true
6
false
10
false

BlackjackHand.java

- Deck을 확장해서 만든 class이다.

- 모든 것을 상속받으며 BlackjackCard 캐스팅을 사용한다.

import java.util.ArrayList;

// Deck 상속
public class BlackjackHand extends Deck {
    
    // 손에 갖고 있는 카드들의 가치를 반환
    public int getValue(){
        // Ace 카드가 있는가?
        boolean isAce = false;
        // 핸드의 총가치
        int totalValue = 0;
        // 핸드의 카드들에서 카드를 하나씩 꺼내어 계산
        for (Card card: this.cards) {
            // 이카드가 Ace인가?
            isAce = ((BlackjackCard)card).isAce();
            // 이카드의 가치는?
            int value = ((BlackjackCard)card).getValue();
            totalValue += value;
        }
        // 핸드에 에이스카드가 있고 총가치의 합이 21이 넘으면 핸드의 에이스는 1의 값을 가지므로
        if (isAce == true && totalValue > 21){
            totalValue -= 10;
        }
        return totalValue;
    }
    // 파산했는가?
    public boolean isBusted(){
        boolean busted = false;
        // 핸드의 값이 21이 넘으면 파산
        if (getValue() > 21){
            busted = true;
        }
        return busted;
    }
    // 블랙잭인가?
    public boolean isBlackjack(){
        boolean isBlackjack = false;
        // 핸드에 카드가 2개밖에 업고 가치가 21이면 블랙잭
        if (this.cards.size() == 2 && getValue() == 21){
            isBlackjack = true;
        }

        return isBlackjack;
    }
}

'Programming language > Java' 카테고리의 다른 글

Java - 13 [Generic, 인터페이스]  (0) 2020.10.21
Java - 12 [캐스팅]  (0) 2020.10.19
Java - 11 [Random , Collections]  (0) 2020.10.19
Java - 10 [protected 접근제어자, Object 클래스]  (0) 2020.10.19
Java - 9 [상속, super]  (1) 2020.10.18