Skip to content
12 changes: 12 additions & 0 deletions .idea/material_theme_project_new.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.

8 changes: 0 additions & 8 deletions src/main/java/Ladder.java

This file was deleted.

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

public enum Direction {

LEFT(-1), RIGHT(1), NONE(0);

private final int value;

Direction(int value) {
this.value = value;
}

public int getValue() {
return value;
}

public String getStringValue() {
return Integer.toString(value);
}
}
19 changes: 19 additions & 0 deletions src/main/java/ladder/ExceptionMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ladder;

public enum ExceptionMessage {

INVALID_LADDER_POSITION("사다리 위치는 1이상 자연수입니다."),
INVALID_LADDER_NUMBER("사다리의 행과 열은 2 이상이여야 합니다."),
INVALID_POSITION("유효하지 않은 위치입니다."),
INVALID_DRAW_POSITION("사다리를 그릴 수 없는 위치입니다.");

private final String message;

ExceptionMessage(String message) {
this.message = message;
}

public String getMessage() {
return message;
}
}
27 changes: 27 additions & 0 deletions src/main/java/ladder/GreaterThanOne.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ladder;

// 1보다 큰지 검증하는 클래스
public class GreaterThanOne {

private final int number;

private GreaterThanOne(int number) {
this.number = number;
}

public static GreaterThanOne from(int number) {
if (! isGreaterThanOne(number)) { // 팩토리 메소드로 검증 (1보다 큰지)
throw new IllegalArgumentException(ExceptionMessage.INVALID_LADDER_NUMBER.getMessage());
}
return new GreaterThanOne(number);
}

// opt + cmd + m : 드래그 한 부분 새로운 method 생성
private static boolean isGreaterThanOne(int number) {
return number > 1;
}

public int getNumber() {
return number;
}
}
31 changes: 31 additions & 0 deletions src/main/java/ladder/LadderGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ladder;

import ladder.creator.LadderCreator;
import ladder.creator.LadderRandomCreator;

// todo Ladder 클래스가 많은 책임 (사다리 생성 / 사다리 그리기 / 사다리 게임 진행)
// 마지막으로 Ladder는 전체를 관장하는 클래스가 되었으므로
// LadderGame으로 변경
// todo <mission2> LadderGame에 의존성주입을 통해 LadderCreator를 변경해보기
// todo <mission2> LadderGame클래스 자체도 정적메소드 패턴을 이용하여 생성
public class LadderGame {

private final LadderCreator ladderCreator;
// private final LadderRandomCreator ladderRandomCreator;

public LadderGame(LadderCreator ladderCreator) {
this.ladderCreator = ladderCreator;
}



// todo 포지션 wrapper 클래스 필요
// todo LadderRunner로 분리 (Ladder 클래스 책임분산)
// LadderRunner를 통해 돌리자 (사다리를 타는것을 관리하는 클래스)
public int run(Position position) {
LadderRunner ladderRunner = new LadderRunner(ladderCreator.getRows()); // 이미 만들어 둔 ladderCreator의 사다리를 인수로 넘긴다..
ladderRunner.run(position);

return position.getPosition(); // 최종 인덱스(세로 번 째) 반환
}
}
30 changes: 30 additions & 0 deletions src/main/java/ladder/LadderPosition.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ladder;

// 사다리 출력을 위해, (x,y)좌표를 동시에 다루는 클래스
// 어디에 점을 찍을 지 알 수 있다...?
public class LadderPosition {
Position x, y;

public LadderPosition(Position x, Position y) {
this.x = x;
this.y = y;
}

public Position getX() {
return x;
}

public Position getY() {
return y;
}

public int getIntX() {
return x.getPosition();
}

public int getIntY() {
return y.getPosition();
}


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

public class LadderRunner {

private final Row[] rows; // 사다리의 한 행을 빼놓았다.
private StringBuilder ladder = new StringBuilder();

public LadderRunner(Row[] rows) {
this.rows = rows;
}

// todo 포지션 wrapper 클래스 필요
// 매개변수 : 시작 x좌표 / 반복문 : y좌표
public int run(Position position) {
// position (x)좌표는 마지막 위치에 있고
// for문의 반복으로 y좌표가 움직이면 좌표 다룰 수 있음

for (int i = 0; i < rows.length; i++) {
// 사다리 (*포함) 세팅
// todo 매개변수로 넘기는 값이 x,y인지 구별될 수 있도록
setStringLadder(new LadderPosition(position, Position.from(i)));
printLadder();
rows[i].nextPosition(position);
setStringLadder(new LadderPosition(position, Position.from(i)));
printLadder();
}

System.out.println("-".repeat(10));

return position.getPosition();
}

public void setStringLadder(LadderPosition xy) {
// 점을 한번 찍으면 특정 변수에 변화를 주어서, 다음 줄에서는 *을 찍지 않도록 조치..?

for (int i = 0; i < rows.length; i++) { // 높이만큼 순환
// todo 여기서 xy의 y좌표랑 반복문 인자 i랑 같은지 확인하고
// 같을 때 만 *을 찍을 수 있도록 인자를 넘긴다.
if (xy.getIntY() == i) {
ladder.append(rows[i].setStringStarLadder(xy)); // *을 붙이는 라인
ladder.append(System.lineSeparator());
continue;
}
ladder.append(rows[i].setStringLadder(xy)); // 일반 사다리 붙이는 라인
ladder.append(System.lineSeparator());
}
}

public void printLadder() {
System.out.println(ladder);
// System.out.println();
clearStringLadder();
}

public void clearStringLadder() {
ladder.setLength(0); // 전체 사다리 초기화

// for (int i = 0; i < rows.length; i++) { // 만들었던 사다리 줄 하나씩 초기화
// rows[i].rowLadder.setLength(0);
// }
}
}
32 changes: 32 additions & 0 deletions src/main/java/ladder/LadderSize.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ladder;

public class LadderSize {
GreaterThanOne row, numberOfPerson;

public LadderSize(GreaterThanOne row, GreaterThanOne numberOfPerson) {
this.row = row;
this.numberOfPerson = numberOfPerson;
}

public GreaterThanOne getRow() {
return row;
}

public GreaterThanOne getNumberOfPerson() {
return numberOfPerson;
}

public int getIntRow() {
return row.getNumber();
}

public int getIntNumberOfPerson() {
return numberOfPerson.getNumber();
}

// 생성해야 할 라인 개수 반환
public int getLadderLineNum() {
return (int) Math.floor(numberOfPerson.getNumber() * row.getNumber() * 0.3);
}

}
Loading