diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 697d2907..0b36522c 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,15 +1,9 @@ -import java.util.List; -import view.InputView; -import controller.LadderGameController; +import controller.LadderController; public class Main { public static void main(String[] args) { - List names = InputView.getPlayerNames(); - List results = InputView.getResults(); - int height = InputView.getLadderHeight(); - - LadderGameController game = new LadderGameController(names, results, height); - game.play(); + LadderController ladderGameController = new LadderController(); + ladderGameController.start(); } -} \ No newline at end of file +} diff --git a/src/main/java/controller/LadderController.java b/src/main/java/controller/LadderController.java new file mode 100644 index 00000000..b92dadca --- /dev/null +++ b/src/main/java/controller/LadderController.java @@ -0,0 +1,61 @@ +package controller; + +import java.util.*; + +import exception.ErrorMessage; +import model.*; +import view.*; + +public class LadderController { + + private Players players; + private List results; + private Ladder ladder; + private LadderResult ladderResult; + + public void start() { + List names = InputView.getPlayerNames(); + List results = InputView.getResults(); + int height = InputView.getLadderHeight(); + + players = createPlayers(names); + this.results = results; + ladder = new Ladder(players.size(), height); + + play(); + } + + private Players createPlayers(List names) { + List players = new ArrayList<>(); + for (String name : names) { + players.add(new Player(name)); + } + return new Players(players); + } + + public void play() { + ResultView.printLadder(players, ladder.getLines(), results); + + this.ladderResult = ladder.run(players, results); + + showResults(); + } + + private void showResults() { + while (true) { + String query = InputView.getQuery(); + + if (query.equals("all")) { + ResultView.printAllResults(ladderResult.getAllResults()); + break; + } + + if (ladderResult.getAllResults().containsKey(query)) { + ResultView.printResult(query, ladderResult.getResult(query)); + } + else { + System.out.println(ErrorMessage.NOT_EXIST_NAME); + } + } + } +} diff --git a/src/main/java/exception/ErrorMessage.java b/src/main/java/exception/ErrorMessage.java new file mode 100644 index 00000000..b2313866 --- /dev/null +++ b/src/main/java/exception/ErrorMessage.java @@ -0,0 +1,6 @@ +package exception; + +public class ErrorMessage { + public static final String LIMIT_NAME_LENGTH = "이름은 최대 5글자까지 가능합니다."; + public static final String NOT_EXIST_NAME = "존재하지 않는 이름입니다. 다시 입력해주세요."; +} diff --git a/src/main/java/model/Ladder.java b/src/main/java/model/Ladder.java index e049c9f9..f3f1fe69 100644 --- a/src/main/java/model/Ladder.java +++ b/src/main/java/model/Ladder.java @@ -3,20 +3,23 @@ import java.util.*; public class Ladder { + private final List lines; public Ladder(int playerCount, int height) { lines = new ArrayList<>(); + for (int i = 0; i < height; i++) { lines.add(new Line(playerCount)); } } - public LadderResult run(List players, List results) { + public LadderResult run(Players players, List results) { Map resultMap = new HashMap<>(); + for (int i = 0; i < players.size(); i++) { int finalPosition = move(i); - resultMap.put(players.get(i).getName(), results.get(finalPosition)); + resultMap.put(players.getPlayersList().get(i).getName(), results.get(finalPosition)); } return new LadderResult(resultMap); } diff --git a/src/main/java/model/LadderResult.java b/src/main/java/model/LadderResult.java index dda2fa8d..8bf30cd6 100644 --- a/src/main/java/model/LadderResult.java +++ b/src/main/java/model/LadderResult.java @@ -3,6 +3,7 @@ import java.util.*; public class LadderResult { + private final Map results; public LadderResult(Map results) { @@ -16,4 +17,4 @@ public String getResult(String name) { public Map getAllResults() { return results; } -} \ No newline at end of file +} diff --git a/src/main/java/model/Line.java b/src/main/java/model/Line.java index 455cfc5b..7ffdf729 100644 --- a/src/main/java/model/Line.java +++ b/src/main/java/model/Line.java @@ -3,6 +3,7 @@ import java.util.*; public class Line { + private final List points; public Line(int count) { @@ -12,6 +13,7 @@ public Line(int count) { private void generateRandomLadder() { Random random = new Random(); + for (int i = 0; i < points.size() - 1; i++) { if (!points.get(i) && (i == 0 || !points.get(i - 1))) { points.set(i, random.nextBoolean()); @@ -33,4 +35,3 @@ public List getPoints() { return points; } } - diff --git a/src/main/java/model/Player.java b/src/main/java/model/Player.java index 741a75df..1c243ea4 100644 --- a/src/main/java/model/Player.java +++ b/src/main/java/model/Player.java @@ -1,11 +1,15 @@ package model; +import exception.ErrorMessage; + public class Player { + private final String name; + private static final int MAX_NAME_LENGTH = 5; public Player(String name) { - if (name.length() > 5) { - throw new IllegalArgumentException("이름은 최대 5글자까지 가능합니다."); + if (name.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException(ErrorMessage.LIMIT_NAME_LENGTH); } this.name = name; } @@ -13,4 +17,4 @@ public Player(String name) { public String getName() { return name; } -} \ No newline at end of file +} diff --git a/src/main/java/model/Players.java b/src/main/java/model/Players.java new file mode 100644 index 00000000..c3a03029 --- /dev/null +++ b/src/main/java/model/Players.java @@ -0,0 +1,19 @@ +package model; + +import java.util.List; + +public class Players { + private final List playersList; + + public Players(List playersList) { + this.playersList = playersList; + } + + public int size(){ + return playersList.size(); + } + + public List getPlayersList() { + return playersList; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index e3374702..d74b31c1 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -3,6 +3,7 @@ import java.util.*; public class InputView { + private static final Scanner scanner = new Scanner(System.in); public static List getPlayerNames() { diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java new file mode 100644 index 00000000..e107ec21 --- /dev/null +++ b/src/main/java/view/ResultView.java @@ -0,0 +1,44 @@ +package view; + +import model.Line; +import model.Player; +import model.Players; + +import java.util.*; + +public class ResultView { + + public static void printLadder(Players players, List lines, List results) { + for (Player player : players.getPlayersList()) { + System.out.printf("%6s", player.getName()); + } + System.out.println(); + + for (Line line : lines) { + printLine(line); + } + + for (String result : results) { + System.out.printf("%6s", result); + } + System.out.println(); + } + + private static void printLine(Line line) { + System.out.print(" "); + for (boolean point : line.getPoints()) { + System.out.print(point ? " |-----" : " | "); + } + System.out.println(" |"); + } + + public static void printResult(String name, String result) { + System.out.println("실행 결과"); + System.out.println(name + " : " + result); + } + + public static void printAllResults(Map results) { + System.out.println("실행 결과"); + results.forEach((name, result) -> System.out.println(name + " : " + result)); + } +} diff --git a/src/test/java/model/LadderResultTest.java b/src/test/java/model/LadderResultTest.java new file mode 100644 index 00000000..96e8b153 --- /dev/null +++ b/src/test/java/model/LadderResultTest.java @@ -0,0 +1,19 @@ +package model; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Map; + +class LadderResultTest { + + @Test + void 특정_플레이어_결과_조회() { + Map results = Map.of("Neo", "꽝", "Tommy", "5000", "Brie", "꽝"); + LadderResult ladderResult = new LadderResult(results); + + assertEquals("5000", ladderResult.getResult("Tommy")); + assertEquals("꽝", ladderResult.getResult("Neo")); + } +} diff --git a/src/test/java/model/LadderTest.java b/src/test/java/model/LadderTest.java new file mode 100644 index 00000000..4f76b409 --- /dev/null +++ b/src/test/java/model/LadderTest.java @@ -0,0 +1,29 @@ +package model; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; +import java.util.Map; + + +class LadderTest { + + @Test + void 사다리_게임_결과_확인() { + Players players = new Players(List.of(new Player("Neo"), new Player("Tommy"), new Player("Brie"))); + List results = List.of("1000", "꽝", "3000"); + + Ladder ladder = new Ladder(players.size(), 5); + LadderResult ladderResult = ladder.run(players, results); + + Map resultMap = ladderResult.getAllResults(); + + assertEquals(3, resultMap.size()); + assertTrue(resultMap.containsKey("Neo")); + assertTrue(resultMap.containsKey("Tommy")); + assertTrue(resultMap.containsKey("Brie")); + } +} diff --git a/src/test/java/model/LineTest.java b/src/test/java/model/LineTest.java new file mode 100644 index 00000000..c2dd1fcf --- /dev/null +++ b/src/test/java/model/LineTest.java @@ -0,0 +1,16 @@ +package model; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class LineTest { + + @Test + void 사다리_이동() { + Line line = new Line(3); + int newPosition = line.move(1); + + assertTrue(newPosition >= 0 && newPosition < 3); + } +} diff --git a/src/test/java/model/PlayerTest.java b/src/test/java/model/PlayerTest.java new file mode 100644 index 00000000..795bbe8f --- /dev/null +++ b/src/test/java/model/PlayerTest.java @@ -0,0 +1,25 @@ +package model; + +import exception.ErrorMessage; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PlayerTest { + + @Test + void 이름이_5자를_초과하면_예외() { + IllegalArgumentException exception = assertThrows( + IllegalArgumentException.class, + () -> new Player("abcdef") + ); + assertEquals(ErrorMessage.LIMIT_NAME_LENGTH, exception.getMessage()); + } + + @Test + void 이름이_5자_이하면_통과() { + Player player = new Player("Neo"); + assertEquals("Neo", player.getName()); + } +}