Skip to content

Commit

Permalink
[2단계 - 사다리 생성] 제이미(임정수) 미션 제출합니다. (#201)
Browse files Browse the repository at this point in the history
* docs: 요구사항 및 기능 목록 추가

2단계 미션에 대한 요구사항 반영

* feat: 결과 기능 추가

* feat: 결과들 기능 추가

* feat: 사다리 게임 전체 결과 인덱스 가져오기 기능 추가

* rename: 파일명 오타로 인한 수정

* feat: 사다리 게임의 결과 판단 기능 추가

* feat: 요청 값에 따른 결과 반환 기능 추가

* fix: 출력 포맷 수정

* feat: 결과 입력 및 출력 기능 추가

* refactor: GameMap 제거 및 Ladder로 기능 전달

* refactor: 메서드 명으로 변경

map -> ladder

* refactor: 사용하지 않는 패키지 제거

* refactor: 메서드 및 변수명 변경

map -> ladder

* feat: 보고 싶은 사람 입력 기능 추가

* feat: 보고 싶은 사람의 실행 결과 출력 기능 추가

* refactor: 사용하지 않는 패키지 제거

* fix: 기능 추가에 따른 입출력 수정

* refactor: private 생성자 추가

유틸 클래스 생성 방지를 위해

* refactor: outputview에서 domain을 파라미터로 받지 않도록 수정

* refactor: 게임 결과 도메인 명 변경

* feat: 게임을 실행하는 도메인 추가

* refactor: 이름과 결과 입력 시 양옆의 공백 허용

* refactor: 컨벤션 적용

- 사용하지 않는 패키지 제거
- 가독성 및 디버깅을 위한 개행 추가

* rename: ErrorMessage 경로 수정

* docs: 요구사항 완료 체크

* fix: 로직 문제에 대한 수정

* refactor: 라인 상태에 대한 객체 추가

* rename: view 내부 패키지 제거

* refactor: 파라미터 변수명 수정

더 명확한 이름이 되도록 수정

* refactor: 컨트롤러의 생성자 추가

의존성 주입을 생성자 주입으로 수정함

* refactor: 예외 메시지 출력 기능 outputView로 이동

* refactor: 재입력 인터페이스 생성 및 적용

* refactor: 사용하지 않는 메서드 제거

* refactor: 변수명을 명확하게 수정

* refactor: 객체 비교 기능 추가

* feat: TestGenerator 추가

원하는 랜덤 테스트를 위한 클래스 추가

* docs: 네이밍 관련 수정

* docs: 완료 기능 체크

* rename: readme 파일 합침

* fix: 잘못된 조건 수정

10이하는 가능한데, 9까지만 입력 가능하도록 제한되어 있었음
이를 수정함

* refator: 사용하지 않는 패키지 제거

* feat: List 미션 수행

- ArrayList
- LinkedList
  • Loading branch information
JJ503 authored Feb 27, 2023
1 parent 06074df commit b21b896
Show file tree
Hide file tree
Showing 50 changed files with 1,665 additions and 412 deletions.
124 changes: 124 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,127 @@
## 우아한테크코스 코드리뷰

- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md)


---
## 📚 도메인 모델 네이밍 사전

| 한글명 | 영문명 | 설명 |
|-----|--------------|----------------------|
| 참가자 | Participants | 사다리 게임에 참가하는 사람들을 지칭 |
| 사람 | Person | 사람을 지칭 |
| 사다리 | Ladder | 사다리 지칭 |
| 라인 | Line | 사다리의 한줄을 지칭 |
| 결과 | Result | 실행 결과를 지칭 |

<br>

## 👨‍🍳 기능 목록

- 참가자
- [x] 사람은 10명까지 ( 테스트 원할한 범위 )
- [x] 사람은 2명 이상이다.
- [x] 사람이름은 ',' 로 구분한다.
- [x] 중복된 이름을 가질 수 없다.


