Skip to content

Commit

Permalink
3단계 - 사다리(게임 실행), 2단계 - 사다리(생성) 수정 (#2281)
Browse files Browse the repository at this point in the history
* feat(ladder): rename package util -> generator
#2264 (comment)

* refactor(ladder): modify new Random() 상수화 재활용
#2264 (comment)

* refactor(ladder): modify Line break 상수 System.lineSeperator() 로 변경
#2264 (comment)

* refactor(ladder): modify cross line 출력 문자열
#2264 (comment)

* refactor(ladder): modify cross line 출력 문자열
#2264 (comment)

* refactor(ladder): modify Point field name current -> right

* docs(ladder): add README_LADDER_RUN.md

* docs(ladder): modify README_LADDER_RUN.md

* docs(ladder): modify README_LADDER_RUN.md
- X 생성
- 0보다 작으면 오류
- Y 생성
- 0보다 작으면 오류

feat(ladder): create X

feat(ladder): create Y

* docs(ladder): modify README_LADDER_RUN.md
- X 이동
- X 우로 이동
- X 좌로 이동
- X 좌로 이동 실패 0보다 작음

feat(ladder): add X moveRight, moveLeft method

test(ladder): add 오른쪽으로 이동한다, 왼쪽으로 이동한다, 왼쪽으로 이동 실패: 0미만

* docs(ladder): modify README_LADDER_RUN.md
- Y 이동
- Y 아래로 이동

feat(ladder): add Y moveDown

test(ladder): add Y 아래로 이동한다

* docs(ladder): modify README_LADDER_RUN.md
- Position 생성
- Position 이동

feat(ladder): add Position, constructor, move method

test(ladder): add Position create, move test methods

* docs(ladder): modify README_LADDER_RUN.md
- PlayerName 이름이 all 일 수 없다

feat(ladder): rename Name -> PlayerName

test(ladder): add PlayerName create_키워드_all_실패 test method

* docs(ladder): modify README_LADDER_RUN.md
- Player 생성
- Player 이름을 출력한다

feat(ladder): add Player constructor, name method

test(ladder): add PlayerTest create, name

feat(ladder): modify PlayerName name() -> value()

* docs(ladder): modify README_LADDER_RUN.md
- RewardName 생성

feat(ladder): add RewardName constructor, value

test(ladder): add RewardName create, value

* docs(ladder): modify README_LADDER_RUN.md
- Reward 생성
- Reward 이름을 출력한다
- Reward Position 동등 비교
- Player 포지션을 출력한다

feat(ladder): add Reward constructor, name, isEqualPosition

test(ladder): add RewardTest create, name, isEqualPosition

feat(ladder): add Player position

test(ladder): add PlayerTest position

* feat(ladder): modify Players field playerNames -> players

test(ladder): modify PlayersTest create

feat(ladder): modify Player name return type String -> PlayerName

test(ladder): modify PlayerTest name

* docs(ladder): modify README_LADDER_RUN.md
- Rewards 생성
- Rewards 게임결과를 도출한다
- Rewards 게임결과들을 도출한다
- Result 생성
- Result 플레이어의 결과인지 출력
- Result RewardName 출력
- Result PlayerName 출력
- Results 생성
- Results 결과목록 출력

feat(ladder): add Result

test(ladder): add ResultTest

feat(ladder): add Results

test(ladder): add ResultsTest

feat(ladder): add Rewards

test(ladder): add RewardsTest

feat(ladder): add Players each method

test(ladder): add PlayersTest each method

feat(ladder): add Reward

test(ladder): add RewardsTest

* docs(ladder): modify README_LADDER_RUN.md
- modify Reward position x 동등 비교
- modify Reward field Position -> X
- add Player 가로 일치 여부를 출력한다

feat(ladder): modify Reward constructor, field Position -> X

test(ladder): modify RewardTest

feat(ladder): modify Rewards constructor

test(ladder): modify RewardsTest

feat(ladder): add Position xEquals

test(ladder): add PositionTest xEquals

* docs(ladder): remove step3 added code

* docs(ladder): modify README_LADDER_RUN.md
- Players 플레이어 모두 한칸 아래 이동
- Point 이동

feat(ladder): add Players moveLine

test(ladder): add PlayersTest moveLine

feat(ladder): add Point move

test(ladder): add PointTest move

* docs(ladder): modify README_LADDER_RUN.md
- Line 플레이어 모두 한칸 아래 이동

feat(ladder): remove Players moveLine

test(ladder): remove PlayersTest moveLine

feat(ladder): add Line move

test(ladder): add LineTest move

feat(ladder): add Vertical

test(ladder): add VerticalTest

feat(ladder): add Players vertical

test(ladder): add PlayersTest vertical

* docs(ladder): modify README_LADDER_RUN.md
- Lines 플레이어 모두 마지막까지 이동

feat(ladder): remove Players moveLine

feat(ladder): add Lines move

test(ladder): add LinesTest move

* docs(ladder): modify README_LADDER_RUN.md
- PlayerName 생성
- RewardName 생성

feat(ladder): add RewardName

test(ladder): add RewardNameTest

* docs(ladder): modify README_LADDER_RUN.md
- Ladder 결과들을 생성한다
- Rewards 이름을 출력한다
- Results 생성
- Results 게임결과를 도출한다
- Results 게임결과들을 도출한다

feat(ladder): add Ladder results

test(ladder): add LadderTest results

feat(ladder): add Rewards names

test(ladder): add RewardsTest names

feat(ladder): add Results

test(ladder): add ResultsTest

* feat(ladder): modify unused imports,
- modify unused Exceptions

test(ladder): modify omitted @DisplayName

* docs(ladder): modify README_LADDER_RUN.md
- Rewards 생성 실패
- Players 생성 실패
- Vertical 생성 실패
- InputView 실행 결과를 입력받는다.(실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요))
- InputView 결과를 볼 플레이어 이름을 입력받는다.(결과를 보고 싶은 사람은?)
- InputView 결과를 볼 플레이어 전체를(all) 입력받는다.(결과를 보고 싶은 사람은?)
- ResultView 사다리결과에 Rewards 를 붙여 출력한다
- ResultView 실행 결과를 출력한다(실행 결과)
- ResultView 실행 결과들을 출력한다(실행 결과)

