Languages/Java

[자바 중급 개념] 02. 캐스팅과 제네릭

Dev다D 2021. 3. 8. 22:01
반응형

블랙잭 pt. 2

 

기본 룰

블랙잭의 아주 간략화된 룰을 설명하겠습니다.

  1. 딜러와 플레이어가 카드를 두 장씩 받습니다.
  2. 처음 받은 두 장의 합이 21이면 '블랙잭'입니다. 자동으로 승리합니다.
  3. 딜러와 플레이어 중 핸드 가치(카드 가치의 합)가 더 높은 사람이 이깁니다. 하지만 핸드 가치가 21이 넘어가면 패배합니다.
  4. 카드를 더 받을 수 있습니다.
  5. Ace는 일반적으로 11의 가치를 갖지만, 핸드 가치(카드 가치의 합)가 21이 넘어간 경우 1의 가치를 갖습니다.

 

BlackJackHand

'카드 셔플러' 과제에서 만들었던 Deck를 상속받아, 카드를 쥘 BlackjackHand 클래스를 구현해봅시다.

 

캐스팅

BlackjackHand를 구현하는데 주의해야 할 것이 있습니다.

Deck 클래스에서 선언된 ArrayListCard 인스턴스를 담는 ArrayList입니다.

 

 

Card 클래스를 상속한 BlackjackCard 인스턴스도 cards에 넣을 수 있겠죠? 하지만 cards에서 BlackjackCard 인스턴스를 꺼내서 쓸 때에는 캐스팅이 꼭 필요합니다! 이 점을 유의하며 BlackjackHand 클래스를 작성해봅시다.

 

public int getValue()

블랙잭의 룰에 맞게 핸드의 가치를 리턴하는 메소드를 써주세요.

 

public boolean isBusted()

핸드의 가치가 21을 넘으면 '파산(Busted)'입니다. 현재 핸드가 파산했는지 리턴해주는 메소드를 써주세요.

 

public boolean isBlackjack()

핸드가 두 장의 카드만 가지고 있고 가치가 21이면 '블랙잭'입니다. 현재 핸드가 블랙잭인지 리턴해주는 메소드를 써주세요.

 

 


package Ex0203;

public class BlackjackHand extends Deck {
    public int getValue() {
        int value = 0;
        int aceCount = 0;

        for (Card c: getCards()) {
            BlackjackCard card = (BlackjackCard) c;

            if (card.isAce()) {
                aceCount++;
            }

            value += card.getValue();
        }

        while (aceCount > 0 && value > 21) {
            value -= 10;
            aceCount--;
        }

        return value;
    }

    public boolean isBusted() {
        return getValue() > 21;
    }

    public boolean isBlackjack() {
        return getValue() == 21 && getCards().size() == 2;
    }

}

본 내용은 Codeit의  '자바 기초' 강의를
참고하여 작성한 내용입니다.

 

반응형