- 사람
- [x] 이름은 최대 5글자까지 가능하다
- [x] 이름은 빈문자 혹은 공백으로만 이루어지면 안 된다


- 사다리 게임
- [x] 사다리를 생성한다.
- [x] 사다리 게임의 결과를 판단한다.
- [x] 보고싶은 사람의 사다리 게임의 결과를 전달한다.


- 사다리
- [x] 사다리의 높이는 숫자여야 한다.
- [x] 사다리의 최소 높이는 1이다.
- [x] 사다리의 최대 높이는 10이다. ( 테스트 원할한 범위 )
- [x] 사다리는 높이만큼의 라인을 가진다.
- [x] 사다리의 라인은 1이상 9이하의 갯수의 상태를 갖는다. (참가자수에서 1을 뺀 값)


- 라인
- [x] 라인은 1이상 9이하의 갯수의 상태를 갖는다.
- [x] 상태는 두 가지 경우를 가진다 (연결 혹은 비연결)
- [x] true, false 중 랜덤한 boolean을 생성한다.
- [x] 연속으로 연결상태를 가질 수 없다.


- 참가자
- [x] 사람은 10명까지 ( 테스트 원할한 범위 )
- [x] 사람은 2명 이상이다.
- [x] 사람이름은 ',' 로 구분한다.
- [x] 중복된 이름을 가질 수 없다.


- 결과들
- [x] 결과는 사람 수 만큼이다.
- [x] 결과는은 ',' 로 구분한다.크
- [x] all을 받은 경우 전체 결과를 반환한다.
- [x] 사람 이름을 받은 경우 해당 사람의 결과를 반환한다.


- 결과
- [x] 사다리의 결과는 최대 5글자까지 가능하다
- [x] 결과는 빈문자 혹은 공백으로만 이루어지면 안 된다


- 출력
- [x] 사람 이름은 5자 기준으로 출력하기에 폭도 이에 맞춘다.
- [x] 보고 싶은 사람의 실행 결과를 출력한다.


- 입력
- [x] 참여자 이름을 입력한다.
- [x] 최대 사다리 높이를 입력한다.
- [x] 실행 결과를 입력한다.
- [x] 결과를 보고 싶은 사람의 이름을 입력한다.

## 요구 사항

- [x] 사다리 게임에 참여하는 사람에 이름을 최대5글자까지 부여할 수 있다.
- [x] 사다리를 출력할 때 사람 이름도 같이 출력한다.
- [x] 사람 이름은 쉼표(,)를 기준으로 구분한다.
- [x] 사람 이름을 5자 기준으로 출력하기 때문에 사다리 폭도 넓어져야 한다.
- [x] 사다리 타기가 정상적으로 동작하려면 라인이 겹치지 않도록 해야 한다.
- [x] |-----|-----| 모양과 같이 가로 라인이 겹치는 경우 어느 방향으로 이동할지 결정할 수 없다.
<br>
- [x] 실행 결과를 쉼표(,)를 기준으로 구분한다.
- [x] 사다리 결과 출력 시 결과도 함께 출력한다.
- [x] 결과를 보고 싶은 사람 이름을 입력한다. (all 입력 시 전체 결과 출력)
- [x] all이 아닐 경우 결과 보고 싶은 사람 이름을 다시 물어야 한다.

## 📌 Commit Convention

커밋 메시지는 다음과 같은 형태로 작성합니다.

```Bash
> "커밋의 타입: 커밋 메세지 내용"
ex) "docs: 기능 목록 추가"
```

커밋의 타입은 아래 10가지 중 가장 적절한 것을 선택해 작성합니다.

