• [커널아카데미] 백엔드 부트캠프 12기 6주차 - 과제를 해볼까

    2025. 5. 16.

    by. 고구마달랭이

    카드 게임 과제 회고

    이번 카드 게임 과제를 진행하면서 많은 점에서 배운 것 같다. 처음에는 단순히 카드 게임을 만드는 것이라고 생각했지만 구현하면서 다양한 설계와 게임 로직을 고려해야 했고 그 과정에서 객체지향적인 설계와 게임의 흐름에 대해 더 깊이 이해하게 되었다.

     

    주요 목표

    • 카드 게임 구현: 플레이어가 참여하여 카드를 나누고, 점수에 따른 승패를 판별하는 게임 로직을 구현
    • 객체지향 설계: Card, Player, Game, Deck, Dealer 클래스를 통해 게임 내 역할을 분담하고, 객체 간 상호작용을 관리

     

    구현한 주요 코드

     

    1. Card 클래스

    • 각 카드의 번호와 종류를 정의한 Card 클래스를 만들었다. 카드 번호와 종류는 Card 객체가 생성될 때마다 고유하게 설정되며 toString 메서드로 카드 정보를 출력할 수 있다.
    package cardgame;
    
    public class Card {
        private final int number;
        private final String kind;
    
        Card(int number, String kind) {
            this.number = number;
            this.kind = kind;
        }
    
        public int getNumber() {
            return number;
        }
    
        public String getKind() {
            return kind;
        }
    
        public String toString(){
            return kind + " " + number;
        }
    }

     

    2. Player 클래스

    • 각 플레이어는 닉네임, 게임머니, 카드 핸드 등을 가진다. addCards 메서드를 통해 받은 카드를 핸드에 추가하고 showPlayers, showCards 메서드를 통해 플레이어 정보를 출력할 수 있다.
    package cardgame;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Player {
        private String nickname;
        private int gameMoney;
        private List<Card> hand = new ArrayList<>();
    
        Player(String nickname){
            this.nickname = nickname;
            this.gameMoney = 10000;  // 초기 게임머니 10,000원
        }
    
        public String getNickname(){
            return nickname;
        }
    
        public int getGameMoney(){
            return gameMoney;
        }
    
        public List<Card> getHand(){
            return hand;
        }
    
        public void addCards(List<Card> cards){
            this.hand = cards;
        }
    
        public void showPlayers(){
            System.out.print("닉네임: " + this.nickname + ", 게임머니: " + this.gameMoney);
        }
    
        public void showCards(){
            System.out.print("👤 " + nickname + "의 카드: ");
            for (Card card : hand) {
                System.out.print(card + ", ");
            }
        }
    }

     

    3. 게임 진행을 위한 Game, Deck, Dealer 클래스

    • Game 클래스에서는 게임을 시작하는 메서드와 플레이어를 초기화하는 기능을 처리한다. Deck 클래스는 카드 덱을 초기화하고 섞는 기능을 맡는다. Dealer 클래스는 카드 섞기 및 나누기 기능을 담당한다.
    package cardgame;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class Game {
        private Dealer dealer;
        private List<Player> players;
        private Scanner input;
    
        public Game(){
            dealer = new Dealer();
            players = new ArrayList<>();
            input = new Scanner(System.in);
        }
    
        public void start(){
            System.out.println("🧚🏻‍♀️ 카드 게임에 오신 것을 환영합니다.🃏");
    
            initPlayers();
    
            // 게임 진행 로직...
            dealer.hi();
            dealer.deck.initDeck();
            dealer.suffleDeck();
            dealer.dealCards(players);
        }
    
        public void initPlayers() {
            // 플레이어 초기화 로직...
        }
    }

     

    배운 점

     

    1. 객체 간 상호작용:
    Card, Player, Dealer, Game 클래스 간 상호작용을 통해 게임의 흐름을 설계했다. 예를 들어, Game 클래스는 Dealer와 Player 객체를 관리하면서 게임을 진행하고 각 객체는 자신만의 역할을 충실히 수행한다.

    2. 게임 로직의 복잡성:
    게임의 규칙에 맞게 카드를 나누고, 점수를 판별하는 로직을 구현하면서 코드가 점점 복잡해졌다. 점수 계산 기준을 정의하는 데 시간이 조금 걸렸지만 다양한 족보를 고려하는 부분에서 게임의 재미가 살아났다.

    3. 반복문과 리스트 활용:
    카드 덱을 섞고 각 플레이어에게 카드를 분배하는 로직에서 반복문을 활용했으며 List 자료구조를 적절히 사용해 유동적인 카드 관리가 가능해졌다.

     

    어려웠던 점

     

    1. 게임 점수 계산:
    각 족보에 맞는 점수 계산 로직을 구현하는 것이 가장 어려웠다. 특히 "로열 플러시"와 "스트레이트 플러시"와 같은 족보를 제대로 판별하는 로직을 어떻게 구현할지 고민이 많았다. 일단은 단순한 족보들만 구현했다.

    2. 플레이어 인터페이스:
    사용자가 게임에 참여하는 방식에 대한 사용자 인터페이스 설계도 중요했다. 플레이어 수를 입력받고 닉네임을 설정하는 과정에서 예외 처리를 어떻게 할지 고민했는데 이 부분에서는 사용자 경험을 고려한 흐름을 만드는 것이 중요함을 느꼈다.

     

    개선할 점

     

    1. 점수 계산 로직 개선:
    족보 계산이 아직 완벽하지 않기 때문에 이를 개선할 필요가 있다. 족보를 평가하는 부분을 더 정교하게 처리해야 한다.

    2. 게임 종료 후 결과 표시:
    현재는 게임이 종료되면 각 플레이어의 카드만 출력되지만 곧 승패 결과와 게임머니 변화까지 함께 출력하도록 구현할 것이다. 회고 부터 쓰고...

     

    결론

     

    이번 과제는 자바의 객체지향 개념을 실제로 적용할 수 있는 좋은 기회였다. 게임의 흐름을 설계하면서 객체 간의 역할을 분리하고, 그들의 상호작용을 잘 구성해야 하는 점이 매우 중요하다는 것을 깨달았다. 앞으로는 점수 계산 로직을 좀 더 정교하게 다듬고 게임의 완성도를 높이기 위해 추가적인 기능을 구현할 계획이다.

    댓글