Skip to content
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
6d30617
feat(fp,optional) : 람다, 스트림 예제 구현
hyeonji1220 Oct 13, 2023
6d9fc60
docs(README) : 기능 목록 작성
hyeonji1220 Oct 13, 2023
67b9210
feat(InputView) : 플레이어 이름 입력받기 구현
hyeonji1220 Oct 16, 2023
964b915
feat(InputView) : 플레이어별 배팅 금액 입력받기 구현
hyeonji1220 Oct 16, 2023
6615c33
feat(Players) : Player, Players stream으로 생성
hyeonji1220 Oct 16, 2023
8faaedd
refactor(GameController) : generatePlayers 메소드로 분리, read 적용
hyeonji1220 Oct 16, 2023
6d1c446
feat(Suit) : 카드 문양 suit 랜덤 세팅 구현
hyeonji1220 Oct 16, 2023
db6865a
feat(CardGenerator) : 카드 번호, 랜덤 카드 생성 구현
hyeonji1220 Oct 16, 2023
82f7f17
feat(PlayerWithCard) : PlayerWithCard로 플레이어당 카드 세팅, 출력 (+패키지 정리)
hyeonji1220 Oct 17, 2023
d40627a
feat(Player) : Player로 딜러 세팅
hyeonji1220 Oct 17, 2023
46b4fc0
feat(PlayersWithCard) : 첫 배부 블랙잭 확인 메소드 구현
hyeonji1220 Oct 17, 2023
0be2d4f
feat(PlayersWithCard) : 플레이어 또는 딜러가 블랙잭인 경우 수익 출력 준비
hyeonji1220 Oct 17, 2023
3656aa6
feat(PlayerWithCard) : ExtraCard 여부에 따라 카드 더 받는 경우 구현
hyeonji1220 Oct 17, 2023
2f388b7
feat(GameController) : 게임 오버나 카드 배부 모두 N일 때까지 카드 배부 구현
hyeonji1220 Oct 17, 2023
f5f8050
feat(GameController) : 딜러 extraCard 배부 구현
hyeonji1220 Oct 17, 2023
5deca81
feat(PlayersWithCard) : 결과에서 블랙잭 있었던 경우 수익 계산 구현
hyeonji1220 Oct 18, 2023
f6c16bd
feat(PlayersWithCard) : 플레이어 최종 수익 각 플레이어의 BettingMoney에 세팅하는 메소드 cal…
hyeonji1220 Oct 18, 2023
add0e39
feat(OutputView) : 플레이어 수익합으로 딜러 수익 계산 구현
hyeonji1220 Oct 18, 2023
8f7c4b5
feat(GameController) : 예외 상황 제외 기본 흐름 구현 완성
hyeonji1220 Oct 18, 2023
3fb22a5
refactor: 기타 완료
hyeonji1220 Oct 19, 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
26 changes: 0 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,26 +0,0 @@
## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md)

---
## 학습 효과를 높이기 위해 추천하는 미션 진행 방법

---
1. 피드백 강의 전까지 미션 진행
> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit
> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push

![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png)

---
2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다.

---
3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다.

```
git branch -a // 모든 로컬 브랜치 확인
git checkout master // 기본 브랜치가 master인 경우
git checkout main // 기본 브랜치가 main인 경우

git checkout -b 브랜치이름
ex) git checkout -b apply-feedback
```
23 changes: 13 additions & 10 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
apply plugin: 'java'
apply plugin: 'eclipse'

group = 'camp.nextstep'
version = '1.0.0'
sourceCompatibility = '1.8'
plugins {
id 'java'
}

repositories {
mavenCentral()
mavenCentral()
maven { url 'https://jitpack.io' }
}

dependencies {
testImplementation "org.junit.jupiter:junit-jupiter:5.7.2"
testImplementation "org.assertj:assertj-core:3.19.0"
implementation 'com.github.woowacourse-projects:mission-utils:1.0.0'
}

java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
}
}

test {
useJUnitPlatform()
useJUnitPlatform()
}
129 changes: 129 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
## 기능 구현 목록
- 랜덤한 카드를 생성하는 기능
- [ ] 랜덤한 숫자를 생성하는 객체를 통해 랜덤한 숫자 반환
- [ ] 반환된 랜덤한 숫자 갖고 카드 문양, 숫자 배정
- [ ] 기존 뽑혔던 카드와 중복되지 않게 하는 기능


- 플레이어의 이름과 배팅머니를 세팅하는 기능
- [ ] 입력된 이름으로 배팅머니를 입력받도록 연결해
- [ ] 입력된 배팅머니와 앞의 이름으로 플레이어를 생성


- 게임 진행
- 처음 카드 2장씩 세팅하는 경우
- [ ] 랜덤 카드를 2번 생성해서 플레이어별로 갖는 기능
- [ ] 블랙잭인 경우, 플레이어별 게임 상태에 블랙잭 상태로 변경 -> 최종 결과 출력으로 skip
- [ ] over21인 경우, 플레이어별 게임 상태에 게임 실패 상태로 변경 -> 최종 결과 출력으로 skip