feat(ladder): add InputView inputNamesToRewards, inputResultPlayer

feat(ladder): add ResultView renderResults
- modify ResultView renderLadderAndRewards, toLadder

feat(ladder): modify LadderController run

feat(ladder): modify Players constructor

test(ladder): modify PlayersTest create_실패_플레이어_목록이_1명_미만

feat(ladder): modify Rewards constructor

test(ladder): modify RewardsTest create_실패_rewardNames_갯수와_playersCount_갯수_불일치

feat(ladder): modify Vertical constructor

test(ladder): modify VerticalTest create_실패_0보다_작을_수_없다
  • Loading branch information
mitsui3point authored Dec 1, 2024
1 parent 348fe84 commit a651e56
Show file tree
Hide file tree
Showing 37 changed files with 1,060 additions and 184 deletions.
2 changes: 1 addition & 1 deletion README_LADDER_CREATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public class Line {
- [x] 참여자 count 0 일경우 오류.
- [x] 한줄 정보를 문자열로 출력한다.
* field List<Boolean>
* HorizontalGenerator
* CrossGenerator.java
- [x] 가로줄을 생성한다.
### View
* InputView
Expand Down
157 changes: 157 additions & 0 deletions README_LADDER_RUN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
# 사다리 게임
## 2단계 - 사다리(생성)

## 기능 요구사항
* 사다리 실행 결과를 출력해야 한다.
* 개인별 이름을 입력하면 개인별 결과를 출력하고, "all"을 입력하면 전체 참여자의 실행 결과를 출력한다.

## 프로그래밍 요구사항
* 자바 8의 스트림과 람다를 적용해 프로그래밍한다.
* 규칙 6: 모든 엔티티를 작게 유지한다.
* 규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

### 실행 결과
* 위 요구사항에 따라 4명의 사람을 위한 5개 높이 사다리를 만들 경우, 프로그램을 실행한 결과는 다음과 같다.

```
참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)
pobi,honux,crong,jk
실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)
꽝,5000,꽝,3000
최대 사다리 높이는 몇 개인가요?
5
사다리 결과
pobi honux crong jk
|-----| |-----|
| |-----| |
|-----| | |
| |-----| |
|-----| |-----|
꽝 5000 꽝 3000
결과를 보고 싶은 사람은?
pobi
실행 결과
결과를 보고 싶은 사람은?
all
실행 결과
pobi : 꽝
honux : 3000
crong : 꽝
jk : 5000
```

## 힌트
* 각 로직을 구현하기 위해 필요한 데이터를 가지는 객체를 분리하기 위해 노력해본다. 로직 구현에 필요한 데이터를 가지는 객체를 잘 분리하면 의외로 쉽게 문제를 해결할 수 있다.
* 각 객체가 2개 이하의 인스턴스 변수만을 가지도록 구현해 본다.


```
참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)
pobi,honux,crong,jk
/**
없음
Rewards
List<RewardName> rewards field
*/
실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)
꽝,5000,꽝,3000
최대 사다리 높이는 몇 개인가요?
5
사다리 결과
pobi honux crong jk
|-----| |-----|
| |-----| |
|-----| | |
| |-----| |
|-----| |-----|
꽝 5000 꽝 3000 // 없음 - Rewards
/**
없음 - InputView
Name
*/
결과를 보고 싶은 사람은?
pobi
/**
없음 - ResultView
Players players;
String result = rewards.result(playerName);
List<String> results = players.results(players);
*/
실행 결과
// 없음 - Player
결과를 보고 싶은 사람은?
all
실행 결과
pobi : 꽝
honux : 3000
crong : 꽝
jk : 5000
```

## ADDED_TODO
### Domain
* Ladder
- [x] 결과들을 생성한다
* Rewards
- [x] 생성
- [x] 생성 실패
- [x] playersCount 와 일치하지 않으면 실패
- [x] 이름을 출력한다
* RewardName extends Name
- [x] 생성
* Lines
- [x] 플레이어 모두 마지막까지 이동
* Line
- [x] 플레이어 모두 한칸 아래 이동
- [x] 플레이어 가로 좌측 이동
- [x] 플레이어 가로 우측 이동
- [x] 플레이어 가로 이동 없음
* Players
- [x] 생성 실패
- [x] 이름 목록이 1 미만이면 실패
- [x] 이름목록 출력한다
- [x] 현재 사다리 높이를 출력한다
* PlayerName extends Name
- [x] 생성
* Vertical
- [x] 생성
- [x] 생성 실패
- [x] 0 미만이면 생성 실패
- [x] 이동(무조건 아래로)
* Point
- [x] 이동
- [x] 좌측
- [x] 우측
- [x] 이동안함
* Results
- [x] 생성
- [x] 게임결과를 도출한다("pobi")
- [x] 게임결과들을 도출한다("all")
* Map<PlayerName, RewardName> results
### View
* InputView
- [x] 실행 결과를 입력받는다.(실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요))
- [x] 결과를 볼 플레이어 이름을 입력받는다.(결과를 보고 싶은 사람은?)
- [x] 결과를 볼 플레이어 전체를(all) 입력받는다.(결과를 보고 싶은 사람은?)
* ResultView
- [x] 사다리결과에 Rewards 를 붙여 출력한다
- [x] 실행 결과를 출력한다(실행 결과)
- [x] 실행 결과들을 출력한다(실행 결과)
10 changes: 7 additions & 3 deletions src/main/java/ladder/controller/LadderController.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package ladder.controller;

