Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[블랙잭 게임 미션] 김병준 1단계 미션 제출합니다. #4

Open
wants to merge 48 commits into
base: byungjunkim3059
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 32 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
2c1ca1a
README.md: 기능목록 1차 완성
byungjunkim3059 Jan 28, 2024
ff1a0d5
README.md: 기능목록 수정
byungjunkim3059 Jan 28, 2024
35424f8
플레이어 리스트에 기능 추가
byungjunkim3059 Jan 29, 2024
8aa0548
입력/플레이어 목록 입력 기능 완성
byungjunkim3059 Jan 29, 2024
b72e864
참가자(클래스) 기능 1차 완성
byungjunkim3059 Jan 29, 2024
6aa4b33
플레이어(참가자 상속), 딜러(참가자 상속) 기능 완성
byungjunkim3059 Jan 29, 2024
18a50a8
플레이어 리스트 기능 완성
byungjunkim3059 Jan 29, 2024
e3e7227
README.md: controller/게임 매니저 수정
byungjunkim3059 Jan 29, 2024
0871be7
출력/플레이어 이름 입력하기 문구 완성
byungjunkim3059 Jan 29, 2024
a467680
README.md: 카드 숫자 상수(에이스~잭,퀸,킹) 기능 추가
byungjunkim3059 Jan 29, 2024
e333a06
카드, 카드덱, 카드 심볼, 카드 숫자 기능 완성
byungjunkim3059 Jan 29, 2024
0bf9401
플레이어 리스트 생성기 기능 수정
byungjunkim3059 Jan 29, 2024
87cb353
README.md: 참가자 리스트 기능 추가
byungjunkim3059 Jan 29, 2024
6d63bc6
참가자 리스트 기능 완성
byungjunkim3059 Jan 29, 2024
e320bfb
카드리스트 기능 완성
byungjunkim3059 Jan 29, 2024
4f14501
전체 폴더 구조 변경 및 파일 생성 완료
byungjunkim3059 Jan 29, 2024
ad70235
카드 배분 기능 완성
byungjunkim3059 Jan 29, 2024
43fa46e
README.md: 카드 숫자 변환기 기능 추가
byungjunkim3059 Jan 29, 2024
d7f85d7
카드 변환기 기능, 점수 계산 기능 완성
byungjunkim3059 Jan 29, 2024
5a0dcba
21 상수 추가
byungjunkim3059 Jan 29, 2024
6e6be79
README.md 파일 수정
byungjunkim3059 Feb 2, 2024
c57f353
InputView 완성
byungjunkim3059 Feb 2, 2024
5afd467
OutputView 완성
byungjunkim3059 Feb 2, 2024
81233a8
이름, 이름 검증 기능 완성
byungjunkim3059 Feb 2, 2024
4a90047
블랙잭 기능 완성
byungjunkim3059 Feb 2, 2024
419da1c
카드 점수 계산 기능 완성
byungjunkim3059 Feb 2, 2024
a13c714
딜러 승리 체크 기능 완성
byungjunkim3059 Feb 2, 2024
85e3dc7
상수 기능 추가 및 완성
byungjunkim3059 Feb 2, 2024
c658279
상수 기능 완성
byungjunkim3059 Feb 2, 2024
382161d
카드덱 기능 수정
byungjunkim3059 Feb 2, 2024
0b25c44
컨트롤러 기능 완성
byungjunkim3059 Feb 2, 2024
152ff20
Application 완성
byungjunkim3059 Feb 2, 2024
24261b2
style: 파일 끝 개행 추가
byungjunkim3059 Feb 6, 2024
08ef19f
refactor: TARGET_SCORE 관리 클래스 변경
byungjunkim3059 Feb 6, 2024
1e6a152
docs: 이름 검증(객체) 기능을 이름 객체와 플레이어 리스트 객체에 분리
byungjunkim3059 Feb 6, 2024
28a34f0
feat: Name에딜러 이름 사용 불가 기능과 이름 빈칸 불가 기능 이전 후 이름 검증 기능 추가
byungjunkim3059 Feb 6, 2024
aa4d654
refactor: Name 객체에 검증 기능 코드 수정. 예외 처리 기능은 Name 객체에, try catch는 게임 매니저…
byungjunkim3059 Feb 6, 2024
f288e60
feat: 플레이어 리스트 기능 완성.
byungjunkim3059 Feb 6, 2024
07bee19
refactor: 딜러 이름 사용 불가 기능 PlayerList로 이전
byungjunkim3059 Feb 6, 2024
255d747
feat: 입력값 빈칸 불가 기능 추가. 이름 빈칸 불가 경우와 조금 다름.
byungjunkim3059 Feb 6, 2024
678bb49
docs: 플레이어 리스트 기능 완성
byungjunkim3059 Feb 6, 2024
c4066ba
refactor: 게임 매니저 내의 코드 리팩토링
byungjunkim3059 Feb 6, 2024
29d688f
docs: 점수 계산 기능 카드 리스트로 이전
byungjunkim3059 Feb 6, 2024
1bf8d9f
feat: 카드 리스트에 점수 계산 기능 추가
byungjunkim3059 Feb 6, 2024
d5bbcc5
feat: 참가자 객체에 점수 반환 기능 추가. 참가자의 카드 리스트에 대해서 점수 반환
byungjunkim3059 Feb 6, 2024
9b19017
refactor: 점수 계산 기능 사용하던 객체들 모두 수정 완료. 점수 계산 완성
byungjunkim3059 Feb 6, 2024
b74cf82
refactor: 딜러 추가 카드 배분 코드 개선. 딜러 점수가 조건을 만족하는지 판단하는 역할과 카드를 배분하는 역할 분리
byungjunkim3059 Feb 6, 2024
f5b4361
refactor: instanceof를 isDealer 메소드로 바꿈.
byungjunkim3059 Feb 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 74 additions & 76 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,76 +1,74 @@
# java-blackjack

