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.

403 changes: 403 additions & 0 deletions .idea/dbnavigator.xml

Large diffs are not rendered by default.

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.

16 changes: 16 additions & 0 deletions src/main/java/ExceptionMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
public enum ExceptionMessage {

INVALID_LADDER_SIZE("사다리의 열과 행은 2이상의 자연수입니다."),
INVALID_LINE_POSITION("선의 위치가 사다리를 벗어납니다."),
INVALID_START_POSITION("출발 위치는 1이상의 자연수입니다.");

private final String message;

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

public String getMessage() {
return message;
}
}
56 changes: 52 additions & 4 deletions src/main/java/Ladder.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,56 @@
public class Ladder {
import java.util.ArrayList;
import java.util.List;

private final int[][] rows;
class Ladder {
private final int[][] rows;
private final List<Line> lines;

public Ladder(int row, int numberOfPerson) {
rows = new int[row][numberOfPerson];
public Ladder(int row, int column) {
validateLadderDimensions(row, column);
this.rows = new int[row][column];
lines = new ArrayList<>();
}

private void validateLadderDimensions(int row, int column) {
if(row < 2 || column < 2) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_LADDER_SIZE.getMessage());
}
}

public void addLine(int fromLine, int toLine, int currentRow) {
Line line = new Line(fromLine, toLine, currentRow, this.rows);
lines.add(line);
}

public boolean isLine(int row, int col) {
return rows[row][col] == 1 || rows[row][col] == -1;
Copy link

Choose a reason for hiding this comment

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

요런 정해진 상수값도 enum으로 관리해주면 좋을 것 같아요.

}

public boolean isLineAtLeft(int row, int col) {
return col > 0 && rows[row][col - 1] == - 1;
}

public boolean isLineAtRight(int row, int col) {
return col + 1 < rows[row].length && rows[row][col + 1] == 1;
}

public int getHeight() {
return rows.length;
}

public int getWidth() {
return rows[0].length;
}

public int getRows(int row, int col) {
return rows[row][col];
}

public boolean isLeftLine(int currentRow, int currentCol) {
return rows[currentRow][currentCol] == 1;
}

public boolean isRightLine(int currentRow, int currentCol) {
return rows[currentRow][currentCol] == - 1;
}
}
3 changes: 3 additions & 0 deletions src/main/java/LadderCreator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
public interface LadderCreator {
Ladder createLine(int rows, int columns);
}
Comment on lines +1 to +3
Copy link

Choose a reason for hiding this comment

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

이렇게 인터페이스로 따로 나누자고 하는 것은 사용자가 직접 선을 그리는 경우, 랜덤으로 생성되는 경우 각각을 creator로 생각하고 이에 대해 조합을 이용해서 코드를 짜보자 라는것이 사실 목적이에요.
각각의 경우가 뭔지에 상관없이 LadderCreator를 받아와서 사용하는 DI를 구현하고자하는거에요.
각 경우에 대한 구현은 이를 상속받는 Random과 Custom(임시적인 클래스명)에서 구현하면 되는거죠.
만약 다른 경우가 추가된다면 다시 LadderCreator를 상속받는 클래스를 만들어서 구현하면되는 것이죠.
헷갈리시다면, SOLID의 DIP법칙을 생각하시면 됩니다!

하지만, 이 경우는 Random 경우에만 ladderCreator를 상속받는 creator가 있고 바로 ladder를 만들고 바로 반환해요.
ladder를 자동으로 만들어주기만 하는 클래스를 만든 것이죠.
이런 경우 사실 오히려 가독성을 해칠수도 있어요!
인터페이스를 만들고 사용하고자 할때, 이를 상속받고 만들어지는 클래스들에 대해 생각해보시면 좋을 것 같아요

28 changes: 28 additions & 0 deletions src/main/java/LadderGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import java.util.Scanner;

