본문 바로가기
JAVA

[JAVA] 카지노 게임 블랙잭 만들기

by 승븐지 2024. 7. 18.
반응형
반응형

블랙잭 이란? 

블랙잭(Blackjack)은 카지노 에서 가장 인기 있는 카드 게임 중 하나이다. 블랙잭은 딜러와 플레이어가 참여하는 게임으로, 각 플레이어는 딜러와 두 장의 카드를 받으며, 플레이어는 자신의 카드의 합계를 계산하여 21에 가까워지도록 더 많은 카드를 받거나, 그대로 멈출 수 있다. 딜러는 자신의 카드를 공개하고, 17 이상이 될 때까지 카드를 계속 뽑습니다. 게임의 목표는 딜러보다 높은 합계를 가지면서 21에 가까워지는 것입니다. 하지만, 21을 초과하면 패배하게 됩니다. 블랙잭은 간단하면서도 전략적인 요소가 있는 게임으로, 다양한 버전과 변형이 존재한다.

 

 

JAVA 코드

 

public class Blackjack {
    private static final int CARD_LIMIT = 21; // 카드 합계 제한
    private static final int DEALER_MIN = 17; // 딜러 최소 합계

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("블랙잭에 오신 것을 환영합니다!");

        // 카드 덱 초기화 및 섞기
        List<String> deck = createDeck();
        Collections.shuffle(deck);

        // 플레이어와 딜러 손 초기화
        List<String> playerHand = new ArrayList<>();
        List<String> dealerHand = new ArrayList<>();

        // 플레이어와 딜러에게 초기 두 장의 카드 나눠주기
        dealCard(playerHand, deck);
        dealCard(playerHand, deck);
        dealCard(dealerHand, deck);
        dealCard(dealerHand, deck);

        // 플레이어의 손과 딜러의 첫 번째 카드 보여주기
        System.out.println("당신의 패: " + playerHand);
        System.out.println("딜러의 패: [" + dealerHand.get(0) + ", *]");

        // 플레이어가 21을 초과하거나 서지 않을 때까지 카드를 더 받거나 서기 선택 가능
        while (getHandValue(playerHand) < CARD_LIMIT) {
            System.out.print("카드를 받으시겠습니까? 받으시려면 'hit', 서려면 'stand'을 입력하세요: ");
            String choice = scanner.nextLine().toLowerCase();

            if (choice.equals("hit")) {
                dealCard(playerHand, deck);
                System.out.println("당신의 패: " + playerHand);
            } else if (choice.equals("stand")) {
                break;
            } else {
                System.out.println("잘못된 선택입니다. 'hit' 또는 'stand' 중 선택해 주세요.");
            }
        }

        // 딜러의 전체 손패 보여주기
        System.out.println("딜러의 손패: " + dealerHand);

        // 딜러의 차례
        while (getHandValue(dealerHand) < DEALER_MIN) {
            dealCard(dealerHand, deck);
            System.out.println("딜러가 카드를 뽑습니다: " + dealerHand.get(dealerHand.size() - 1));
        }

        // 승자 결정
        int playerValue = getHandValue(playerHand);
        int dealerValue = getHandValue(dealerHand);
        if (playerValue > CARD_LIMIT) {
            System.out.println("버스트! 딜러의 승리입니다.");
        } else if (dealerValue > CARD_LIMIT) {
            System.out.println("딜러가 버스트되었습니다. 당신의 승리입니다!");
        } else if (playerValue > dealerValue) {
            System.out.println("당신의 승리입니다!");
        } else if (dealerValue > playerValue) {
            System.out.println("딜러의 승리입니다.");
        } else {
            System.out.println("무승부입니다!");
        }
    }

    private static List<String> createDeck() {
        List<String> deck = new ArrayList<>();
        for (int i = 2; i <= 10; i++) {
            for (int j = 0; j < 4; j++) {
                deck.add(Integer.toString(i));
            }
        }
        for (int i = 0; i < 4; i++) {
            deck.add("J");
            deck.add("Q");
            deck.add("K");
            deck.add("A");
        }
        return deck;
    }

    private static void dealCard(List<String> hand, List<String> deck) {
        String card = deck.remove(0);
        hand.add(card);
    }

    private static int getHandValue(List<String> hand) {
        int value = 0;
        int aces = 0;

        for (String card : hand) {
            if (card.equals("J") || card.equals("Q") || card.equals("K")) {
                value += 10;
            } else if (card.equals("A")) {
                aces++;
            } else {
                value += Integer.parseInt(card);
            }
        }

        for (int i = 0; i < aces; i++) {
            if (value + 11 > CARD_LIMIT) {
                value += 1;
            } else {
                value += 11;
            }
        }

        return value;
    }
}

 

실행 결과이다.

 

간단하게 리뷰를 해보겠다.!

 

위 코드에서 Blackjack 클래스는 블랙잭 게임의 로직이며
createDeck 메소드는 덱을 초기화하고 셔플하는 역할을 한다.
dealCard 메소드는 카드 한 장을 덱에서 뽑아 손에 추가하는 역할을 한다.
getHandValue 메소드는 손의 카드 값 합계를 계산 한다.
main 메소드에서는 게임을 진행하며, 먼저 덱을 초기화하고 셔플 한다.
그 후, 플레이어와 딜러의 초기 카드를 나누어 준다.
플레이어에게는 두 장의 카드를, 딜러에게는 한 장의 카드를 공개하고, 게임이 시작된다.
플레이어는 추가 카드를 받을지 말지 결정할 수 있다.
플레이어가 버스트(카드 값이 21을 초과)하면 패배한다.
그 후, 딜러는 17 이상의 카드 값을 가질 때까지 카드를 계속해서 받는다. 딜러가 버스트하면 플레이어가 이기고, 그렇지 않은 경우에는 더 높은 카드 값의 손이 이긴다.

반응형