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
3 changes: 2 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.

4 changes: 3 additions & 1 deletion src/main/java/ladder/GreaterThanOne.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package ladder;

import ladder.exception.ExceptionMessage;

public class GreaterThanOne {

private final int number;

public GreaterThanOne(int number) {
private GreaterThanOne(int number) {
validate(number);
this.number = number;
}
Expand Down
14 changes: 11 additions & 3 deletions src/main/java/ladder/LadderGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,21 @@ public class LadderGame {

private final LadderCreator ladderCreator;

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

public static LadderGame of(LadderCreator ladderCreator) {
return new LadderGame(ladderCreator);
}

public int run(Position position) {
LadderRunner ladderRunner = new LadderRunner(ladderCreator.getRows());
LadderRunner ladderRunner = LadderRunner.of(ladderCreator.getLadder());
ladderRunner.run(position);
return position.getValue();
return position.getCol();
}

public LadderCreator getLadderCreator() {
return ladderCreator;
}
}
19 changes: 19 additions & 0 deletions src/main/java/ladder/LadderGameFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ladder;

import ladder.creator.LadderAutoCreator;
import ladder.creator.LadderInputCreator;
import ladder.info.LadderSize;

public class LadderGameFactory {

public static LadderGame createRandomLadderGame(LadderSize ladderSize) {
LadderAutoCreator ladderAutoCreator = LadderAutoCreator.of(ladderSize);
return LadderGame.of(ladderAutoCreator);
}

public static LadderGame createInputLadderGame(LadderSize ladderSize) {
LadderInputCreator ladderInputCreator = LadderInputCreator.of(ladderSize);
return LadderGame.of(ladderInputCreator);
}

}
29 changes: 23 additions & 6 deletions src/main/java/ladder/LadderRunner.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,34 @@
package ladder;

import ladder.info.Ladder;
import ladder.print.LadderPrint;

import static ladder.print.PrintState.AFTER;
import static ladder.print.PrintState.BEFORE;

public class LadderRunner {

private final Row[] rows;
private final Ladder ladder;
private final LadderPrint ladderPrint ;

private LadderRunner(Ladder ladder) {
this.ladder = ladder;
this.ladderPrint = LadderPrint.of(ladder);
}

public LadderRunner(Row[] rows) {
this.rows = rows;
public static LadderRunner of(Ladder ladder){
return new LadderRunner(ladder);
}

public int run(Position position) {
for (int i = 0; i < rows.length; i++) {
rows[i].nextPosition(position);

for (int i = 0; i < ladder.getLadderSize().getRow(); i++) {

ladderPrint.printLadderState(position,BEFORE);
ladder.getRows()[i].nextPosition(position);
ladderPrint.printLadderState(position,AFTER);
ladder.getRows()[i].moveRow(position);
}
return position.getValue();
return position.getCol();
}
}
69 changes: 50 additions & 19 deletions src/main/java/ladder/Position.java
Original file line number Diff line number Diff line change
@@ -1,46 +1,77 @@
package ladder;

import static ladder.ExceptionMessage.INVALID_LADDER_POSITION;
import java.util.Objects;

import static ladder.exception.ExceptionMessage.INVALID_LADDER_POSITION;

public class Position {
private int position;

private Position(int position) {
this.position = position;
private int row;
private int col;


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

public int getValue() {
return position;
public int getCol() {
return col;
}

public static Position from(int position) {
validatePosition(position);
return new Position(position);
public int getRow() {
return row;
}

public static Position of(int row, int col) {
validatePosition(row, col);
return new Position(row,col);
}


public void prev() {
position--;
col--;
}

public void next() {
position++;
col++;
}

public boolean isSmallerThan(int position) {
return this.position < position;
public boolean isSmallerThan(int col) {
return this.col < col;
}

public boolean isBiggerThan(int position) {
return this.position > position;
public boolean isBiggerThan(int col) { return this.col > col; }

public boolean isCurrentPosition(int row, int col) {
return this.row == row && this.col == col;
}

private static void validatePosition(int position) {
if (!isPosition(position)) {

private static void validatePosition(int row, int col) {
if (!isPosition(row, col)) {
throw new IllegalArgumentException(INVALID_LADDER_POSITION.getMessage());
}
}

private static boolean isPosition(int position) {
return position >= 0;
private static boolean isPosition(int row, int col) {
return row >= 0 && col>=0 ;
}

public void UpdateRow() {
(this.row)++;
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Position position = (Position) obj;
return row == position.row && col == position.col;
}

@Override
public int hashCode() {
return Objects.hash(row, col);
}
}
84 changes: 84 additions & 0 deletions src/main/java/ladder/creator/LadderAutoCreator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package ladder.creator;

import ladder.exception.ExceptionMessage;
import ladder.info.Ladder;
import ladder.info.LadderSize;
import ladder.Position;

import java.util.HashSet;
import java.util.Random;

public class LadderAutoCreator implements LadderCreator {

private final Ladder ladder;

private LadderAutoCreator(LadderSize ladderSize) {
this.ladder = Ladder.create(ladderSize);
}

@Override
public void drawLine(Position position) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_LADDER_DRAW_AUTO.getMessage());
}

public void drawLine(LadderSize ladderSize) {

//자동생성 되는 사다리 좌표 값 수
//실제로 라인은 하나가 생성되지만 이 클래스에서는 사다리가 라인을 가지고 있는걸 1,-1 값으로 표현하기 때문에
int lineNum = getLineNum(ladderSize);

//중복 검증할 포지션 집합
HashSet<Position> set = new HashSet<>();

while(set.size()< lineNum){

Position[] startPosition = getRandomPosition(ladderSize);

//포함되어있지않다면 == 라인이 생성되어있지않다면(오른쪽 생성했을때)
//오른쪽에도 라인이 생성되어있다면 그릴수 없기때문에 오른쪽 위치도 같이 확인
if(!isDrawLine(startPosition,set)){

ladder.getRows()[startPosition[0].getRow()].drawLine(startPosition[0]);
set.add(Position.of(startPosition[0].getRow(),startPosition[0].getCol()-1)); //포지션이 객체라 col값이 올라가서 그전값으로 확인
set.add(startPosition[1]);
}
}

}
private boolean isDrawLine(Position[] startPosition,HashSet<Position> set){
return (set.contains(startPosition[0]) || set.contains(startPosition[1]));
}

private Position[] getRandomPosition(LadderSize ladderSize) {

Random random = new Random();

//사다리 범위내에서 랜덤생성
int randomRow = random.nextInt(ladderSize.getRow());
//사다리 생성로직이 오른쪽으로 선을 긋기때문에 맨 마지막 열에서는 사다리 라인생성 불가
int randomCol = random.nextInt(ladderSize.getCol()-1);

//사다리 자동생성 시작값
Position startPosition = Position.of(randomRow,randomCol);
//사다리가 자동생성되면 라인이 왼쪽에 그려지는 값
Position startPositionplus = Position.of(randomRow,randomCol+1);

return new Position[]{startPosition, startPositionplus};

}

private int getLineNum(LadderSize ladderSize) {
int lineNum = (int) Math.floor(ladderSize.getRow() * ladderSize.getCol() * 0.3) * 2 ;
return lineNum;
}

public static LadderAutoCreator of (LadderSize ladderSize) {
return new LadderAutoCreator(ladderSize);
}

@Override
public Ladder getLadder() {
return this.ladder;
}

}
26 changes: 7 additions & 19 deletions src/main/java/ladder/creator/LadderCreator.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,13 @@
package ladder.creator;

import ladder.GreaterThanOne;
import ladder.Position;
import ladder.Row;
import ladder.*;
import ladder.info.Ladder;
import ladder.info.LadderSize;

public class LadderCreator {
public interface LadderCreator {

private final Row[] rows;
void drawLine(Position position);
void drawLine(LadderSize ladderSize);
Ladder getLadder();

public LadderCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) {
rows = new Row[numberOfRow.getNumber()];
for (int i = 0; i < numberOfRow.getNumber(); i++) {
rows[i] = new Row(numberOfPerson);
}
}

public void drawLine(Position row, Position col) {
rows[row.getValue()].drawLine(col);
}

public Row[] getRows() {
return rows;
}
}
36 changes: 36 additions & 0 deletions src/main/java/ladder/creator/LadderInputCreator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package ladder.creator;

import ladder.exception.ExceptionMessage;
import ladder.info.Ladder;
import ladder.info.LadderSize;
import ladder.Position;

public class LadderInputCreator implements LadderCreator {

private final Ladder ladder;

private LadderInputCreator(LadderSize ladderSize) {
this.ladder = Ladder.create(ladderSize);
}

@Override
public void drawLine(Position position) {
ladder.getRows()[position.getRow()].drawLine(position);
}

@Override
public void drawLine(LadderSize ladderSize) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_LADDER_DRAW_INPUT.getMessage());
}

public static LadderInputCreator of(LadderSize ladderSize) {
return new LadderInputCreator(ladderSize);
}

@Override
public Ladder getLadder() {
return this.ladder;
}


}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package ladder;
package ladder.exception;

public enum ExceptionMessage {

INVALID_LADDER_POSITION("사다리 위치는 1이상 자연수입니다."),
INVALID_LADDER_NUMBER("사다리의 행과 열은 2 이상이어야 합니다."),
INVALID_POSITION("유효하지 않은 위치입니다."),
INVALID_DRAW_POSITION("사다리를 그릴 수 없는 위치입니다."),
INVALID_NATURAL_NUMBER("자연수가 아닙니다.");
INVALID_NATURAL_NUMBER("자연수가 아닙니다."),
INVALID_LADDER_DRAW_AUTO("선택하신 사다리는 자동사라디이므로 사다리의 선을 그릴수 없습니다."),
INVALID_LADDER_DRAW_INPUT("선택하신 사다리는 사용자입력사라디이므로 사다리의 선을 직접 그려야합니다.");

private final String message;

Expand Down
Loading