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

3단계 - 사다리(게임 실행), 2단계 - 사다리(생성) 수정 #2281

Merged
merged 27 commits into from
Dec 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f4b11c4
feat(ladder): rename package util -> generator
mitsui3point Nov 13, 2024
14a8418
refactor(ladder): modify new Random() 상수화 재활용
mitsui3point Nov 13, 2024
d672425
refactor(ladder): modify Line break 상수 System.lineSeperator() 로 변경
mitsui3point Nov 13, 2024
5038429
refactor(ladder): modify cross line 출력 문자열
mitsui3point Nov 14, 2024
f2dd14b
refactor(ladder): modify cross line 출력 문자열
mitsui3point Nov 14, 2024
a9a2dd5
refactor(ladder): modify Point field name current -> right
mitsui3point Nov 21, 2024
ebc5785
docs(ladder): add README_LADDER_RUN.md
mitsui3point Nov 22, 2024
5cdc1fb
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 24, 2024
51c30a9
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 24, 2024
89aa3d9
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 24, 2024
72eec73
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 24, 2024
e255ccc
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 26, 2024
e589be3
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 26, 2024
2070c73
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 26, 2024
9c44efa
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 26, 2024
2151c4d
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 26, 2024
b8a8671
feat(ladder): modify Players field playerNames -> players
mitsui3point Nov 26, 2024
1965135
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 27, 2024
94c6c98
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 27, 2024
8b44b4e
docs(ladder): remove step3 added code
mitsui3point Nov 28, 2024
82f8055
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 26, 2024
2ec82e6
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 30, 2024
2284a1e
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 30, 2024
3ecc210
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 30, 2024
2772846
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 30, 2024
4b263f4
feat(ladder): modify unused imports,
mitsui3point Nov 30, 2024
9f5dd51
docs(ladder): modify README_LADDER_RUN.md
mitsui3point Nov 30, 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
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) {
Copy link
Contributor

Choose a reason for hiding this comment

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

👍

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 {
Copy link
Contributor

Choose a reason for hiding this comment

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

추상 메서드도 없는데 굳이 추상 클래스로 구현한 이유는?

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