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

1주차 미션 / 서버 2조 강상민 #20

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
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
13 changes: 13 additions & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import ladder.game.LadderGame;
import ladder.game.LadderGameFactory;
import type.NaturalNumber;
import type.Position;

public class Main {

public static void main(String[] args) {
LadderGame ladderGame = LadderGameFactory.createRandomLadderGame(new NaturalNumber(4), new NaturalNumber(3));
ladderGame.play(new Position(0));
}

}
27 changes: 0 additions & 27 deletions src/main/java/ladder/Ladder.java

This file was deleted.

60 changes: 0 additions & 60 deletions src/main/java/ladder/Row.java

This file was deleted.

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

import ladder.data.Row;

public interface LadderCreator {

Row[] createLadder();

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

import ladder.data.Row;
import type.NaturalNumber;
import type.Position;

public class RandomLadderCreator implements LadderCreator {

private Row[] rows;
NaturalNumber numberOfRows;
NaturalNumber numberOfPersons;

public RandomLadderCreator(NaturalNumber numberOfRows, NaturalNumber numberOfPersons) {
this.numberOfRows = numberOfRows;
this.numberOfPersons = numberOfPersons;
}

@Override
public Row[] createLadder() {
rows = new Row[numberOfRows.getValue()];

for(Position i = new Position(0); i.getPosition() < numberOfRows.getValue(); i.increase()) {
rows[i.getPosition()] = new Row(numberOfPersons);
}

int tmp = (int)(numberOfPersons.getValue() * numberOfRows.getValue() * 0.3);
while(tmp > 0) {
try {
tmp--;
int r = (int)(Math.random() * numberOfRows.getValue());
int p = (int)(Math.random() * numberOfPersons.getValue());
drawLine(new Position(r), new Position(p));
} catch(Exception e) {
tmp++;
}
}

return rows;
}

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

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

import ladder.data.Row;
import type.NaturalNumber;

public class SetUpLadderCreator implements LadderCreator {

NaturalNumber numberOfRows;
NaturalNumber numberOfPersons;

public SetUpLadderCreator(NaturalNumber numberOfRows, NaturalNumber numberOfPersons) {
this.numberOfRows = numberOfRows;
this.numberOfPersons = numberOfPersons;
}

@Override
public Row[] createLadder() {
return null;
}

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

import ladder.creator.LadderCreator;
import ladder.runner.LadderRunner;
import type.NaturalNumber;
import type.Position;

public class Ladder {

LadderRunner ladderRunner;

public Ladder(LadderCreator ladderCreator) {
ladderRunner = new LadderRunner(ladderCreator.createLadder());
}

public int run(Position position) {
return ladderRunner.run(position);
}

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

import type.Position;

public class LadderPosition {

private final Position x;
private final Position y;

public LadderPosition(int x, int y) {
try {
this.x = new Position(x);
this.y = new Position(y);
} catch (Exception e) {
throw new RuntimeException("Ladder position values is not correct.");
}
}

public void movePosition(int dx, int dy) {
x.movePosition(dx);
y.movePosition(dy);
}

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

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

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

import type.Direction;
import type.NaturalNumber;
import type.Node;
import type.Position;

public class Row {

private final int MIN_NUMBER_OF_PERSON = 1;
private Node[] row;

public Row(NaturalNumber numberOfPerson) {
validateNumberOfPerson(numberOfPerson.getValue());
row = new Node[numberOfPerson.getValue()];
for(Position i = new Position(0); i.getPosition() < row.length; i.increase()) {
row[i.getPosition()] = new Node(Direction.NO_DIRECTION);
}
}

public void drawLine(Position lineStartPosition) {
validateDrawLinePosition(lineStartPosition.getPosition());
row[lineStartPosition.getPosition()].setRight();
row[lineStartPosition.movePosition(Direction.RIGHT.get())].setLeft();
}

public Position nextPosition(Position position) {
validatePosition(position.getPosition());

if (isLeft(position)) {
position.movePosition(Direction.LEFT.get());
} else if (isRight(position)) {
position.movePosition(Direction.RIGHT.get());
}

return position;
}

private boolean isLeft(Position position) {
return row[position.getPosition()].isLeft();
}

private boolean isRight(Position position) {
return row[position.getPosition()].isRight();
}

private void validateNumberOfPerson(int numberOfPerson) {
if(numberOfPerson < MIN_NUMBER_OF_PERSON) {
throw new IllegalArgumentException("게임의 참여자 수는 1명 이상이어야 합니다.");
}
}

private void validateDrawLinePosition(int lineStartPosition) {
if(lineStartPosition < Position.MIN_POSITION ||
lineStartPosition >= row.length - 1 ||
row[lineStartPosition].isLeft() ||
row[lineStartPosition + 1].isRight() ||
row[lineStartPosition].isRight() ||
row[lineStartPosition + 1].isLeft()) {
throw new IllegalArgumentException("라인 생성이 불가능한 위치 입니다.");
}
}

private void validatePosition(int position) {
if(position >= row.length || position < Position.MIN_POSITION ) {
throw new IllegalArgumentException("유효하지 않은 위치 입니다.");
}
}

public void print(Position position) {
int i = 0;
for(Node node : row) {
if(node.isRight()) System.out.print(Direction.RIGHT.get());
else if(node.isLeft()) System.out.print(Direction.LEFT.get());
else System.out.print(Direction.NO_DIRECTION.get());

if(position != null && position.getPosition() == i) System.out.print("*");
System.out.print(" ");
i++;
}
}

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

import ladder.data.Ladder;
import ladder.creator.LadderCreator;
import type.Position;

public class LadderGame {
Ladder ladder;

public LadderGame(LadderCreator ladderCreator) {
ladder = new Ladder(ladderCreator);
}

public void play(Position position) {
ladder.run(position);
}

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

import ladder.creator.RandomLadderCreator;
import ladder.creator.SetUpLadderCreator;
import ladder.runner.LadderRunner;
import type.NaturalNumber;

public class LadderGameFactory {

public static LadderGame createRandomLadderGame(NaturalNumber numberOfRows, NaturalNumber numberOfPersons) {
return new LadderGame(new RandomLadderCreator(numberOfRows, numberOfPersons));
}

public static LadderGame createSetUpLadderGame(NaturalNumber numberOfRows, NaturalNumber numberOfPersons) {
return new LadderGame(new SetUpLadderCreator(numberOfRows, numberOfPersons));
}

}
Loading