- 카드 세팅이 끝나면 플레이어별 받은 카드 출력하도록 연결

- 첫 세팅 후, 추가 카드 배부 시간
- [ ] 추가 카드 받는지 여부 입력에 따라 추가 카드 배부로 연결
- [ ] 추가 카드 받는 경우, 랜덤 카드를 1번 생성해서 플레이어별로 추가하는 기능
- [ ] over21인 경우, 플레이어별 게임 상태에 게임 실패 상태로 변경 -> 최종 결과 출력으로 skip
- [ ] 21인 경우, 플레이어별 게임 상태에 게임 승리 상태로 변경

- 추가 카드 배부 후, 딜러 추가 카드 배부 시간
- [ ] 카드 합이 16 이하일 때까지 추가 카드 생성, 추가


- 게임 상태 반환하는 기능
- (게임 중, 블랙잭, 게임 패배, 게임 승리로 나눈다.)
- [ ] 처음 카드 2장씩 세팅 후 블랙잭 상태 반환하는 기능
- [ ] 처음 카드 2장씩 세팅 후 게임 패배 상태 반환하는 기능
- [ ] 플레이어별 카드를 추가받았을 때 게임 승리 상태 반환하는 기능
- [ ] 플레이어별 카드를 추가받았을 때 게임 패배 상태 반환하는 기능
- [ ] 마지막 최종 결과로 카드값합에 따라 게임 승리 상태 반환하는 기능
- [ ] 출력에서 해야할까?
- [ ] 마지막 최종 결과로 카드값합에 따라 게임 패배 상태 반환하는 기능
- [ ] 출력에서 해야할까?


- [ ] 컨트롤러 내 메소드
- [ ] Application main 메소드


- 사용자가 잘못된 값을 입력할 경우 예외를 발생시키고, 메시지를 출력 후 그 부분부터 다시 입력받는 기능
- [ ] 플레이어 이름을 잘못 입력했을 경우 예외 발생 및 메시지 출력 후 다시 입력받는 기능
- [ ] 플레이어 배팅 금액을 잘못 입력했을 경우 예외 발생 및 메시지 출력 후 다시 입력받는 기능
- [ ] 플레이어 추가 카드 여부를 잘못 입력했을 경우 예외 발생 및 메시지 출력 후 다시 입력받는 기능


- Enum 목록
- [ ] 카드 문양
- [ ] 카드 숫자
- [ ] 게임 상태
- [ ] 플레이어 추가 카드 여부


## 예외 처리
- (예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.)
- 플레이어 이름 예외 상황
- [ ] ,로 구분되는 이름의 나열이 아닌 경우
- [ ] 공백인 경우
- [ ] 한글,영어가 아닌 특수문자 포함하는 경우
- [ ] 이름의 길이가 10자 초과인 경우

- 플레이어 배팅 금액 예외 상황
- [ ] 공백인 경우
- [ ] 숫자가 아닌 경우
- [ ] 100,000 초과인 경우

- 플레이어 추가 카드 여부 예외 상황
- [ ] 공백인 경우
- [ ] y or n가 아닌 경우


## 입출력 기능
### 입력 기능
- [ ] 플레이어의 이름를 입력받는 기능
- [ ] 플레이어별 배팅 금액을 입력받는 기능
- [ ] 플레이어별 추가 카드 받을지 여부를 입력받는 기능


### 출력 기능
- [ ] 게임 시작 문구를 출력
- [ ] 딜러와 플레이어의 이름을 넣어 배부 완료 문구 출력
- [ ] 처음 나눠준 카드들을 출력
- [ ] 딜러의 카드를 출력
- [ ] 플레이어들의 카드를 출력
- [ ] 플레이어가 추가 카드를 받은 결과를 출력
- [ ] 딜러가 추가 카드를 받았는지 출력
- [ ] 최종으로 갖고있는 카드와 카드 숫자 합한 결과 출력
- 갖고있는 카드 모두 출력
- 카드의 구분은 ,(뒤 공백 포함) 문자열로 구분
- 카드 숫자 합한 결과 출력
- [ ] 최종 수익 문구 출력
- [ ] 딜러와 플레이어의 최종 수익 출력
- 딜러를 가장 먼저 출력
- 수익이 마이너스인경우 -로 표현


## 추후 보완이 필요한 부분
- [ ]
- [ ]


# 기타 참고 사항 (추후 삭제)



## 프로그래밍 요구 사항
- indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
- 함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다.
- 배열 대신 컬렉션을 사용한다.
- 모든 원시 값과 문자열을 포장한다
- 일급 컬렉션을 쓴다.
- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다.


