Skip to content

State pattern 적용한 블랙잭 게임 #2

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

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
641eb82
chore (maintain) gradle version upgrade
smart-cau Jun 11, 2023
983fbfb
chore (maintain) devcontainer 생성
smart-cau Jun 11, 2023
85ddd12
refactor (lambda) 람다 실습 1 - 익명 클래스를 람다로 전환
smart-cau Jun 11, 2023
2091f96
refactor (lambda) 람다 실습 2 - 람다를 활용해 중복 제거
smart-cau Jun 11, 2023
f919bd1
refactor (stream) map, reduce, filter 실습
smart-cau Jun 12, 2023
b372b39
refactor (Optional) 요구사항 1 - Optional을 활용해 조건에 따른 반환
smart-cau Jun 13, 2023
1a9a9f6
refactor (Optional) 요구사항 2 - Optional에서 값을 반환
smart-cau Jun 13, 2023
dd138e5
refactor (Optional) 요구사항 3 - Optional에서 exception 처리
smart-cau Jun 13, 2023
fc85776
feat (blackjack) Card & Cards 추가
smart-cau Jul 9, 2023
88164d3
test (blackjack) Card & Cards
smart-cau Jul 9, 2023
bb6e685
feat (blackjack) deck
smart-cau Jul 9, 2023
80f2cb7
test (blackjack) deck
smart-cau Jul 9, 2023
5640aa2
feat (blackjack) State Pattern을 위한 state classes 추가
smart-cau Jul 9, 2023
639533d
test (blackjack) State
smart-cau Jul 9, 2023
1ef49ee
feat (blackjack) User(Player & Dealer) class 생성
smart-cau Jul 9, 2023
c073212
test (blackjack) User
smart-cau Jul 9, 2023
1dea8ec
feat (blackjack) Input & Output view 생성
smart-cau Jul 9, 2023
20bf076
feat (blackjack) Controller & Main 생성
smart-cau Jul 9, 2023
0baf403
chore (blackjack) Hit 파일의 todo 주석 제거
smart-cau Jul 9, 2023
acb2014
chore (blackjack) readme 작성
smart-cau Jul 9, 2023
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
27 changes: 27 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/java
{
"name": "Java",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/java:0-17",

"features": {
"ghcr.io/devcontainers/features/java:1": {
"version": "none",
"installMaven": "false",
"installGradle": "true"
}
}

// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],

// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "java -version",

// Configure tool-specific properties.
// "customizations": {},

// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
130 changes: 130 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,133 @@
## 이전에 지키지 못한 설계 원칙
* 하나하나 지시하지 말고 요청해라.
* 예를들어, 판사가 증인에게 1) 목격했던 장면을 떠올리고, 2) 떠오르는 시간을 순서대로 구성하고, 3) 말로 간결하게 표현해라 라고 요청하지 않는다. 그냥 "증언하라" 라고 요청한다.
* 마찬가지로 객체의 설계단계에서도 책임이 있는 객체에 요청만 하도록 설계한다.
* 역할과 책임을 확실히 분리하기
* 이전 코드에서 InputView가 단순 input을 받고 보여주는 역할을 넘어 게임의 로직까지 관리함


## 구현
* Strategy pattern 사용
* String, int 등의 자료형 사용 x. 다 포장하기
* 딜러의 수익금 규칙은 명확하지 않으니 spec out
* 객체의 다형성을 이용해 조건문 줄이기 (아래 UML 사용)
<img src="https://images.velog.io/images/new_wisdom/post/5c238570-b95c-4c63-b6ae-6e4b2ab77716/image.png" width="80%" />

[이미지 출처](https://newwisdom.tistory.com/27)
* 주요 객체들은 첫 구현 시 equals method & hashCode method를 override 해줄 것

## 주요 객체
* User
* Player
* Dealer
* card 관련
* enums
* Denomination
* Suit
* Card
* Cards
* Deck
* State
* Running
* Hit
* Finished
* Bust
* Stay
* Blackjack
* Controller

## 게임 규칙(from [toney parky](https://github.com/woowacourse/java-blackjack/tree/toneyparky))
- [x] 플레이어의 이름을 입력 받는다.
- [x] 문자열 처리
- [x] 참여인원 제한
- [x] 플레이어 생성
- [x] 플레이어마다 베팅 금액을 입력 받는다.
- [x] 문자열 처리
- [x] 입력 범위 처리
- [x] 게임 시작시 카드 2장을 딜러와 플레이어에게 나누어 주어야 한다.
- [x] Deck에서 2장을 pop해서 준다. (2장 pop하는 메서드도 가능)
- [x] Deck을 만들어야 한다.
- [x] 딜러는 1장, 플레이어는 2장의 카드를 공개한다.
- [x] 처음에 블랙잭일시 플레이어와 딜러의 패에 따라 경기 처리
- [x] 플레이어가 카드를 더 받을수 있는지 검사 해야한다.
- [x] ACE는 1 또는 11로 계산할 수 있다.
- [x] K,Q,J는 10으로 계산한다.
- [x] 플레이어가 카드를 더 받고 싶어하는지 검사 해야한다.
- [x] 받을수 있고, 받고자 한다면 카드를 나누어준다.
- [x] 플레이어가 카드를 받으면 카드의 상태를 출력한다.
- [x] 플레이어 페이즈가 끝나면 딜러가 카드를 받는다.
- [x] 딜러가 16이하의 점수를 갖고 있으면 넘을때 까지 카드를 받는다.
- [x] 카드 결과를 출력한다.
- [x] 블랙잭 게임 결과에 따른 베팅 금액을 출력한다.
- [x] 딜러가 블랙잭이면 블랙잭을 가진 사람 이외의 플레이어는 전부 패배하여 베팅 금액을 돌려 받지 못한다. (둘다 블랙잭이면 돌려 받음.)
- [x] 둘다 버스트면 딜러가 이긴다.
- [x] 처음 2장으로 21이 만들어지면 블랙잭이다.
- [x] 버스트면 0점으로 간주한다.
- [x] 플레이어가 블랙잭으로 승리시 배팅 금액의 1.5배를 받는다.
- [x] 플레이어가 승리시 베팅 금액만큼을 받는다.
- [x] 플레이어가 패배시 베팅 금액만큼을 잃는다.

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

- 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다.
- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다.
- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다.
- 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. 단, 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다.
- 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다.
- 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다.
- 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다.
- 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다.

- BlackJack이 아닐 경우, 플레이어는 Hit(카드를 받는다), Stay(그만 받는다) 중 하나를 선택할 수 있다.

- Stay를 선택할 경우 그 판에서는 더이상 카드를 받을 수 없으므로, 게임이 종료된다.

- Hit를 선택할 시, 카드를 한 장 더 받게되고
이 때, 카드의 합이 21이 초과했을 경우 Bust로 딜러의 카드 합 및 결과와 관계없이 패배한다.

- 21이하인 경우는, 본인 판단하에 Stay를 선택해 게임을 종료하여
딜러의 카드 합과 플레이어의 카드 합 중 높은 쪽이 승리하게 되는 게임이다.

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

pobi의 배팅 금액은?
10000

jason의 배팅 금액은?
20000

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

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

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

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

## 최종 수익
딜러: 10000
pobi: 10000
jason: -20000

```


## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md)

---
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading