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

[시온] step-4 일부 구현 #205

Open
wants to merge 24 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
5480bcb
feat: 사람수, 사다리 높이 입력 기능 추가
LaStella Mar 9, 2023
6bf3245
chore: gitignore수정
LaStella Mar 9, 2023
9053181
feat: 사다리 라인 랜덤 생성 기능, 사다리 출력 기능 추가
LaStella Mar 9, 2023
477ddc4
chore: 추적하지 않는 파일 삭제
LaStella Mar 9, 2023
acb3840
refactor: Ladder 클래스 리팩토링
LaStella Mar 9, 2023
49b2118
chore: 사용안하는 import 삭제
LaStella Mar 9, 2023
dfabeb6
refactor: Console클래스 리팩토링
LaStella Mar 9, 2023
aaa66b4
refactor: LadderGame 클래스 리팩토링
LaStella Mar 9, 2023
d1b0727
feat: 입력받은 이름을 ArrayList로 변환하는 기능 추가
LaStella Mar 10, 2023
e308ddb
feat: 사다리를 나타내는 배열을 리스트로 변경, 사다리 랜덤 생성시 한 열에 두 라인이 겹치지 않는 기능 추가
LaStella Mar 13, 2023
47a96e0
docs: 주간 학습계획 추가
LaStella Mar 13, 2023
55ea7cf
refactor: LadderGame클래스 리팩토링
LaStella Mar 13, 2023
601b165
feat: 입력된 사람의 이름을 출력하는 기능 구현, 사다리 모양을 사람 이름 길이에 맞게 출력하도록 수정
LaStella Mar 13, 2023
eec8deb
test: 사다리 생성에 대한 테스트 추가
LaStella Mar 14, 2023
35107d0
refactor: LadderGame클래스 리팩토링
LaStella Mar 14, 2023
0b4964e
refactor: isValidPlayer 메소드 리팩토링
LaStella Mar 16, 2023
bd37f13
chore: 테스트클래스 주석 추가
LaStella Mar 16, 2023
221340f
refactor: Ladder 클래스 리펙토링
LaStella Mar 16, 2023
98ab845
refactor: RandomLadderGenerator 클래스와 테스트클래스 리펙토링
LaStella Mar 16, 2023
4dd241c
fix: isValidPlayer 메소드 수정
LaStella Mar 16, 2023
6e88682
chore: 클래스를 패키지별로 분리
LaStella Mar 17, 2023
f678840
refactor: Console클래스 리펙토링
LaStella Mar 17, 2023
c2cd0d4
refacotr: LadderGame 클래스 리펙토링
LaStella Mar 17, 2023
a0eb363
refacotr: LadderGame 클래스 리펙토링
LaStella Mar 17, 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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ build/
!**/src/test/**/build/

### IntelliJ IDEA ###
.idea
.idea/workspace.xml
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
Expand Down
1 change: 0 additions & 1 deletion .idea/.name

This file was deleted.

17 changes: 0 additions & 17 deletions .idea/aws.xml

This file was deleted.

17 changes: 0 additions & 17 deletions .idea/gradle.xml

This file was deleted.

10 changes: 0 additions & 10 deletions .idea/misc.xml

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

83 changes: 0 additions & 83 deletions .idea/workspace.xml

This file was deleted.

49 changes: 49 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,52 @@
* [텍스트와 이미지로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정](https://github.com/code-squad/codesquad-docs/blob/master/codereview/README.md)

* [동영상으로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정](https://youtube.com/watch?v=lFinZfu3QO0&si=EnSIkaIECMiOmarE)

## 요구사항 분석

- 사람과 사다리의 높이를 입력한다
- 사람 `n`명과 사다리 높이 `m`을 입력한다
- 입력값이 정수인지 검증한다
- (추가) 사람의 이름을 입력한다
- 사람의 이름이 5글자 이하인지 검증한다
- 사람의 이름은 "`,`" 기준으로 구분한다

- 사다리의 라인을 랜덤하게 만든다
- 라인은 랜덤값에 따라 있거나 없다
- 라인이 존재한다면 "`-`"를 없으면 "` `"(공백문자)를 표시한다
- 라인의 양 옆에는 "`|`"로 세로를 표시한다
- (추가) 같은 높이에 라인이 겹치지 않아야 한다
- 사다리 상태를 화면에 출력한다
- (추가) 사람의 이름을 출력한다
- 사람의 이름을 최대 5자로 정하므로 이에 따라 사다리의 폭도 넓게 출력한다

## 구현 계획 및 학습 계획
### 3.7 화 오전
-[x] 사다리를 나타낼 배열을 먼저 구현한다
-[x] 사다리의 라인을 랜덤하게 구현한다
### 3.7 화 오후
-[x] 사다리의 모습을 출력한다 (3.7 화 오후까지)
-[x] 사람의 이름으로 사다리 배열을 구현한다
### ~~3.8 수~~ 3.13 월
-[ ] 같은 높이에서 라인이 겹치지 않으면서 랜덤하게 나타나도록 구현한다
-[ ] 사람의 이름과 사다리를 출력한다
-[ ] 로직을 구현하는 단위테스트를 추가한다
### ~~3.8 목~~ 3.14 화
-[ ] 한 라인의 좌표 값을 가지는 객체를 추가해 구현한다
-[ ] 클래스들을 역할에 맞게 패키지 분리한다
-[ ] 실행 결과 입력기능을 구현한다
### ~~3.9 금~~ 3.15 수
-[ ] 개인별 결과를 출력한다
-[ ] 전체 참여자의 결과를 출력한다
-[ ] 춘식이 입력시 프로그램을 종료하는 기능을 구현한다.
### 3.16 목
-[ ] 자바 클린 코딩 기초
-[ ] 자바 문자열
-[ ] 리스트와 제네릭
-[ ] Java Collection Framework
-[ ] TDD Basic
### 3.17 금
-[ ] Java Exception
-[ ] Java Enum
-[ ] SparkJava
-[ ] JVM
8 changes: 7 additions & 1 deletion src/main/java/kr/codesquad/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package kr.codesquad;

import kr.codesquad.domain.LadderGame;
import kr.codesquad.domain.RandomLadderGenerator;
import kr.codesquad.view.Console;

public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
Console console = new Console();
RandomLadderGenerator generator = new RandomLadderGenerator();
new LadderGame(console, generator).run();
}
}
29 changes: 29 additions & 0 deletions src/main/java/kr/codesquad/domain/Ladder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package kr.codesquad.domain;