## TDD 원칙 ⭐️⭐️
- 원칙 1 - 실패하는 단위 테스트를 작성할 때까지 프로덕션 코드(production code)를 작성하지 않는다.
- 원칙 2 - 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
- 원칙 3 - 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
## TDD 사이클 ⭐️⭐️
1. 실패하는 테스트를 구현한다.
2. 테스트가 성공하도록 프로덕션 코드를 구현한다.
3. 프로덕션 코드와 테스트 코드를 리팩토링한다.
Empty file added docs/READMEmy.md
Empty file.
15 changes: 15 additions & 0 deletions src/main/java/mission/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package mission;


import mission.controller.GameController;
import mission.domain.NumberGenerator;
import mission.domain.RandomNumberGenerator;

public class Application {

public static void main(String[] args) {
NumberGenerator numberGenerator = new RandomNumberGenerator();
GameController gameController = new GameController(numberGenerator);
gameController.start();
}
}
40 changes: 40 additions & 0 deletions src/main/java/mission/controller/GameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package mission.controller;

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toList;
import static mission.util.RetyrUtil.read;

import java.util.List;
import mission.domain.Players;
import mission.dto.PlayerInfoDto;
import mission.dto.PlayerNamesDto;
import mission.view.InputView;
import mission.view.OutputView;
import mission.domain.NumberGenerator;


public class GameController {

private final NumberGenerator numberGenerator;
InputView inputView = InputView.getInstance();

public GameController(NumberGenerator numberGenerator) {
this.numberGenerator = numberGenerator;
}

public void start() {
Players players = read(this::generatePlayer);
OutputView.printStart();
}


private Players generatePlayer() {
PlayerNamesDto playerNamesDto = read(InputView::scanPlayerNames);
List<PlayerInfoDto> playerInfoDtos = inputView.scanBettingMoneys(
playerNamesDto.getPlayerNames());

return playerInfoDtos.stream()
.map(PlayerInfoDto::toPlayer)
.collect(collectingAndThen(toList(), Players::from));
}
}
44 changes: 44 additions & 0 deletions src/main/java/mission/domain/BettingMoney.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package mission.domain;

public class BettingMoney {

private static final String RANGE_EXCEPTION_MESSAGE = "0원보다 큰 금액을 입력해주세요.";
private int bettingMoeny;

private BettingMoney(int bettingMoney) {
// validateRange(bettingMoney);
this.bettingMoeny = bettingMoney;
}

private void validateRange(int bettingMoney) {
if (!isInRange(bettingMoney)) {
throw new IllegalArgumentException(RANGE_EXCEPTION_MESSAGE);
}
}

private boolean isInRange(int bettingMoney) {
return bettingMoney > 0;
}

public static BettingMoney from(int bettingMoney) {
return new BettingMoney(bettingMoney);
}

// - PlyaerWithCard.player.winBlackJack(bettingmoney +1.5배 시켜줌)

public void winBlackJack() {
bettingMoeny = (int) (bettingMoeny * 1.5);
}

public void draw() {
bettingMoeny = 0;
}

public int getBettingMoeny() {
return bettingMoeny;
}

public void lossMoney() {
bettingMoeny = -bettingMoeny;
}
}
5 changes: 5 additions & 0 deletions src/main/java/mission/domain/NumberGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package mission.domain;

public interface NumberGenerator {
int generate();
}
17 changes: 17 additions & 0 deletions src/main/java/mission/domain/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package mission.domain;

public class Player {

private final PlayerName playerName;
private final BettingMoney bettingMoney;

private Player(PlayerName playerName, BettingMoney bettingMoney) {
this.playerName = playerName;
this.bettingMoney = bettingMoney;
}

public static Player from(String playerName, BettingMoney bettingMoney) {
return new Player(new PlayerName(playerName), bettingMoney);
}

}
7 changes: 7 additions & 0 deletions src/main/java/mission/domain/PlayerName.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package mission.domain;

public class PlayerName {

public PlayerName(String playerName) {
}
}
26 changes: 26 additions & 0 deletions src/main/java/mission/domain/Players.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package mission.domain;

import java.util.Arrays;
import java.util.List;

public class Players {

private final List<Player> players;

private Players(List<Player> players) {
this.players = players;
}

public static Players from(List<Player> players) {
return new Players(players);
}

public static Players fromTest(Player... players) {
return new Players(Arrays.asList(players));
}

public List<Player> getPlayers() {
return players;
}

}
12 changes: 12 additions & 0 deletions src/main/java/mission/domain/RandomNumberGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package mission.domain;

import java.util.Random;

public class RandomNumberGenerator implements NumberGenerator {

public int generate() {
Random random = new Random();
return random.nextInt(4);
}

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

public enum Rank {
A(1), TWO(2), THREE(3),
FOUR(4), FIVE(5), SIX(6),
SEVEN(7), EIGHT(8), NINE(9),
K(10), Q(10), J(10);

private final int number;

Rank(int number) {
this.number = number;
}

public int getNumber() {
return number;
}
}
Loading