| 커밋의 타입 | 설명 |
| :---------: | :-----------------------------------------------: |
| feat | 새로운 기능 추가 |
| fix | 버그 수정 |
| comment | 필요한 주석 추가 및 변경 |
| test | 테스트 코드 추가 |
| docs | 문서를 추가 혹은 수정 (ex. README 수정) |
| rename | 파일 혹은 폴더명을 수정하거나 옮기는 작업 |
| remove | 파일을 삭제하는 작업만 수행 |
| chore | 빌드 태스크 업데이트, 패키지 매니저를 설정 |
| refactor | 코드 리팩토링 |
| style | 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 |

<br>

## 📌 Code Convention

- 구글 Java 코딩 컨벤션을 준수합니다.
- IntelliJ의 Formatter를 적용합니다.
93 changes: 0 additions & 93 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -1,93 +0,0 @@
# java-racingcar

<br>

## 📚 도메인 모델 네이밍 사전

| 한글명 | 영문명 | 설명 |
|-------|--------------|---------------------|
| 참가자 | Participants | 사다리 게임에 참가하는 사람들을 지칭 |
| 사람 | Person | 사람을 지칭 |
|| Map | 맵 정보 지칭 |
| 사다리 | Ladder | 사다리 지칭 |
| 라인 | Line | 사다리의 한줄을 지칭 |

<br>

## 👨‍🍳 기능 목록

- 참가자
- [x] 사람은 10명까지 ( 테스트 원할한 범위 )
- [x] 사람은 2명 이상이다.
- [x] 사람이름은 ',' 로 구분한다.
- [x] 중복된 이름을 가질 수 없다.


- 사람
- [x] 이름은 최대 5글자까지 가능하다
- [x] 이름은 빈문자 혹은 공백으로만 이루어지면 안 된다


- 맵 (사다리)
- [x] 사다리의 높이는 숫자여야 한다.
- [x] 사다리의 최소 높이는 1이다.
- [x] 사다리의 최대 높이는 10이다. ( 테스트 원할한 범위 )
- [x] 사다리는 높이만큼의 라인을 가진다.
- [x] 사다리의 라인은 1이상 9이하의 갯수의 상태를 갖는다. (참가자수에서 1을 뺀 값)


- 라인
- [x] 라인은 1이상 9이하의 갯수의 상태를 갖는다.
- [x] 상태는 두 가지 경우를 가진다 (연결 혹은 비연결)
- [x] true, false 중 랜덤한 boolean을 생성한다.
- [x] 연속으로 연결상태를 가질 수 없다.


- 출력
- [x] 사람 이름은 5자 기준으로 출력하기에 폭도 이에 맞춘다.


- 입력
- [x] 참여자 이름을 입력한다.
- [x] 최대 사다리 높이를 입력한다.

## 요구 사항

- [x] 사다리 게임에 참여하는 사람에 이름을 최대5글자까지 부여할 수 있다.
- [x] 사다리를 출력할 때 사람 이름도 같이 출력한다.
- [x] 사람 이름은 쉼표(,)를 기준으로 구분한다.
- [x] 사람 이름을 5자 기준으로 출력하기 때문에 사다리 폭도 넓어져야 한다.
- [x] 사다리 타기가 정상적으로 동작하려면 라인이 겹치지 않도록 해야 한다.
- [x] |-----|-----| 모양과 같이 가로 라인이 겹치는 경우 어느 방향으로 이동할지 결정할 수 없다.
<br>

## 📌 Commit Convention

커밋 메시지는 다음과 같은 형태로 작성합니다.

```Bash
> "커밋의 타입: 커밋 메세지 내용"
ex) "docs: 기능 목록 추가"
```

커밋의 타입은 아래 10가지 중 가장 적절한 것을 선택해 작성합니다.

| 커밋의 타입 | 설명 |
| :---------: | :-----------------------------------------------: |
| feat | 새로운 기능 추가 |
| fix | 버그 수정 |
| comment | 필요한 주석 추가 및 변경 |
| test | 테스트 코드 추가 |
| docs | 문서를 추가 혹은 수정 (ex. README 수정) |
| rename | 파일 혹은 폴더명을 수정하거나 옮기는 작업 |
| remove | 파일을 삭제하는 작업만 수행 |
| chore | 빌드 태스크 업데이트, 패키지 매니저를 설정 |
| refactor | 코드 리팩토링 |
| style | 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 |