import java.util.ArrayList;

public class Ladder {
private ArrayList<Line> ladder;

public Ladder(ArrayList<Line> ladder) {
this.ladder = ladder;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (var line : ladder) {
sb.append(" "); // 사람 이름 5글자가 기준이므로 사다리 앞에 2칸의 간격 추가
for (int i = 0; i < line.size(); i++) {
sb.append(line.hasBridge(i) ? "|-----" : "| ");
}
sb.append("\n");
}

return String.valueOf(sb);
}

public ArrayList<Line> getLadder() {
return ladder;
}
}
87 changes: 87 additions & 0 deletions src/main/java/kr/codesquad/domain/LadderGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package kr.codesquad.domain;

import kr.codesquad.view.Console;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;

public class LadderGame implements Runnable {
private final int MIN_SIZE_OF_PEOPLE = 2;
private final int MIN_SIZE_OF_LADDER = 1;
private final int MAX_NAME_SIZE = 5;
private final Console console;
private final RandomLadderGenerator generator;

public LadderGame(Console console, RandomLadderGenerator generator) {
this.console = console;
this.generator = generator;
}

@Override
public void run() {
ArrayList<Player> players = inputNamesToPlayers();
int ladderSize = inputNumberToLadderSize();

Ladder ladder = generator.generate(players.size(), ladderSize);
printPlayerList(players); // 사람 이름 출력
System.out.println(ladder); // 사다리 출력
}

private void printPlayerList(ArrayList<Player> playerArrayList) {
StringBuilder sb = new StringBuilder();
for (var player : playerArrayList) {
sb.append(alignCenter(player.getName())).append(" ");
}
System.out.println(sb);
}

// 5글자를 기준으로 이름을 가운데로 정렬하는 메소드
private String alignCenter(String name) {
StringBuilder sb = new StringBuilder();
while (sb.length() < (MAX_NAME_SIZE - name.length()) / 2) sb.append(" ");
sb.append(name);
while (sb.length() < MAX_NAME_SIZE) sb.append(" ");
return sb.toString();
}

private ArrayList<Player> inputNamesToPlayers() {
var input = console.input("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)");
if (input.isEmpty()) return inputNamesToPlayers();
var parsedValue = parsePlayerList(input.get());
return parsedValue.orElseGet(this::inputNamesToPlayers);
}

private Optional<ArrayList<Player>> parsePlayerList(String inputString) {
String[] playerNames = inputString.split(",");
if (!isValidPlayer(playerNames)) return Optional.empty();

ArrayList<Player> result = new ArrayList<>();
for (int i = 0; i < playerNames.length; i++) {
result.add(new Player(playerNames[i], i));
}
return Optional.of(result);
}

private boolean isValidPlayer(String[] playerNames) {
if (playerNames.length < MIN_SIZE_OF_PEOPLE) return false; // 최소 플레이어수 확인
return Arrays.stream(playerNames).allMatch(name -> name.length() < MAX_NAME_SIZE);
}

private Optional<Integer> parseLadderSize(String inputString) {
try {
int result = Integer.parseInt(inputString);
if (result < MIN_SIZE_OF_LADDER) return Optional.empty();
return Optional.of(result);
} catch (NumberFormatException e) {
return Optional.empty();
}
}

private int inputNumberToLadderSize() {
var input = console.input("최대 사다리 높이는 몇 개인가요?");
if (input.isEmpty()) return inputNumberToLadderSize();
var parsedValue = parseLadderSize(input.get());
return parsedValue.orElseGet(this::inputNumberToLadderSize);
}
}
19 changes: 19 additions & 0 deletions src/main/java/kr/codesquad/domain/Line.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package kr.codesquad.domain;

import java.util.ArrayList;

public class Line {
private ArrayList<Boolean> points = new ArrayList<>();

public boolean hasBridge(int i) {
return points.get(i);
}

public int size() {
return points.size();
}

public void add(boolean point) {
points.add(point);
}
}
33 changes: 33 additions & 0 deletions src/main/java/kr/codesquad/domain/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package kr.codesquad.domain;

public class Player {
private final String name;
private int col;
private int row;

public Player(String name, int col) {
this.name = name;
this.col = col;
this.row = 0;
}

public String getName() {
return name;
}

public int getCol() {
return col;
}

public int getRow() {
return row;
}

public void setCol(int col) {
this.col = col;
}

public void setRow(int row) {
this.row = row;
}
}
Loading