public class LadderGame {
private Ladder ladder;
private static Scanner scanner;
private int startPosition;
private LadderRunner ladderRunner;

public LadderGame(Ladder ladder) {
this.ladder = ladder;
}

public void play() {
System.out.print("Enter the start position: ");
startPosition = scanner.nextInt();

ladderRunner = new LadderRunner(ladder, startPosition);
int result = ladderRunner.run()+1;
System.out.println("Final position: " + result);
}

public static void main(String[] args) {
scanner = new Scanner(System.in);
LadderGame game = LadderGameFactory.createRandomLadderGame(5, 5);
game.play();
scanner.close();
}
}
7 changes: 7 additions & 0 deletions src/main/java/LadderGameFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
public class LadderGameFactory {
public static LadderGame createRandomLadderGame(int rows, int columns) {
LadderCreator creator = new RandomLadderCreator();
Ladder ladder = creator.createLine(rows, columns);
return new LadderGame(ladder);
}
}
16 changes: 16 additions & 0 deletions src/main/java/LadderPrinter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
public class LadderPrinter {

// 정적메소드 적용
public static void print(Ladder ladder, Player player) {
for (int i = 0; i < ladder.getHeight(); i++) {
for (int j = 0; j < ladder.getWidth(); j++) {
System.out.print(ladder.getRows(i, j));
if (player.getxPosition() == j && player.getyPosition() == i) {
System.out.print("*");
}
System.out.print(" ");
}
System.out.println();
}
}
}
54 changes: 54 additions & 0 deletions src/main/java/LadderRunner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
public class LadderRunner {

private final Ladder ladder;
private Player player;

public LadderRunner(Ladder ladder, int startPosition) {
this.ladder = ladder;
this.player = new Player(startPosition);
}

int run() {
while (true) {
printLadderState("Before");

// 오른쪽으로 가기
if (ladder.isLeftLine(player.getyPosition(), player.getxPosition())) {
player.right();
printLadderState("After");
player.down();
}
// 왼쪽으로 가기
else if (ladder.isRightLine(player.getyPosition(), player.getxPosition())) {
player.left();
printLadderState("After");
player.down();
}
// 그냥 아래로 가기
else {
player.down();
if (isGameOver()) {
printLadderState("Final");
break;
}
printLadderState("After");
}

if (isGameOver()) {
printLadderState("Final");
break;
}
}
return player.getxPosition();
}

private boolean isGameOver() {
return player.getyPosition() == ladder.getHeight() - 1;
}

private void printLadderState(String state) {
System.out.println(state);
LadderPrinter.print(ladder, player);
}
}

57 changes: 57 additions & 0 deletions src/main/java/Line.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
public class Line {
private int fromLine;
private int toLine;
private int t;
private int[][] rows;

public Line(int fromLine, int toLine, int currentRow, int[][] rows) {
sort(fromLine, toLine);
this.rows = rows;

if (validateFromLine(rows) && currentRow >= 0 && validateCurrentRow(currentRow, rows)) {
this.rows[currentRow][this.fromLine] = 1;
}
if (validateToLine(rows) && currentRow >= 0 && validateCurrentRow(currentRow, rows)) {
this.rows[currentRow][this.toLine] = - 1;
}
}

private static boolean validateCurrentRow(int currentRow, int[][] rows) {
if(currentRow < rows.length){
return true;
}
else{
throw new IllegalArgumentException(ExceptionMessage.INVALID_LINE_POSITION.getMessage());
}
}
Comment on lines +19 to +26
Copy link

Choose a reason for hiding this comment

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

else를 안쓰고 throw를 바로 써도 좋아요.

무조건 이렇게 써야하는거는 아니지만, 이런식으로 쓰면 편한 경우가 자주 있어서 알아두시면 좋아요. 👍

Suggested change
private static boolean validateCurrentRow(int currentRow, int[][] rows) {
if(currentRow < rows.length){
return true;
}
else{
throw new IllegalArgumentException(ExceptionMessage.INVALID_LINE_POSITION.getMessage());
}
}
private static boolean validateCurrentRow(int currentRow, int[][] rows) {
if(currentRow < rows.length){
return true;
}
throw new IllegalArgumentException(ExceptionMessage.INVALID_LINE_POSITION.getMessage());
}


private boolean validateToLine(int[][] rows) {
if(this.toLine >= 0 && this.toLine <= rows[0].length){
return true;
}
else{
throw new IllegalArgumentException(ExceptionMessage.INVALID_LINE_POSITION.getMessage());
}
}

private boolean validateFromLine(int[][] rows) {
if(this.fromLine >= 0 && this.fromLine <= rows[0].length){
return true;
}
else{
throw new IllegalArgumentException(ExceptionMessage.INVALID_LINE_POSITION.getMessage());
}
}

public void sort(int x, int y) {
this.fromLine = x;
this.toLine = y;

if (this.fromLine > this.toLine) {
this.t = y;
this.toLine = x;
this.fromLine = t;
}
}

}
Loading