import ladder.domain.Ladder;
import ladder.domain.Players;
import ladder.domain.*;
import ladder.view.InputView;
import ladder.view.ResultView;

import java.util.List;
import java.util.Scanner;

public class LadderController {
Expand All @@ -13,11 +13,15 @@ public static void run() {
InputView inputView = new InputView(new Scanner(System.in));

Players players = inputView.inputNamesToPlayers();
Rewards rewards = inputView.inputNamesToRewards(players);
Ladder ladder = inputView.inputVerticalSizeToLadder(players);

ResultView resultView = new ResultView();

resultView.renderLadder(ladder);
resultView.renderLadderAndRewards(ladder, rewards);

List<PlayerName> playerNames = inputView.inputResultPlayer(players);//결과를 보고 싶은 사람은?
resultView.renderResults(ladder.results(rewards), playerNames);
}

}
19 changes: 18 additions & 1 deletion src/main/java/ladder/domain/Ladder.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package ladder.domain;

import ladder.domain.util.CrossGenerator;
import ladder.domain.generator.CrossGenerator;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.IntStream;

public class Ladder {
public static final int START_INCLUSIVE = 0;
private final Lines lines;
private final Players players;

Expand Down Expand Up @@ -37,4 +41,17 @@ public Lines getLines() {
public Players getPlayers() {
return players;
}

public Results results(Rewards rewards) {
Players endPlayers = lines.move(players);
Map<PlayerName, RewardName> results = new HashMap<>();
IntStream.range(START_INCLUSIVE, endPlayers.size())
.boxed()
.forEach(index -> {
PlayerName key = endPlayers.names().get(index);
RewardName value = rewards.names().get(index);
results.put(key, value);
});
return new Results(results);
}
}
17 changes: 16 additions & 1 deletion src/main/java/ladder/domain/Line.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ladder.domain;

import ladder.domain.util.CrossGenerator;
import ladder.domain.generator.CrossGenerator;
import ladder.exception.PlayersCountException;
import ladder.exception.PointException;

Expand Down Expand Up @@ -61,6 +61,21 @@ public List<Point> getPoints() {
return Collections.unmodifiableList(points);
}

public Players move(Players players) {
List<PlayerName> nextLinePlayers = new ArrayList<>();

List<PlayerName> names = players.names();
names.forEach(name -> {
int index = names.indexOf(name);
Point point = points.get(index);
int moveIndex = point.move().value();
PlayerName movedName = names.get(index + moveIndex);
nextLinePlayers.add(movedName);
});

return new Players(nextLinePlayers, players.vertical().move());
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down
22 changes: 12 additions & 10 deletions src/main/java/ladder/domain/Lines.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ladder.domain;

import ladder.domain.util.CrossGenerator;
import ladder.domain.generator.CrossGenerator;

import java.util.Collections;
import java.util.List;
Expand All @@ -10,8 +10,6 @@

public class Lines {
public static final int START_INCLUSIVE = 0;
public static final String LINE_BREAK = "\n";
public static final String SPACE = " ";
private final List<Line> lines;

public Lines(Players players, int verticalLadderSize, CrossGenerator generator) {
Expand All @@ -22,29 +20,33 @@ public Lines(List<Line> lines) {
this.lines = lines;
}



private static List<Line> generateLines(int playersSize, int verticalLadderSize, CrossGenerator generator) {
return IntStream.range(START_INCLUSIVE, verticalLadderSize)
.boxed()
.map(index -> new Line(playersSize, generator))
.collect(Collectors.toList());
}

public List<Line> getLines() {
return Collections.unmodifiableList(lines);
}

public Players move(Players players) {
for (Line line : lines) {
players = line.move(players);
}
return players;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Lines lines1 = (Lines) o;
return Objects.equals(lines, lines1.lines);
}

@Override
public int hashCode() {
return Objects.hash(lines);
}

public List<Line> getLines() {
return Collections.unmodifiableList(lines);
}
}
10 changes: 8 additions & 2 deletions src/main/java/ladder/domain/Name.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import java.util.Objects;

public class Name {
public abstract class Name {
public static final String NOT_ALLOW_EMPTY_NAME_MESSAGE = "이름에 공백이 들어갈 수 없습니다.";
public static final String NOT_ALLOW_EXCEED_MAX_NAME_LENGTH_MESSAGE = "이름을 5글자를 초과할수 없습니다.";
public static final int DEFAULT_MAX_NAME_LENGTH = 5;
Expand All @@ -20,7 +20,6 @@ public Name(String name) {
if (name.length() > MAX_NAME_LENGTH) {
throw new InvalidNameException(NOT_ALLOW_EXCEED_MAX_NAME_LENGTH_MESSAGE);
}

this.name = name;
}

Expand All @@ -44,4 +43,11 @@ public boolean equals(Object o) {
public int hashCode() {
return Objects.hash(name);
}

@Override
public String toString() {
return "Name{" +
"name='" + name + '\'' +
'}';
}
}
32 changes: 0 additions & 32 deletions src/main/java/ladder/domain/Player.java

This file was deleted.

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

public class PlayerName extends Name {
public PlayerName(String value) {
super(value);
}
}
Loading

0 comments on commit a651e56

Please sign in to comment.