## 🚀 기능 요구 사항

## ✅ 1단계 - 블랙잭 구현

블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다.

카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다.
게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다.
딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다.
게임을 완료한 후 각 플레이어별로 승패를 출력한다.

## 💻 실행 결과
```
게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)
pobi,jason

딜러와 pobi, jason에게 2장을 나누었습니다.
딜러: 3다이아몬드
pobi카드: 2하트, 8스페이드
jason카드: 7클로버, K스페이드

pobi는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)
y
pobi카드: 2하트, 8스페이드, A클로버
pobi는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)
n
pobi카드: 2하트, 8스페이드, A클로버
jason은 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)
n
jason카드: 7클로버, K스페이드

딜러는 16이하라 한장의 카드를 더 받았습니다.

딜러 카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20
pobi카드: 2하트, 8스페이드, A클로버 - 결과: 21
jason카드: 7클로버, K스페이드 - 결과: 17

## 최종 승패
딜러: 1승 1패
pobi: 승
jason: 패
```

## ✅ 2단계 - 블랙잭 구현

- 1단계 미션이 어느정도 구현된 후에 공개할 예정

## 🖥️ 프로그래밍 요구 사항
- indent(인덴트, 들여쓰기) depth를 3를 넘지 않도록 구현한다. 2까지만 허용한다. ( 개인의 역량에 맞춰 1까지 허용하여 진행해볼 것을 추천 )
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
- 3항 연산자를 쓰지 않는다.
- else 예약어를 쓰지 않는다.
- else 예약어를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
- 힌트: if문에서 값을 반환하는 방식으로 구현하면 else 예약어를 사용하지 않아도 된다.
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
- UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
- 함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다.
- 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라.