<br>

## 📌 Code Convention

- 구글 Java 코딩 컨벤션을 준수합니다.
- IntelliJ의 Formatter를 적용합니다.
16 changes: 10 additions & 6 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
import controller.RadderGameController;
import controller.LadderGameController;
import util.RandomBooleanGenerator;
import view.input.InputView;
import view.output.OutputView;
import view.InputView;
import view.OutputView;

import java.util.Scanner;

public class Application {

public static void main(String[] args) {
InputView inputView = new InputView();
InputView inputView = new InputView(new Scanner(System.in));
OutputView outputView = new OutputView();
RandomBooleanGenerator randomBooleanGenerator = new RandomBooleanGenerator();
RadderGameController radderGameController = new RadderGameController();
radderGameController.play(inputView, outputView, randomBooleanGenerator);

LadderGameController ladderGameController =
new LadderGameController(inputView, outputView, randomBooleanGenerator);
ladderGameController.play();
}
}
89 changes: 89 additions & 0 deletions src/main/java/controller/LadderGameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package controller;

import domain.*;
import util.BooleanGenerator;
import util.Task;
import view.InputView;
import view.OutputView;

public class LadderGameController {

private static final String RESULT_ALL = "all";

private final InputView inputView;
private final OutputView outputView;
private final BooleanGenerator booleanGenerator;

public LadderGameController(InputView inputView, OutputView outputView,
BooleanGenerator booleanGenerator) {
this.inputView = inputView;
this.outputView = outputView;
this.booleanGenerator = booleanGenerator;
}

public void play() {
Participants participants = setParticipants();
Results results = setResults(participants);
Ladder ladder = generateLadder(participants, booleanGenerator);

LadderGame ladderGame = new LadderGame(participants, results, ladder);
printLadder(ladderGame);

printResult(ladderGame);
}

private Participants setParticipants() {
return Task.retryUntilSuccess(() -> {
String participantNames = inputView.enterParticipantNames();
return new Participants(participantNames);
}, outputView);
}

private Results setResults(Participants participants) {
return Task.retryUntilSuccess(() -> {
String results = inputView.enterResults();
return new Results(results, participants.getParticipantCount());
}, outputView);
}

private Ladder generateLadder(Participants participants, BooleanGenerator booleanGenerator) {
return Task.retryUntilSuccess(() -> {
Height height = new Height(inputView.enterHeight());
Weight weight = new Weight(participants.getParticipantCount());
return new Ladder(height, weight, booleanGenerator);
}, outputView);
}

private void printLadder(LadderGame ladderGame) {
outputView.printLadder(ladderGame.getParticipants(), ladderGame.getLadder(),
ladderGame.getResults());
}

private void printResult(LadderGame ladderGame) {
boolean isContinue = true;
while (isContinue) {
isContinue = getResult(ladderGame);
}
}

private boolean getResult(LadderGame ladderGame) {
try {
String inputResult = inputView.enterGetResult();
return getResultByInput(ladderGame, inputResult);
} catch (IllegalArgumentException exception) {
outputView.printErrorMessage(exception);
return true;
}
}

private boolean getResultByInput(LadderGame ladderGame, String inputValue) {
if (RESULT_ALL.equals(inputValue)) {
outputView.printMatchAllResult(ladderGame.getGameAllResult(),
ladderGame.getParticipants());
return false;
}

outputView.printMatchResult(ladderGame.getGameResultByName(inputValue));
return true;
}
}
43 changes: 0 additions & 43 deletions src/main/java/controller/RadderGameController.java

This file was deleted.

Loading

0 comments on commit b21b896

Please sign in to comment.