From f31039ae81ffafabfaae5ce717c1d90fd1593bea Mon Sep 17 00:00:00 2001 From: Rulu Date: Tue, 4 Mar 2025 18:13:14 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC?= =?UTF-8?q?=ED=83=80=EA=B8=B0=201=EB=8B=A8=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ladder.java | 26 +++++++++++++++++++++ src/main/java/domain/LadderGame.java | 10 ++++++++ src/main/java/domain/Line.java | 34 ++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 src/main/java/domain/Ladder.java create mode 100644 src/main/java/domain/LadderGame.java create mode 100644 src/main/java/domain/Line.java diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java new file mode 100644 index 00000000..98aa728c --- /dev/null +++ b/src/main/java/domain/Ladder.java @@ -0,0 +1,26 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class Ladder { + private final List lines; + + public Ladder(int height, int width) { + this.lines = createLadder(height, width); + } + + private List createLadder(int height, int width) { + List ladder = new ArrayList<>(); + for (int i = 0; i < height; i++) { + ladder.add(new Line(width)); + } + return ladder; + } + + public void print() { + for (Line line : lines) { + line.print(); + } + } +} diff --git a/src/main/java/domain/LadderGame.java b/src/main/java/domain/LadderGame.java new file mode 100644 index 00000000..f038a350 --- /dev/null +++ b/src/main/java/domain/LadderGame.java @@ -0,0 +1,10 @@ +package domain; + +public class LadderGame { + public static void main(String[] args) { + int height = 4; + int width = 4; + Ladder ladder = new Ladder(height, width); + ladder.print(); + } +} diff --git a/src/main/java/domain/Line.java b/src/main/java/domain/Line.java new file mode 100644 index 00000000..fa8aa045 --- /dev/null +++ b/src/main/java/domain/Line.java @@ -0,0 +1,34 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Line { + private final List points; + + public Line(int width) { + this.points = createPoints(width); + } + + private List createPoints(int width) { + List points = new ArrayList<>(); + Random random = new Random(); + boolean previous = false; + + for (int i = 0; i < width - 1; i++) { + boolean current = !previous && random.nextBoolean(); + points.add(current); + previous = current; + } + return points; + } + + public void print() { + StringBuilder builder = new StringBuilder("|"); + for (boolean point : points) { + builder.append(point ? "-----|" : " |"); + } + System.out.println(builder); + } +} From 4c87731cf2126130f3f344c81dc5e04329dec8ee Mon Sep 17 00:00:00 2001 From: Rulu Date: Wed, 5 Mar 2025 19:44:05 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=EC=82=AC=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EA=B2=B9=EC=B9=98=EB=8A=94=EA=B1=B0=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ladder.java | 6 +++++- src/main/java/domain/Line.java | 14 +++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index 98aa728c..f53b24ad 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -12,8 +12,12 @@ public Ladder(int height, int width) { private List createLadder(int height, int width) { List ladder = new ArrayList<>(); + Line previousLine = null; + for (int i = 0; i < height; i++) { - ladder.add(new Line(width)); + Line currentLine = new Line(width, previousLine); + ladder.add(currentLine); + previousLine = currentLine; } return ladder; } diff --git a/src/main/java/domain/Line.java b/src/main/java/domain/Line.java index fa8aa045..a6739804 100644 --- a/src/main/java/domain/Line.java +++ b/src/main/java/domain/Line.java @@ -7,23 +7,31 @@ public class Line { private final List points; - public Line(int width) { - this.points = createPoints(width); + public Line(int width, Line previousLine) { + this.points = createPoints(width, previousLine); } - private List createPoints(int width) { + private List createPoints(int width, Line previousLine) { List points = new ArrayList<>(); Random random = new Random(); boolean previous = false; + List previousPoints = previousLine != null ? previousLine.getPoints() : null; for (int i = 0; i < width - 1; i++) { boolean current = !previous && random.nextBoolean(); + if (previousPoints != null && previousPoints.get(i)) { + current = false; + } points.add(current); previous = current; } return points; } + public List getPoints() { + return points; + } + public void print() { StringBuilder builder = new StringBuilder("|"); for (boolean point : points) { From b0f5a30d563b4e88aca4151913bb1e824327c8eb Mon Sep 17 00:00:00 2001 From: Rulu Date: Wed, 5 Mar 2025 19:59:16 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20step2=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LadderController.java | 18 +++++++ src/main/java/domain/Bridge.java | 20 +++++++ src/main/java/domain/Ladder.java | 25 ++++----- src/main/java/domain/LadderGame.java | 10 ---- src/main/java/domain/LadderHeight.java | 16 ++++++ src/main/java/domain/LadderWidth.java | 16 ++++++ src/main/java/domain/Line.java | 53 +++++++++++-------- src/main/java/domain/Lines.java | 17 ++++++ src/main/java/view/InputView.java | 25 +++++++++ src/main/java/view/OutputView.java | 9 ++++ 10 files changed, 164 insertions(+), 45 deletions(-) create mode 100644 src/main/java/controller/LadderController.java create mode 100644 src/main/java/domain/Bridge.java delete mode 100644 src/main/java/domain/LadderGame.java create mode 100644 src/main/java/domain/LadderHeight.java create mode 100644 src/main/java/domain/LadderWidth.java create mode 100644 src/main/java/domain/Lines.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java new file mode 100644 index 00000000..4700f834 --- /dev/null +++ b/src/main/java/controller/LadderController.java @@ -0,0 +1,18 @@ +package controller; + +import domain.Ladder; +import domain.LadderHeight; +import domain.LadderWidth; +import view.InputView; +import view.OutputView; + +public class LadderController { + public static void main(String[] args) { + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + LadderWidth width = inputView.askWidth(); + LadderHeight height = inputView.askHeight(); + Ladder ladder = new Ladder(height, width); + outputView.printLadder(ladder); + } +} diff --git a/src/main/java/domain/Bridge.java b/src/main/java/domain/Bridge.java new file mode 100644 index 00000000..3f1c089e --- /dev/null +++ b/src/main/java/domain/Bridge.java @@ -0,0 +1,20 @@ +package domain; + +public enum Bridge { + CONNECTED, + NOT_CONNECTED; + + public String display() { + if (this == CONNECTED) { + return "-----"; + } + return " "; + } + + public static Bridge fromBoolean(boolean connected) { + if (connected) { + return CONNECTED; + } + return NOT_CONNECTED; + } +} diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index f53b24ad..0b8a0228 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -4,27 +4,24 @@ import java.util.List; public class Ladder { - private final List lines; + private final Lines lines; - public Ladder(int height, int width) { - this.lines = createLadder(height, width); + public Ladder(LadderHeight height, LadderWidth width) { + this.lines = new Lines(createLines(height, width)); } - private List createLadder(int height, int width) { - List ladder = new ArrayList<>(); + private List createLines(LadderHeight height, LadderWidth width) { + List list = new ArrayList<>(); Line previousLine = null; - - for (int i = 0; i < height; i++) { - Line currentLine = new Line(width, previousLine); - ladder.add(currentLine); - previousLine = currentLine; + for (int i = 0; i < height.getValue(); i++) { + Line current = new Line(width, previousLine); + list.add(current); + previousLine = current; } - return ladder; + return list; } public void print() { - for (Line line : lines) { - line.print(); - } + lines.print(); } } diff --git a/src/main/java/domain/LadderGame.java b/src/main/java/domain/LadderGame.java deleted file mode 100644 index f038a350..00000000 --- a/src/main/java/domain/LadderGame.java +++ /dev/null @@ -1,10 +0,0 @@ -package domain; - -public class LadderGame { - public static void main(String[] args) { - int height = 4; - int width = 4; - Ladder ladder = new Ladder(height, width); - ladder.print(); - } -} diff --git a/src/main/java/domain/LadderHeight.java b/src/main/java/domain/LadderHeight.java new file mode 100644 index 00000000..dc7cfa36 --- /dev/null +++ b/src/main/java/domain/LadderHeight.java @@ -0,0 +1,16 @@ +package domain; + +public class LadderHeight { + private final int value; + + public LadderHeight(int value) { + if (value < 1) { + throw new IllegalArgumentException("사다리의 높이는 1 이상이어야 합니다."); + } + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/domain/LadderWidth.java b/src/main/java/domain/LadderWidth.java new file mode 100644 index 00000000..f427fc5a --- /dev/null +++ b/src/main/java/domain/LadderWidth.java @@ -0,0 +1,16 @@ +package domain; + +public class LadderWidth { + private final int value; + + public LadderWidth(int value) { + if (value < 2) { + throw new IllegalArgumentException("사다리의 넓이는 2 이상이어야 합니다."); + } + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/domain/Line.java b/src/main/java/domain/Line.java index a6739804..30f3551a 100644 --- a/src/main/java/domain/Line.java +++ b/src/main/java/domain/Line.java @@ -5,38 +5,49 @@ import java.util.Random; public class Line { - private final List points; + private final List bridges; - public Line(int width, Line previousLine) { - this.points = createPoints(width, previousLine); + public Line(LadderWidth ladderWidth, Line previousLine) { + this.bridges = createBridges(ladderWidth, previousLine); } - private List createPoints(int width, Line previousLine) { - List points = new ArrayList<>(); + private List createBridges(LadderWidth ladderWidth, Line previousLine) { + List list = new ArrayList<>(); Random random = new Random(); - boolean previous = false; - List previousPoints = previousLine != null ? previousLine.getPoints() : null; + boolean previousConnected = false; + List previousBridges = null; + if (previousLine != null) { + previousBridges = previousLine.getBridges(); + } + for (int i = 0; i < ladderWidth.getValue() - 1; i++) { + boolean connected = determineConnection(previousConnected, random, previousBridges, i); + list.add(Bridge.fromBoolean(connected)); + previousConnected = connected; + } + return list; + } - for (int i = 0; i < width - 1; i++) { - boolean current = !previous && random.nextBoolean(); - if (previousPoints != null && previousPoints.get(i)) { - current = false; - } - points.add(current); - previous = current; + private boolean determineConnection(boolean previousConnected, Random random, List previousBridges, int index) { + if (previousConnected) { + return false; + } + if (previousBridges != null && previousBridges.get(index) == Bridge.CONNECTED) { + return false; } - return points; + return random.nextBoolean(); } - public List getPoints() { - return points; + public List getBridges() { + return bridges; } public void print() { - StringBuilder builder = new StringBuilder("|"); - for (boolean point : points) { - builder.append(point ? "-----|" : " |"); + StringBuilder builder = new StringBuilder(); + builder.append("|"); + for (Bridge bridge : bridges) { + builder.append(bridge.display()); + builder.append("|"); } - System.out.println(builder); + System.out.println(builder.toString()); } } diff --git a/src/main/java/domain/Lines.java b/src/main/java/domain/Lines.java new file mode 100644 index 00000000..079ccd85 --- /dev/null +++ b/src/main/java/domain/Lines.java @@ -0,0 +1,17 @@ +package domain; + +import java.util.List; + +public class Lines { + private final List lines; + + public Lines(List lines) { + this.lines = lines; + } + + public void print() { + for (Line line : lines) { + line.print(); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..666cd4f5 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,25 @@ +package view; + +import domain.LadderHeight; +import domain.LadderWidth; +import java.util.Scanner; + +public class InputView { + private final Scanner scanner; + + public InputView() { + scanner = new Scanner(System.in); + } + + public LadderWidth askWidth() { + System.out.println("사다리의 넓이는 몇 개인가요?"); + int input = Integer.parseInt(scanner.nextLine()); + return new LadderWidth(input); + } + + public LadderHeight askHeight() { + System.out.println("사다리의 높이는 몇 개인가요?"); + int input = Integer.parseInt(scanner.nextLine()); + return new LadderHeight(input); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..32e1b75e --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,9 @@ +package view; + +import domain.Ladder; + +public class OutputView { + public void printLadder(Ladder ladder) { + ladder.print(); + } +} From 8cef544d633fa22700369e3f6a8583bebf11dbcc Mon Sep 17 00:00:00 2001 From: Rulu Date: Wed, 5 Mar 2025 20:24:53 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20step3=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LadderController.java | 3 +++ src/main/java/domain/Ladder.java | 9 +++++++ src/main/java/domain/LadderResult.java | 15 ++++++++++++ src/main/java/domain/Line.java | 23 +++++++++++++++++- src/main/java/domain/Lines.java | 15 ++++++++++++ src/main/java/domain/Position.java | 24 +++++++++++++++++++ src/main/java/view/OutputView.java | 10 ++++++++ 7 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 src/main/java/domain/LadderResult.java create mode 100644 src/main/java/domain/Position.java diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 4700f834..47e0172b 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -3,6 +3,7 @@ import domain.Ladder; import domain.LadderHeight; import domain.LadderWidth; +import domain.LadderResult; import view.InputView; import view.OutputView; @@ -14,5 +15,7 @@ public static void main(String[] args) { LadderHeight height = inputView.askHeight(); Ladder ladder = new Ladder(height, width); outputView.printLadder(ladder); + LadderResult result = ladder.play(); + outputView.printResult(result); } } diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index 0b8a0228..37e07f82 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -24,4 +24,13 @@ private List createLines(LadderHeight height, LadderWidth width) { public void print() { lines.print(); } + + public LadderResult play() { + int columnCount = lines.getColumnCount(); + List results = new ArrayList<>(); + for (int i = 0; i < columnCount; i++) { + results.add(lines.moveAll(new Position(i))); + } + return new LadderResult(results); + } } diff --git a/src/main/java/domain/LadderResult.java b/src/main/java/domain/LadderResult.java new file mode 100644 index 00000000..541d0732 --- /dev/null +++ b/src/main/java/domain/LadderResult.java @@ -0,0 +1,15 @@ +package domain; + +import java.util.List; + +public class LadderResult { + private final List positions; + + public LadderResult(List positions) { + this.positions = positions; + } + + public List getPositions() { + return positions; + } +} diff --git a/src/main/java/domain/Line.java b/src/main/java/domain/Line.java index 30f3551a..0523dd07 100644 --- a/src/main/java/domain/Line.java +++ b/src/main/java/domain/Line.java @@ -27,7 +27,8 @@ private List createBridges(LadderWidth ladderWidth, Line previousLine) { return list; } - private boolean determineConnection(boolean previousConnected, Random random, List previousBridges, int index) { + private boolean determineConnection(boolean previousConnected, Random random, + List previousBridges, int index) { if (previousConnected) { return false; } @@ -50,4 +51,24 @@ public void print() { } System.out.println(builder.toString()); } + + public Position move(Position position) { + int current = position.getValue(); + if (canMoveLeft(current)) { + return new Position(current - 1); + } + if (canMoveRight(current)) { + return new Position(current + 1); + } + return position; + } + + private boolean canMoveLeft(int current) { + return current > 0 && bridges.get(current - 1) == Bridge.CONNECTED; + } + + private boolean canMoveRight(int current) { + int columnCount = bridges.size() + 1; + return current < columnCount - 1 && bridges.get(current) == Bridge.CONNECTED; + } } diff --git a/src/main/java/domain/Lines.java b/src/main/java/domain/Lines.java index 079ccd85..ee310cf5 100644 --- a/src/main/java/domain/Lines.java +++ b/src/main/java/domain/Lines.java @@ -14,4 +14,19 @@ public void print() { line.print(); } } + + public Position moveAll(Position position) { + Position result = position; + for (Line line : lines) { + result = line.move(result); + } + return result; + } + + public int getColumnCount() { + if (lines.isEmpty()) { + return 0; + } + return lines.get(0).getBridges().size() + 1; + } } diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java new file mode 100644 index 00000000..b7654ccc --- /dev/null +++ b/src/main/java/domain/Position.java @@ -0,0 +1,24 @@ +package domain; + +public class Position { + private final int value; + + public Position(int value) { + if (value < 0) { + throw new IllegalArgumentException("Position은 음수일 수 없습니다."); + } + this.value = value; + } + + public int getValue() { + return value; + } + + public Position moveLeft() { + return new Position(value - 1); + } + + public Position moveRight() { + return new Position(value + 1); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 32e1b75e..559d1a04 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,9 +1,19 @@ package view; import domain.Ladder; +import domain.LadderResult; +import domain.Position; +import java.util.List; public class OutputView { public void printLadder(Ladder ladder) { ladder.print(); } + + public void printResult(LadderResult result) { + List positions = result.getPositions(); + for (int i = 0; i < positions.size(); i++) { + System.out.println(i + " -> " + positions.get(i).getValue()); + } + } } From b36d0387e754ee946fbe0a095ae0518ee67e71b3 Mon Sep 17 00:00:00 2001 From: Rulu Date: Wed, 5 Mar 2025 20:39:52 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20step4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LadderController.java | 22 +++++-- src/main/java/domain/GameResult.java | 24 ++++++++ src/main/java/domain/Ladder.java | 10 +-- src/main/java/domain/LadderGame.java | 43 +++++++++++++ src/main/java/domain/Line.java | 4 +- src/main/java/domain/Lines.java | 11 +++- src/main/java/domain/Name.java | 16 +++++ src/main/java/domain/Player.java | 13 ++++ src/main/java/domain/Players.java | 19 ++++++ src/main/java/domain/Prize.java | 13 ++++ src/main/java/domain/Prizes.java | 22 +++++++ src/main/java/domain/Result.java | 19 ++++++ src/main/java/view/InputView.java | 37 +++++++++-- src/main/java/view/OutputView.java | 61 ++++++++++++++++--- 14 files changed, 284 insertions(+), 30 deletions(-) create mode 100644 src/main/java/domain/GameResult.java create mode 100644 src/main/java/domain/LadderGame.java create mode 100644 src/main/java/domain/Name.java create mode 100644 src/main/java/domain/Player.java create mode 100644 src/main/java/domain/Players.java create mode 100644 src/main/java/domain/Prize.java create mode 100644 src/main/java/domain/Prizes.java create mode 100644 src/main/java/domain/Result.java diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java index 47e0172b..89d152a0 100644 --- a/src/main/java/controller/LadderController.java +++ b/src/main/java/controller/LadderController.java @@ -1,9 +1,12 @@ package controller; import domain.Ladder; +import domain.LadderGame; import domain.LadderHeight; import domain.LadderWidth; -import domain.LadderResult; +import domain.Players; +import domain.Prizes; +import domain.GameResult; import view.InputView; import view.OutputView; @@ -11,11 +14,18 @@ public class LadderController { public static void main(String[] args) { InputView inputView = new InputView(); OutputView outputView = new OutputView(); - LadderWidth width = inputView.askWidth(); + Players players = inputView.askPlayers(); + Prizes prizes = inputView.askPrizes(); LadderHeight height = inputView.askHeight(); - Ladder ladder = new Ladder(height, width); - outputView.printLadder(ladder); - LadderResult result = ladder.play(); - outputView.printResult(result); + LadderWidth width = new LadderWidth(players.size()); + LadderGame ladderGame = new LadderGame(players, prizes, new Ladder(height, width)); + outputView.printLadderGameBoard(ladderGame); + GameResult gameResult = ladderGame.play(); + String query = inputView.askResultName(); + if (query.equals("all")) { + outputView.printResultAll(gameResult); + return; + } + outputView.printResultSingle(gameResult.getResultByPlayerName(query).getPrize()); } } diff --git a/src/main/java/domain/GameResult.java b/src/main/java/domain/GameResult.java new file mode 100644 index 00000000..512c6f84 --- /dev/null +++ b/src/main/java/domain/GameResult.java @@ -0,0 +1,24 @@ +package domain; + +import java.util.List; + +public class GameResult { + private final List results; + + public GameResult(List results) { + this.results = results; + } + + public List getResults() { + return results; + } + + public Result getResultByPlayerName(String name) { + for (Result result : results) { + if (result.getPlayerName().equals(name)) { + return result; + } + } + throw new IllegalArgumentException("해당 이름이 없습니다."); + } +} diff --git a/src/main/java/domain/Ladder.java b/src/main/java/domain/Ladder.java index 37e07f82..156a41a8 100644 --- a/src/main/java/domain/Ladder.java +++ b/src/main/java/domain/Ladder.java @@ -21,16 +21,16 @@ private List createLines(LadderHeight height, LadderWidth width) { return list; } - public void print() { - lines.print(); + public List getLadderBody() { + return lines.drawAll(); } public LadderResult play() { int columnCount = lines.getColumnCount(); - List results = new ArrayList<>(); + List positions = new ArrayList<>(); for (int i = 0; i < columnCount; i++) { - results.add(lines.moveAll(new Position(i))); + positions.add(lines.moveAll(new Position(i))); } - return new LadderResult(results); + return new LadderResult(positions); } } diff --git a/src/main/java/domain/LadderGame.java b/src/main/java/domain/LadderGame.java new file mode 100644 index 00000000..a09ab630 --- /dev/null +++ b/src/main/java/domain/LadderGame.java @@ -0,0 +1,43 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class LadderGame { + private final Players players; + private final Prizes prizes; + private final Ladder ladder; + + public LadderGame(Players players, Prizes prizes, Ladder ladder) { + if (players.size() != prizes.getPrizes().size()) { + throw new IllegalArgumentException("참여자 수와 결과 수가 일치해야 합니다."); + } + this.players = players; + this.prizes = prizes; + this.ladder = ladder; + } + + public GameResult play() { + LadderResult ladderResult = ladder.play(); + List results = new ArrayList<>(); + for (int i = 0; i < players.size(); i++) { + int finalIndex = ladderResult.getPositions().get(i).getValue(); + String playerName = players.getPlayers().get(i).getName().getValue(); + String prize = prizes.getPrizeAt(finalIndex).getValue(); + results.add(new Result(playerName, prize)); + } + return new GameResult(results); + } + + public Ladder getLadder() { + return ladder; + } + + public Players getPlayers() { + return players; + } + + public Prizes getPrizes() { + return prizes; + } +} diff --git a/src/main/java/domain/Line.java b/src/main/java/domain/Line.java index 0523dd07..c520d66a 100644 --- a/src/main/java/domain/Line.java +++ b/src/main/java/domain/Line.java @@ -42,14 +42,14 @@ public List getBridges() { return bridges; } - public void print() { + public String draw() { StringBuilder builder = new StringBuilder(); builder.append("|"); for (Bridge bridge : bridges) { builder.append(bridge.display()); builder.append("|"); } - System.out.println(builder.toString()); + return builder.toString(); } public Position move(Position position) { diff --git a/src/main/java/domain/Lines.java b/src/main/java/domain/Lines.java index ee310cf5..dd262dae 100644 --- a/src/main/java/domain/Lines.java +++ b/src/main/java/domain/Lines.java @@ -1,5 +1,6 @@ package domain; +import java.util.ArrayList; import java.util.List; public class Lines { @@ -9,10 +10,16 @@ public Lines(List lines) { this.lines = lines; } - public void print() { + public List getLines() { + return lines; + } + + public List drawAll() { + List drawn = new ArrayList<>(); for (Line line : lines) { - line.print(); + drawn.add(line.draw()); } + return drawn; } public Position moveAll(Position position) { diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/Name.java new file mode 100644 index 00000000..c273ce75 --- /dev/null +++ b/src/main/java/domain/Name.java @@ -0,0 +1,16 @@ +package domain; + +public class Name { + private final String value; + + public Name(String value) { + if (value.length() > 5) { + throw new IllegalArgumentException("이름은 최대 5글자여야 합니다."); + } + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java new file mode 100644 index 00000000..5531920f --- /dev/null +++ b/src/main/java/domain/Player.java @@ -0,0 +1,13 @@ +package domain; + +public class Player { + private final Name name; + + public Player(Name name) { + this.name = name; + } + + public Name getName() { + return name; + } +} diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java new file mode 100644 index 00000000..283f8eb8 --- /dev/null +++ b/src/main/java/domain/Players.java @@ -0,0 +1,19 @@ +package domain; + +import java.util.List; + +public class Players { + private final List players; + + public Players(List players) { + this.players = players; + } + + public List getPlayers() { + return players; + } + + public int size() { + return players.size(); + } +} diff --git a/src/main/java/domain/Prize.java b/src/main/java/domain/Prize.java new file mode 100644 index 00000000..713d6dd1 --- /dev/null +++ b/src/main/java/domain/Prize.java @@ -0,0 +1,13 @@ +package domain; + +public class Prize { + private final String value; + + public Prize(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/domain/Prizes.java b/src/main/java/domain/Prizes.java new file mode 100644 index 00000000..8c413d1e --- /dev/null +++ b/src/main/java/domain/Prizes.java @@ -0,0 +1,22 @@ +package domain; + +import java.util.List; + +public class Prizes { + private final List prizes; + + public Prizes(List prizes) { + if (prizes == null || prizes.isEmpty()) { + throw new IllegalArgumentException("결과는 비어 있을 수 없습니다."); + } + this.prizes = prizes; + } + + public Prize getPrizeAt(int index) { + return prizes.get(index); + } + + public List getPrizes() { + return prizes; + } +} diff --git a/src/main/java/domain/Result.java b/src/main/java/domain/Result.java new file mode 100644 index 00000000..187e486c --- /dev/null +++ b/src/main/java/domain/Result.java @@ -0,0 +1,19 @@ +package domain; + +public class Result { + private final String playerName; + private final String prize; + + public Result(String playerName, String prize) { + this.playerName = playerName; + this.prize = prize; + } + + public String getPlayerName() { + return playerName; + } + + public String getPrize() { + return prize; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 666cd4f5..2ddae907 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,7 +1,13 @@ package view; import domain.LadderHeight; -import domain.LadderWidth; +import domain.Name; +import domain.Player; +import domain.Players; +import domain.Prize; +import domain.Prizes; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class InputView { @@ -11,15 +17,34 @@ public InputView() { scanner = new Scanner(System.in); } - public LadderWidth askWidth() { - System.out.println("사다리의 넓이는 몇 개인가요?"); - int input = Integer.parseInt(scanner.nextLine()); - return new LadderWidth(input); + public Players askPlayers() { + System.out.println("참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"); + String input = scanner.nextLine(); + List list = new ArrayList<>(); + for (String name : input.split(",")) { + list.add(new Player(new Name(name.trim()))); + } + return new Players(list); + } + + public Prizes askPrizes() { + System.out.println("실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"); + String input = scanner.nextLine(); + List list = new ArrayList<>(); + for (String prize : input.split(",")) { + list.add(new Prize(prize.trim())); + } + return new Prizes(list); } public LadderHeight askHeight() { - System.out.println("사다리의 높이는 몇 개인가요?"); + System.out.println("최대 사다리 높이는 몇 개인가요?"); int input = Integer.parseInt(scanner.nextLine()); return new LadderHeight(input); } + + public String askResultName() { + System.out.println("결과를 보고 싶은 사람은?"); + return scanner.nextLine().trim(); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 559d1a04..2df70256 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,19 +1,62 @@ package view; -import domain.Ladder; -import domain.LadderResult; -import domain.Position; +import domain.GameResult; +import domain.LadderGame; +import domain.Player; +import domain.Players; +import domain.Prize; +import domain.Prizes; +import domain.Result; import java.util.List; public class OutputView { - public void printLadder(Ladder ladder) { - ladder.print(); + private static final int CELL_WIDTH = 6; + + public void printLadderGameBoard(LadderGame ladderGame) { + printHeader(ladderGame.getPlayers()); + printLadder(ladderGame.getLadder()); + printBottom(ladderGame.getPrizes()); + } + + private void printHeader(Players players) { + StringBuilder builder = new StringBuilder(); + for (Player player : players.getPlayers()) { + builder.append(pad(player.getName().getValue())); + } + System.out.println(builder.toString()); + } + + private void printLadder(domain.Ladder ladder) { + List lines = ladder.getLadderBody(); + for (String line : lines) { + System.out.println(line); + } + } + + private void printBottom(Prizes prizes) { + StringBuilder builder = new StringBuilder(); + for (Prize prize : prizes.getPrizes()) { + builder.append(pad(prize.getValue())); + } + System.out.println(builder.toString()); + } + + private String pad(String text) { + StringBuilder builder = new StringBuilder(text); + while (builder.length() < CELL_WIDTH) { + builder.append(" "); + } + return builder.toString(); + } + + public void printResultSingle(String result) { + System.out.println("실행 결과"); + System.out.println(result); } - public void printResult(LadderResult result) { - List positions = result.getPositions(); - for (int i = 0; i < positions.size(); i++) { - System.out.println(i + " -> " + positions.get(i).getValue()); + public void printResultAll(GameResult gameResult) { + for (Result result : gameResult.getResults()) { + System.out.println(result.getPlayerName() + " : " + result.getPrize()); } } }