본문 바로가기

자바(java)

블랙잭 카드 게임: 블랙잭 룰에 따라 카드 게임을 구현합니다.

반응형

블랙잭 카드 게임: 자바 구현

1. 내용 설명

블랙잭은 카드 게임으로, 플레이어와 딜러가 카드의 합이 21에 가깝게 만드는 것을 목표로 합니다. 21을 초과하지 않는 한도 내에서 카드의 합을 최대로 만들어야 합니다. 이 게임은 플레이어가 'Hit' 또는 'Stand'를 선택할 수 있습니다.

2. 프로그램 간 사용 함수 설명

  • dealCard(): 카드를 무작위로 분배합니다.
  • calculateScore(): 현재 손패의 점수를 계산합니다.
  • checkWinner(): 승자를 결정합니다.
  • playerTurn(), dealerTurn(): 플레이어와 딜러의 턴을 처리합니다.

3. 코딩 내용

import java.util.*;

public class BlackjackGame {
    private List<String> deck = Arrays.asList("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A");
    private List<String> playerHand = new ArrayList<>();
    private List<String> dealerHand = new ArrayList<>();
    private Scanner scanner = new Scanner(System.in);
    private Random random = new Random();

    public BlackjackGame() {
        startGame();
    }

    private void startGame() {
        shuffleDeck();
        playerHand.add(dealCard());
        playerHand.add(dealCard());
        dealerHand.add(dealCard());
        dealerHand.add(dealCard());

        System.out.println("Your hand: " + playerHand);
        playerTurn();
        dealerTurn();
        checkWinner();
    }

 

 

 

    private void shuffleDeck() {
        Collections.shuffle(deck, random);
    }

    private String dealCard() {
        return deck.get(random.nextInt(deck.size()));
    }

    private int calculateScore(List<String> hand) {
        int score = 0;

 

 

 

        int aceCount = 0;

        for (String card : hand) {
            if (card.equals("A")) {
                aceCount++;
                score += 11;
            } else if (Arrays.asList("J", "Q", "K").contains(card)) {
                score += 10;
            } else {
                score += Integer.parseInt(card);
            }
        }

        while (score > 21 && aceCount > 0) {
            score -= 10; // Count Ace as 1 instead of 11
            aceCount--;
        }

        return score;
    }

    private void playerTurn() {
        while (true) {
            System.out.println("Your score: " + calculateScore(playerHand));
            System.out.print("Hit or Stand? (h/s): ");
            String action = scanner.nextLine();

            if (action.toLowerCase().startsWith("h")) {
                playerHand.add(dealCard());
                System.out.println("You hit.");

 

 

                System.out.println("Your hand: " + playerHand);
                if (calculateScore(playerHand) > 21) {
                    System.out.println("You busted!");
                    break;
                }
            } else {
                System.out.println("You stand.");
                break;
            }
        }
    }

    private void dealerTurn() {
        while (calculateScore(dealerHand) < 17) {
            dealerHand.add(dealCard());
        }
        System.out.println("Dealer's hand: " + dealerHand);
        System.out.println("Dealer's score: " + calculateScore(dealerHand));
    }

    private void checkWinner() {
        int playerScore = calculateScore(playerHand);
        int dealerScore = calculateScore(dealerHand);

        System.out.println("Your score: " + playerScore);
        System.out.println("Dealer's score: " + dealerScore);

        if (playerScore > 21) {
            System.out.println("Dealer wins!");
        } else if 

 

 

 

(dealerScore > 21 || playerScore > dealerScore) {
            System.out.println("You win!");
        } else if (playerScore == dealerScore) {
            System.out.println("It's a tie!");
        } else {
            System.out.println("Dealer wins!");
        }
    }

    public static void main(String[] args) {
        new BlackjackGame();
    }
}

 

 

4. 전문용어

  • Deck: 카드 덱, 게임에 사용되는 카드의 집합입니다.
  • Hand: 손패, 플레이어 또는 딜러가 가지고 있는 카드들입니다.
  • Hit: 추가 카드를 받는 행동입니다.
  • Stand: 현재 손패를 유지하고 턴을 종료하는 행동입니다.
  • Random: 난수를 생성하는 자바 클래스입니다.

5. 라이브러리 추가 및 실행 방법

  • 본 프로그램은 자바 표준 라이브러리만 사용합니다.

 

컴파일:
javac BlackjackGame.java

 

실행:
java BlackjackGame

반응형