-
카드 게임 과제 회고
이번 카드 게임 과제를 진행하면서 많은 점에서 배운 것 같다. 처음에는 단순히 카드 게임을 만드는 것이라고 생각했지만 구현하면서 다양한 설계와 게임 로직을 고려해야 했고 그 과정에서 객체지향적인 설계와 게임의 흐름에 대해 더 깊이 이해하게 되었다.
주요 목표
- 카드 게임 구현: 플레이어가 참여하여 카드를 나누고, 점수에 따른 승패를 판별하는 게임 로직을 구현
- 객체지향 설계: 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. 게임 종료 후 결과 표시:
현재는 게임이 종료되면 각 플레이어의 카드만 출력되지만 곧 승패 결과와 게임머니 변화까지 함께 출력하도록 구현할 것이다. 회고 부터 쓰고...결론
이번 과제는 자바의 객체지향 개념을 실제로 적용할 수 있는 좋은 기회였다. 게임의 흐름을 설계하면서 객체 간의 역할을 분리하고, 그들의 상호작용을 잘 구성해야 하는 점이 매우 중요하다는 것을 깨달았다. 앞으로는 점수 계산 로직을 좀 더 정교하게 다듬고 게임의 완성도를 높이기 위해 추가적인 기능을 구현할 계획이다.
'Diary > 회고' 카테고리의 다른 글
[커널아카데미] 백엔드 개발 부트캠프 12기 8주차 - 회고 (0) 2025.06.07 [커널아카데미] 백엔드 개발 부트캠프 12기 7주차 - 연휴 끝 1일 1코테 시작 (0) 2025.05.16 [커널아카데미] 백엔드 부트캠프 12기 5주차 - 나는 꿈꾸는 돌멩이 (feat. M4 맥북프로) (0) 2025.05.16 [커널아카데미] 백엔드 부트캠프 12기 4주차 - 지난 한 달 되돌아 보기 (0) 2025.05.16 [커널아카데미] 백엔드 부트캠프 12기 3주차 - 벚꽃 (0) 2025.05.16 댓글