## 🔥 추가된 요구 사항
- Java 11 으로 변경한다.
- 모든 원시 값과 문자열을 포장한다 [참고 글](https://tecoble.techcourse.co.kr/post/2020-05-29-wrap-primitive-type/)
- 구현한 기능에 Test를 추가한다. 단, UI(System.out, System.in) 로직은 제외
- 배열 대신 컬렉션을 사용한다.
- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다.
- 일급 컬렉션을 쓴다. [참고 글](https://jojoldu.tistory.com/412)

## 📚 과제 진행 요구 사항
- 미션은 해당 저장소를 Fork/Clone함으로부터 시작된다.
- 기능을 구현하기 전에 java-baseball/docs/README.md 파일에 구현할 기능 목록을 정리해 추가한다.
- Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.
- 커밋 메시지 [컨벤션 가이드](https://gist.github.com/stephenparish/9941e89d80e2bc58a153)를 참고해 커밋 메시지를 작성한다.
# 기능 목록

<hr>

## view

- [x] 입력
- [x] 플레이어 목록 입력
- [x] 플레이어가 카드를 받을지 여부(y/n) 입력
- [x] y 또는 n인지 검증

- [x] 출력
- [x] 플레이어 이름 입력하기 문구
- [x] 게임 시작 시 카드 2장 배분에 대한 문구
- [x] 참여자 카드 리스트 내의 카드 출력 (jason카드: 7클로버, K스페이드)
- [x] 플레이어가 카드를 받을지 여부(y/n) 묻는 문구
- [x] 딜러 카드 추가적으로 받았을 때 문구
- [x] 카드 점수 계산 결과 출력
- [x] 최종 승패 결과 출력

<hr>

## domain

### participant

- [x] 참가자(클래스)

- [x] 플레이어(참가자 상속)

- [x] 딜러(참가자 상속)

- [x] 이름: 참가자의 필드

- [x] 이름 검증

- [x] 카드 리스트: 딜러와 플레이어가 배분 받은 카드들 담는 리스트

### carddeck

- [x] 카드 심볼(하트~스페이드)

- [x] 카드 랭크(랭크(에이스~잭,퀸,킹)와 숫자 값)

- [x] 카드: 심볼(하트, 스페이드, 다이아몬드, 클로버)과 랭크(에이스~킹) 조합으로 이루어진 카드

- [x] 카드덱: 52가지 카드 담고 있는 하나의 카드덱
- [x] 카드덱에서 카드 추출하여 반환

### constants

- [x] 상수

- [x] 승패 결과 상수


### 비즈니스 로직

- [x] 블랙잭: 카드덱 생성, 참가자에 카드 배분

- [x] 카드 점수 계산

- [x] 딜러 승리 채크

<hr>

## controller

- [x] 게임 매니저
- [x] 게임 시작
- [x] 참가자 생성
- [x] 블랙잭 게임 시작
- [x] 점수 계산 결과 출력
- [x] 최종 승패 결과 출력
Empty file added md
Empty file.
9 changes: 9 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import controller.GameManager;

public class Application {

public static void main(String[] args) {
GameManager gameManager = new GameManager();
gameManager.gameStart();
}
}
25 changes: 25 additions & 0 deletions src/main/java/carddeck/Card.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package carddeck;

public class Card {

private final CardSuit cardSuit;
private final CardRank cardRank;

public Card(CardSuit cardSuit, CardRank cardRank) {
this.cardSuit = cardSuit;
this.cardRank = cardRank;
}

@Override
public String toString() {
return this.cardRank.getRank() + this.cardSuit.getValue();
}

public CardSuit getCardSuit() {
return this.cardSuit;
}

public CardRank getCardRank() {
return this.cardRank;
}
}
42 changes: 42 additions & 0 deletions src/main/java/carddeck/CardDeck.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package carddeck;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CardDeck {

private List<Card> cardDeck;

public CardDeck() {
initializeCardDeck();
shuffleCardDeck();
}

private void initializeCardDeck() {
CardSuit[] suits = CardSuit.values();
CardRank[] ranks = CardRank.values();

this.cardDeck = new ArrayList<Card>();

for (CardSuit suit : suits) {
for (CardRank rank : ranks) {
Card card = new Card(suit, rank);
this.cardDeck.add(card);
}
}
}

private void shuffleCardDeck() {
Collections.shuffle(this.cardDeck);
}

public Card drawCard() {
if (this.cardDeck.isEmpty()) {
throw new IllegalArgumentException("카드덱이 비어 있습니다.");
}

return this.cardDeck.remove(0);
}

}
25 changes: 25 additions & 0 deletions src/main/java/carddeck/CardRank.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package carddeck;

public enum CardRank {

ACE("A", 1), TWO("2", 2), THREE("3", 3), FOUR("4", 4), FIVE("5", 5),
SIX("6", 6), SEVEN("7", 7), EIGHT("8", 8), NINE("9", 9), TEN("10", 10),
JACK("J", 10), QUEEN("Q", 10), KING("K", 10);

private final String rank;
private final int value;

CardRank(String rank, int value) {
this.rank = rank;
this.value = value;
}

public String getRank() {
return rank;
}

public int getValue() {
return value;
}

}
16 changes: 16 additions & 0 deletions src/main/java/carddeck/CardSuit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package carddeck;

public enum CardSuit {
HEARTS("하트"), DIAMONDS("다이아몬드"), CLUBS("클로버"), SPADES("스페이드");

private final String value;

CardSuit(String value) {
this.value = value;
}

public String getValue() {
return value;
}

}
9 changes: 9 additions & 0 deletions src/main/java/constants/Constant.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package constants;

public class Constant {

public static final int TARGET_SCORE = 21;
public static final String YES = "y";
public static final String NO = "n";

}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 값들은 하나의 클래스에서 밖에 사용되지 않으니 사용되는 클래스에서 관리해주는 것이 어떨까요??
전역적으로 여러번 사용되는 상수만 이렇게 빼는 방향으로 가시면 좋을 것 같습니다!!

18 changes: 18 additions & 0 deletions src/main/java/constants/Result.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package constants;

public enum Result {
PLAYER_WIN("승"),
PLAYER_LOSE("패"),
BUST("패"),
PUSH("무승부");

private final String value;

Result(String value) {
this.value = value;
}

public String getValue() {
return this.value;
}
}
Loading