Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .idea/.name

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

124 changes: 124 additions & 0 deletions .idea/uiDesigner.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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

public enum Flag {

AFTER("After"),
BEFORE("Before");


private final String flag;

Flag(String flag) {
this.flag = flag;
}

public String getFlag() {
return flag;
}
}
1 change: 1 addition & 0 deletions src/main/java/ladder/LadderGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public class LadderGame {
private final LadderCreator ladderCreator;

public LadderGame(LadderCreator ladderCreator) {
ladderCreator.setRowsString(); //모든 행에 해당하는 문자열 생성
this.ladderCreator = ladderCreator;
}

Expand Down
36 changes: 36 additions & 0 deletions src/main/java/ladder/LadderPosition.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package ladder;

import ladder.creator.RandomNumber;

public class LadderPosition {
private int row;
private final Position col;

private LadderPosition(int col, int row){
this.row = row;
this.col = Position.from(col);
}
private LadderPosition(Position position, int row){
this.row = row;
this.col = position;
}

public static LadderPosition autoLadderPosition(int numberOfCol, int numberOfRow){
Copy link
Member

Choose a reason for hiding this comment

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

LadderAutoCreator가 랜덤 처리에 관한 역할을 하고 있는 것 같은데 LadderPosition에서 랜덤 값을 직접 다루는 건 해당 클래스의 책임을 벗어나는 것 같습니다.
LadderAutoCreator 에서 랜덤 값을 다루고, 생성된 랜덤 값을 단순히 파라미터로 받아 LadderPosition 객체를 생성하는게 바람직해 보입니다.

int col = RandomNumber.from(numberOfCol-1); //line을 그려줘야 되기 때문에 옆으로 한칸 여유가 있어야 함
int row = RandomNumber.from((numberOfRow));

return new LadderPosition(col, row);
}

public static LadderPosition from(Position position, int row){
return new LadderPosition(position, row);
}

public int getRow() {
return row;
}

public Position getCol() {
return col;
}
}
26 changes: 26 additions & 0 deletions src/main/java/ladder/LadderRunner.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package ladder;

import static ladder.Flag.*;

public class LadderRunner {

private final Row[] rows;
Expand All @@ -9,9 +11,33 @@ public LadderRunner(Row[] rows) {
}

public int run(Position position) {
rows[0].validatePosition(position); //validatePosition()를 public 으로 변경, 지저분한데...
//사다리 출력
for (int i = 0; i < rows.length; i++) {
printLadder(LadderPosition.from(position, i), BEFORE); //기존에는 rows[i].nextPosition(position)에서 시작위치 유효성 검사를 해줬는데 해주기 전에 그려버리니까 오류 발생
rows[i].nextPosition(position);
printLadder(LadderPosition.from(position, i), AFTER);
}

return position.getValue();
}

//전체 사다리 출력 함수
private void printLadder(LadderPosition ladderPosition, Flag flag){
StringBuilder sb = new StringBuilder("\n" + flag.getFlag() + "\n");

for(int i = 0; i < rows.length; i++) {
sb.append(setLadderRow(i, ladderPosition));
}

System.out.println(sb);
}

private StringBuilder setLadderRow(int row, LadderPosition ladderPosition){
if(row == ladderPosition.getRow()){
return rows[row].getRowStringBuilder(ladderPosition.getCol()); //'*' 추가 X 문자열 받아옴
}
return rows[row].getRowStringBuilder(); //'*' 추가 X 문자열 받아옴
}

}
18 changes: 18 additions & 0 deletions src/main/java/ladder/Node.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,24 @@ public void move(Position position) {
}
}

public int getNodeValue(){
int get = 0;

if(isRight()){
get = 1;
}
if(isLeft()){
get = -1;
}

return get;
}

public void setNodeString(StringBuilder sb){
sb.append(getNodeValue()).append(" ");
}


public void setRightNode() {
direction = RIGHT;
}
Expand Down
64 changes: 63 additions & 1 deletion src/main/java/ladder/Row.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

public class Row {
private final Node[] nodes;
private StringBuilder rowStringBuilder;

public Row(GreaterThanOne numberOfPerson) {
nodes = new Node[numberOfPerson.getNumber()];
Expand All @@ -18,19 +19,80 @@ public void drawLine(Position startPosition) {
setDirectionBetweenNextPosition(startPosition);
}

//사다리 한 개 층 문자열 생성
public void setRowString(){
rowStringBuilder = new StringBuilder();

for (Node node : nodes) {
node.setNodeString(rowStringBuilder); //append(nodos.getValue()) 보다, node에 sb 넘겨줘서 처리
}
rowStringBuilder.deleteCharAt(rowStringBuilder.length()-1);
rowStringBuilder.append("\n");

}

public void nextPosition(Position position) {
validatePosition(position);

nodes[position.getValue()].move(position);
}

// '*'를 제거하고, '*' 없는 문자열 반환
public StringBuilder getRowStringBuilder() {
clearStarInRowString();

return rowStringBuilder;
}

// '*'를 제거하고, 새 위치에 '*'를 추가하여 문자열 반환
public StringBuilder getRowStringBuilder(Position position) {
clearStarInRowString();
insertStarAtPosition(position);

return rowStringBuilder;
}

// 문자열에서 '*'를 제거하는 메서드
private void clearStarInRowString() {
int starIndex = rowStringBuilder.indexOf("*");

if (starIndex != -1) {
rowStringBuilder.deleteCharAt(starIndex);
}
}
Copy link
Member

Choose a reason for hiding this comment

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

현재 코드가 너무 복잡해서 가독성이 너무 떨어지는 것 같아요.. 제가 부족한 탓이 크겠지만 솔직히 당장 코드만 보고 어떤 맥락으로 코드가 진행되는지 알기 너무 힘들 것 같습니다. 특히 객체에 부여된 책임과 메서드가 하는 일이 제대로 정의되어 있지 않은 것 같은데 리팩토링이 필요해 보입니다!
어렵게 생각할 필요 없이 반복문을 통해 모든 좌표를 탐색하기 때문에 Node는 그냥 자신의 값을 rb에 추가하면 될 것 같고 추가로 Row에선 LadderPosition과 출력하는 좌표가 같은지 확인하는 로직만 있어도 충분할 것 같습니다.
잘 이해가 안되시면 2week-complete 참고하시면 좋을 것 같습니다!


// 주어진 위치에 '*'를 삽입하는 메서드
private void insertStarAtPosition(Position position) {
int offset = calculateOffsetForStar(position);

rowStringBuilder.insert(position.getValue() * 2 + 1 + offset, "*");
}

// '*'가 삽입될 위치를 계산하는 메서드
private int calculateOffsetForStar(Position position) {
int offset = 0;
int col = 0;

// '*'가 들어갈 위치에 '-'가 있으면, 그만큼 offset을 증가
for (int i = 0; i * 2 + offset < rowStringBuilder.length(); i++) {
if (col > position.getValue()) {
break;
}
col++;
if (rowStringBuilder.charAt(i * 2 + offset) == '-') {
offset++;
}
}
return offset;
}

private void setDirectionBetweenNextPosition(Position position) {
nodes[position.getValue()].setRightNode();
position.next();
nodes[position.getValue()].setLeftNode();
}

private void validatePosition(Position position) {
public void validatePosition(Position position) { //일단 public으로 수정하여 진행
if (isInvalidPosition(position) ) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_POSITION.getMessage());
}
Expand Down
Loading