From ceda29f9f03baf7eff395ee4ea5355c86b9966d5 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 11:23:28 +0900 Subject: [PATCH 01/15] feat: create view and input methods(carNames, frequency) --- docs/README.md | 13 +++++++++ src/main/java/racingcar/Application.java | 10 +++++-- src/main/java/racingcar/Controller.java | 4 +++ src/main/java/racingcar/Model.java | 5 ++++ src/main/java/racingcar/View.java | 28 ++++++++++++++++++++ src/test/java/racingcar/ApplicationTest.java | 8 +++++- 6 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 src/main/java/racingcar/Controller.java create mode 100644 src/main/java/racingcar/Model.java create mode 100644 src/main/java/racingcar/View.java diff --git a/docs/README.md b/docs/README.md index e69de29..147e08a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,13 @@ +# 입력 + +### 자동차 +- 숫자 n개의 자동차의 이름을 입력받는다. +- 자동차의 이름은 영어이며 5자 이하이다. +- 자동차의 이름은 쉼표로 구별한다. +### 이동 횟수 +- 숫자 m의 자동차 이동 횟수를 입력받는다. +- 매 시도마다 0에서 9사이의 무작위 값을 구하고, 만약 4 이상의 값이라면 전진한다. +- 모든 경주가 끝이나면 우승자를 출력한다. +- 우승자는 한 명 이상일 수 있다. 만약 우승자가 여러명인 경우 쉼표로 구분한다. +### 예외처리 +- 사용자가 잘못된 값을 입력하면 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료된다. diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..c378d43 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,13 @@ package racingcar; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + public class Application { - public static void main(String[] args) { - // TODO: 프로그램 구현 + public static void main(String[] args) throws IOException { } } diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java new file mode 100644 index 0000000..4f1f9ad --- /dev/null +++ b/src/main/java/racingcar/Controller.java @@ -0,0 +1,4 @@ +package racingcar; + +public class Controller { +} diff --git a/src/main/java/racingcar/Model.java b/src/main/java/racingcar/Model.java new file mode 100644 index 0000000..cfe2397 --- /dev/null +++ b/src/main/java/racingcar/Model.java @@ -0,0 +1,5 @@ +package racingcar; + +public class Model { + +} diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java new file mode 100644 index 0000000..1e0a00d --- /dev/null +++ b/src/main/java/racingcar/View.java @@ -0,0 +1,28 @@ +package racingcar; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +public class View { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + + public List inputCarNames(BufferedReader reader) throws IOException { + System.out.println("자동차의 이름들을 입력하세요"); + String carNames = reader.readLine(); + List cars = new ArrayList<>(); + StringTokenizer st = new StringTokenizer(carNames, ","); + while (st.hasMoreTokens()) { + cars.add(st.nextToken()); + } + return cars; + } + + public int inputFrequency(BufferedReader reader) throws IOException { + System.out.println("총 시도할 횟수를 입력하세요"); + return Integer.parseInt(reader.readLine()); + } +} diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 764ba4c..c584514 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -3,6 +3,8 @@ import camp.nextstep.edu.missionutils.test.NsTest; import org.junit.jupiter.api.Test; +import java.io.IOException; + import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; import static org.assertj.core.api.Assertions.assertThat; @@ -33,6 +35,10 @@ class ApplicationTest extends NsTest { @Override public void runMain() { - Application.main(new String[]{}); + try { + Application.main(new String[]{}); + } catch (IOException e) { + throw new RuntimeException(e); + } } } From fcfb20cb4b152ffb96fdd411ee467e17cdd27b18 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 11:36:26 +0900 Subject: [PATCH 02/15] feat: create model and move method --- src/main/java/racingcar/Application.java | 5 ----- src/main/java/racingcar/Model.java | 7 +++++-- src/main/java/racingcar/View.java | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index c378d43..02ff6f8 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,11 +1,6 @@ package racingcar; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; public class Application { public static void main(String[] args) throws IOException { diff --git a/src/main/java/racingcar/Model.java b/src/main/java/racingcar/Model.java index cfe2397..07fe900 100644 --- a/src/main/java/racingcar/Model.java +++ b/src/main/java/racingcar/Model.java @@ -1,5 +1,8 @@ package racingcar; public class Model { - -} + private boolean move() { + int random = (int) (Math.random() * 10); + return random >= 4; + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index 1e0a00d..2ca22f9 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -10,7 +10,7 @@ public class View { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - public List inputCarNames(BufferedReader reader) throws IOException { + private List inputCarNames(BufferedReader reader) throws IOException { System.out.println("자동차의 이름들을 입력하세요"); String carNames = reader.readLine(); List cars = new ArrayList<>(); @@ -21,7 +21,7 @@ public List inputCarNames(BufferedReader reader) throws IOException { return cars; } - public int inputFrequency(BufferedReader reader) throws IOException { + private int inputFrequency(BufferedReader reader) throws IOException { System.out.println("총 시도할 횟수를 입력하세요"); return Integer.parseInt(reader.readLine()); } From a30e161c44670501184089f8fac209889949bde7 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 11:52:09 +0900 Subject: [PATCH 03/15] feat: create print car progress method --- src/main/java/racingcar/View.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index 2ca22f9..e62a6de 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -25,4 +25,10 @@ private int inputFrequency(BufferedReader reader) throws IOException { System.out.println("총 시도할 횟수를 입력하세요"); return Integer.parseInt(reader.readLine()); } + + private void printCarNames(List carNames, List carProgress) { + for (int i = 0; i < carNames.size(); i++) { + System.out.println(carNames.get(i) + " : " + carProgress.get(i)); + } + } } From c5aaadb949151fb1beb63cbcb649535c644a2365 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 14:13:30 +0900 Subject: [PATCH 04/15] feat: create game progress method --- src/main/java/racingcar/Model.java | 14 ++++++++++++++ src/main/java/racingcar/View.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/Model.java b/src/main/java/racingcar/Model.java index 07fe900..92719aa 100644 --- a/src/main/java/racingcar/Model.java +++ b/src/main/java/racingcar/Model.java @@ -1,8 +1,22 @@ package racingcar; +import java.util.List; + public class Model { private boolean move() { int random = (int) (Math.random() * 10); return random >= 4; } + + private void gameProgress(List carNames, List carProgress, int frequency) { + for (int i = 0; i < frequency; i++) { + for (int index = 0; index < carNames.size(); index++) { + String progress = carProgress.get(i); + if (move()) { + progress += '-'; + carProgress.set(i, progress); + } + } + } + } } \ No newline at end of file diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index e62a6de..2d9df06 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -26,7 +26,7 @@ private int inputFrequency(BufferedReader reader) throws IOException { return Integer.parseInt(reader.readLine()); } - private void printCarNames(List carNames, List carProgress) { + private void printCarProgress(List carNames, List carProgress) { for (int i = 0; i < carNames.size(); i++) { System.out.println(carNames.get(i) + " : " + carProgress.get(i)); } From 1b87de18d0ca2d552006b276c7e63d8f154e2f2e Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 14:25:26 +0900 Subject: [PATCH 05/15] feat: create print winner method --- src/main/java/racingcar/View.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index 2d9df06..f3e0e24 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -31,4 +31,27 @@ private void printCarProgress(List carNames, List carProgress) { System.out.println(carNames.get(i) + " : " + carProgress.get(i)); } } + + private void printResult(List carNames, List carProgress) { + List winner = new ArrayList<>(); + int max = 0; + for (int i = 0; i < carProgress.size(); i++) { // 최댓값 찾기 + if (carProgress.get(i).length() >= max) { + max = carProgress.get(i).length(); + } + } + for (int i = 0; i < carProgress.size(); i++) { // 우승자 찾기 + if (carProgress.get(i).length() >= max) { + winner.add(carNames.get(i)); + } + } + + System.out.print("최종 우승자 : "); + for (int i = 0; i < winner.size(); i++) { + System.out.print(winner.get(i)); + if (i + 1 < winner.size()) { + System.out.println(","); + } + } + } } From 3cb6d588fbc4e7b7240b3d6f06d4a944c4e65495 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 14:47:12 +0900 Subject: [PATCH 06/15] feat: create controller and assemble module --- src/main/java/racingcar/Application.java | 2 ++ src/main/java/racingcar/Controller.java | 15 +++++++++++++ src/main/java/racingcar/Model.java | 28 ++++++++++++++++-------- src/main/java/racingcar/View.java | 8 +++---- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 02ff6f8..f8accce 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -4,5 +4,7 @@ public class Application { public static void main(String[] args) throws IOException { + Controller controller = new Controller(); + controller.startGame(); } } diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java index 4f1f9ad..72ac146 100644 --- a/src/main/java/racingcar/Controller.java +++ b/src/main/java/racingcar/Controller.java @@ -1,4 +1,19 @@ package racingcar; +import java.io.IOException; + public class Controller { + Model model = new Model(); + View view = new View(); + + public void startGame() throws IOException { + model.carNames = view.inputCarNames(); + model.initCarProgress(model.carNames.size()); + model.frequency = view.inputFrequency(); + for (int i = 0; i < model.frequency; i++) { + model.gameProgress(model.carNames, model.carProgress); + view.printCarProgress(model.carNames, model.carProgress); + } + view.printResult(model.carNames, model.carProgress); + } } diff --git a/src/main/java/racingcar/Model.java b/src/main/java/racingcar/Model.java index 92719aa..dbd3d75 100644 --- a/src/main/java/racingcar/Model.java +++ b/src/main/java/racingcar/Model.java @@ -1,21 +1,31 @@ package racingcar; +import java.util.ArrayList; import java.util.List; public class Model { - private boolean move() { + List carNames = new ArrayList<>(); + List carProgress = new ArrayList<>(); + int frequency = 0; + + public List initCarProgress(int length) { + for (int i = 0; i < length; i++) { + carProgress.add(""); + } + return carProgress; + } + + public boolean move() { int random = (int) (Math.random() * 10); return random >= 4; } - private void gameProgress(List carNames, List carProgress, int frequency) { - for (int i = 0; i < frequency; i++) { - for (int index = 0; index < carNames.size(); index++) { - String progress = carProgress.get(i); - if (move()) { - progress += '-'; - carProgress.set(i, progress); - } + public void gameProgress(List carNames, List carProgress) { + for (int i = 0; i < carNames.size(); i++) { + String progress = carProgress.get(i); + if (move()) { + progress += '-'; + carProgress.set(i, progress); } } } diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index f3e0e24..90207ee 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -10,7 +10,7 @@ public class View { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - private List inputCarNames(BufferedReader reader) throws IOException { + public List inputCarNames() throws IOException { System.out.println("자동차의 이름들을 입력하세요"); String carNames = reader.readLine(); List cars = new ArrayList<>(); @@ -21,18 +21,18 @@ private List inputCarNames(BufferedReader reader) throws IOException { return cars; } - private int inputFrequency(BufferedReader reader) throws IOException { + public int inputFrequency() throws IOException { System.out.println("총 시도할 횟수를 입력하세요"); return Integer.parseInt(reader.readLine()); } - private void printCarProgress(List carNames, List carProgress) { + public void printCarProgress(List carNames, List carProgress) { for (int i = 0; i < carNames.size(); i++) { System.out.println(carNames.get(i) + " : " + carProgress.get(i)); } } - private void printResult(List carNames, List carProgress) { + public void printResult(List carNames, List carProgress) { List winner = new ArrayList<>(); int max = 0; for (int i = 0; i < carProgress.size(); i++) { // 최댓값 찾기 From 504b2319d4739b978038f59b4a591e5b2c8efa20 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 15:04:54 +0900 Subject: [PATCH 07/15] fix: fix print error --- src/main/java/racingcar/View.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index 90207ee..adfa182 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -30,6 +30,7 @@ public void printCarProgress(List carNames, List carProgress) { for (int i = 0; i < carNames.size(); i++) { System.out.println(carNames.get(i) + " : " + carProgress.get(i)); } + System.out.println(); } public void printResult(List carNames, List carProgress) { @@ -50,7 +51,7 @@ public void printResult(List carNames, List carProgress) { for (int i = 0; i < winner.size(); i++) { System.out.print(winner.get(i)); if (i + 1 < winner.size()) { - System.out.println(","); + System.out.print(","); } } } From ea04bc639d6a66a9982d5452acb68f9811a3419d Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 15:31:29 +0900 Subject: [PATCH 08/15] feat: change default to camp library --- src/main/java/racingcar/Model.java | 4 +++- src/main/java/racingcar/View.java | 16 +++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/racingcar/Model.java b/src/main/java/racingcar/Model.java index dbd3d75..c7c67e7 100644 --- a/src/main/java/racingcar/Model.java +++ b/src/main/java/racingcar/Model.java @@ -1,5 +1,7 @@ package racingcar; +import camp.nextstep.edu.missionutils.Randoms; + import java.util.ArrayList; import java.util.List; @@ -16,7 +18,7 @@ public List initCarProgress(int length) { } public boolean move() { - int random = (int) (Math.random() * 10); + int random = Randoms.pickNumberInRange(0, 9); return random >= 4; } diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index adfa182..6bd6733 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -1,29 +1,31 @@ package racingcar; -import java.io.BufferedReader; +import camp.nextstep.edu.missionutils.Console; + import java.io.IOException; -import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; public class View { - BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - public List inputCarNames() throws IOException { System.out.println("자동차의 이름들을 입력하세요"); - String carNames = reader.readLine(); + String carNames = Console.readLine(); List cars = new ArrayList<>(); StringTokenizer st = new StringTokenizer(carNames, ","); while (st.hasMoreTokens()) { - cars.add(st.nextToken()); + String str = st.nextToken(); + cars.add(str); + if (str.length() > 5) { + throw new IllegalArgumentException(); + } } return cars; } public int inputFrequency() throws IOException { System.out.println("총 시도할 횟수를 입력하세요"); - return Integer.parseInt(reader.readLine()); + return Integer.parseInt(Console.readLine()); } public void printCarProgress(List carNames, List carProgress) { From f27fa3a0f77714592f92c72d15bff9f4a17757db Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 18:24:45 +0900 Subject: [PATCH 09/15] feat: change method name move() -> isMovable() --- src/main/java/racingcar/Model.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/Model.java b/src/main/java/racingcar/Model.java index c7c67e7..577b185 100644 --- a/src/main/java/racingcar/Model.java +++ b/src/main/java/racingcar/Model.java @@ -17,7 +17,7 @@ public List initCarProgress(int length) { return carProgress; } - public boolean move() { + public boolean isMovable() { int random = Randoms.pickNumberInRange(0, 9); return random >= 4; } @@ -25,7 +25,7 @@ public boolean move() { public void gameProgress(List carNames, List carProgress) { for (int i = 0; i < carNames.size(); i++) { String progress = carProgress.get(i); - if (move()) { + if (isMovable()) { progress += '-'; carProgress.set(i, progress); } From 910c300ee1c021b1f95109bcdd90f2b8128e5e20 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 18:39:37 +0900 Subject: [PATCH 10/15] feat: create error handling logic --- src/main/java/racingcar/Controller.java | 24 ++++++++++++++++-------- src/main/java/racingcar/View.java | 23 ++++++++++++++--------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java index 72ac146..4ea5dfc 100644 --- a/src/main/java/racingcar/Controller.java +++ b/src/main/java/racingcar/Controller.java @@ -6,14 +6,22 @@ public class Controller { Model model = new Model(); View view = new View(); - public void startGame() throws IOException { - model.carNames = view.inputCarNames(); - model.initCarProgress(model.carNames.size()); - model.frequency = view.inputFrequency(); - for (int i = 0; i < model.frequency; i++) { - model.gameProgress(model.carNames, model.carProgress); - view.printCarProgress(model.carNames, model.carProgress); + public void startGame() { + try { + try { + model.carNames = view.inputCarNames(); + } catch (Exception e) { + System.out.println("Exception [Err_Msg] : " + e.getMessage()); + } + model.initCarProgress(model.carNames.size()); + model.frequency = view.inputFrequency(); + for (int i = 0; i < model.frequency; i++) { + model.gameProgress(model.carNames, model.carProgress); + view.printCarProgress(model.carNames, model.carProgress); + } + view.printResult(model.carNames, model.carProgress); + } catch (Exception e) { + } - view.printResult(model.carNames, model.carProgress); } } diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index 6bd6733..fcb0724 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -8,17 +8,22 @@ import java.util.StringTokenizer; public class View { - public List inputCarNames() throws IOException { - System.out.println("자동차의 이름들을 입력하세요"); - String carNames = Console.readLine(); + public List inputCarNames() { List cars = new ArrayList<>(); - StringTokenizer st = new StringTokenizer(carNames, ","); - while (st.hasMoreTokens()) { - String str = st.nextToken(); - cars.add(str); - if (str.length() > 5) { - throw new IllegalArgumentException(); + try { + System.out.println("자동차의 이름들을 입력하세요"); + String carNames = Console.readLine(); + StringTokenizer st = new StringTokenizer(carNames, ","); + while (st.hasMoreTokens()) { + String str = st.nextToken(); + cars.add(str); + if (str.length() > 5) { + throw new IllegalArgumentException("Car name should be less than 5 characters"); + } } + } catch (Exception e) { + System.out.println("Exception [Err_location] : " + e.getStackTrace()[0]); + throw new RuntimeException(e); } return cars; } From 2262a0a3b520dc14f7f9914662474de06500d0ef Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 19:08:12 +0900 Subject: [PATCH 11/15] feat : create car object --- src/main/java/racingcar/Controller.java | 10 +++---- src/main/java/racingcar/Model.java | 34 ------------------------ src/main/java/racingcar/Model/Car.java | 34 ++++++++++++++++++++++++ src/main/java/racingcar/Model/Model.java | 11 ++++++++ src/main/java/racingcar/View.java | 33 ++++++++++++++--------- 5 files changed, 69 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/racingcar/Model.java create mode 100644 src/main/java/racingcar/Model/Car.java create mode 100644 src/main/java/racingcar/Model/Model.java diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java index 4ea5dfc..0f12eb1 100644 --- a/src/main/java/racingcar/Controller.java +++ b/src/main/java/racingcar/Controller.java @@ -1,6 +1,6 @@ package racingcar; -import java.io.IOException; +import racingcar.Model.Model; public class Controller { Model model = new Model(); @@ -9,17 +9,15 @@ public class Controller { public void startGame() { try { try { - model.carNames = view.inputCarNames(); + model.cars = view.inputCarNames(); } catch (Exception e) { System.out.println("Exception [Err_Msg] : " + e.getMessage()); } - model.initCarProgress(model.carNames.size()); model.frequency = view.inputFrequency(); for (int i = 0; i < model.frequency; i++) { - model.gameProgress(model.carNames, model.carProgress); - view.printCarProgress(model.carNames, model.carProgress); + view.printCarProgress(model.cars, i); } - view.printResult(model.carNames, model.carProgress); + view.printResult(model.cars); } catch (Exception e) { } diff --git a/src/main/java/racingcar/Model.java b/src/main/java/racingcar/Model.java deleted file mode 100644 index 577b185..0000000 --- a/src/main/java/racingcar/Model.java +++ /dev/null @@ -1,34 +0,0 @@ -package racingcar; - -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.List; - -public class Model { - List carNames = new ArrayList<>(); - List carProgress = new ArrayList<>(); - int frequency = 0; - - public List initCarProgress(int length) { - for (int i = 0; i < length; i++) { - carProgress.add(""); - } - return carProgress; - } - - public boolean isMovable() { - int random = Randoms.pickNumberInRange(0, 9); - return random >= 4; - } - - public void gameProgress(List carNames, List carProgress) { - for (int i = 0; i < carNames.size(); i++) { - String progress = carProgress.get(i); - if (isMovable()) { - progress += '-'; - carProgress.set(i, progress); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/racingcar/Model/Car.java b/src/main/java/racingcar/Model/Car.java new file mode 100644 index 0000000..4209ae0 --- /dev/null +++ b/src/main/java/racingcar/Model/Car.java @@ -0,0 +1,34 @@ +package racingcar.Model; + +import camp.nextstep.edu.missionutils.Randoms; + +public class Car { + String name; + int progress; + boolean win; + + public Car(String name, int progress, boolean win) { + this.name = name; + this.progress = progress; + this.win = win; + } + + public String getName() { + return name; + } + + public int getProgress() { + return progress; + } + + public boolean isWin() { + return win; + } + + public void move() { + int random = Randoms.pickNumberInRange(0, 9); + if (random >= 4) { + progress += 1; + } + } +} diff --git a/src/main/java/racingcar/Model/Model.java b/src/main/java/racingcar/Model/Model.java new file mode 100644 index 0000000..fa9a4f7 --- /dev/null +++ b/src/main/java/racingcar/Model/Model.java @@ -0,0 +1,11 @@ +package racingcar.Model; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class Model { + public List cars = new ArrayList<>(); + public int frequency = 0; +} \ No newline at end of file diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index fcb0724..80f600a 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -1,6 +1,7 @@ package racingcar; import camp.nextstep.edu.missionutils.Console; +import racingcar.Model.Car; import java.io.IOException; import java.util.ArrayList; @@ -8,15 +9,16 @@ import java.util.StringTokenizer; public class View { - public List inputCarNames() { - List cars = new ArrayList<>(); + public List inputCarNames() { + List cars = new ArrayList<>(); try { System.out.println("자동차의 이름들을 입력하세요"); String carNames = Console.readLine(); StringTokenizer st = new StringTokenizer(carNames, ","); while (st.hasMoreTokens()) { String str = st.nextToken(); - cars.add(str); + Car car = new Car(str, 0, false); + cars.add(car); if (str.length() > 5) { throw new IllegalArgumentException("Car name should be less than 5 characters"); } @@ -33,24 +35,29 @@ public int inputFrequency() throws IOException { return Integer.parseInt(Console.readLine()); } - public void printCarProgress(List carNames, List carProgress) { - for (int i = 0; i < carNames.size(); i++) { - System.out.println(carNames.get(i) + " : " + carProgress.get(i)); + public void printCarProgress(List cars, int index) { + System.out.print(cars.get(index).getName() + " : "); + int progress = cars.get(index).getProgress(); + for (int i = 0; i < progress; i++) { + System.out.print("-"); } System.out.println(); } - public void printResult(List carNames, List carProgress) { + public void printResult(List cars) { List winner = new ArrayList<>(); + int max = 0; - for (int i = 0; i < carProgress.size(); i++) { // 최댓값 찾기 - if (carProgress.get(i).length() >= max) { - max = carProgress.get(i).length(); + + for (int i = 0; i < cars.size(); i++) { // 최댓값 찾기 + if (cars.get(i).getProgress() >= max) { + max = cars.get(i).getProgress(); } } - for (int i = 0; i < carProgress.size(); i++) { // 우승자 찾기 - if (carProgress.get(i).length() >= max) { - winner.add(carNames.get(i)); + + for (int i = 0; i < cars.size(); i++) { // 우승자 찾기 + if (cars.get(i).getProgress() >= max) { + winner.add(cars.get(i).getName()); } } From bf2cbe29970b661fdeffa46d84b8b4b0d949981d Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 19:15:18 +0900 Subject: [PATCH 12/15] feat : refactor winner logic into model and view separation --- src/main/java/racingcar/Controller.java | 7 +++--- src/main/java/racingcar/Model/Model.java | 17 +++++++++++++ src/main/java/racingcar/View.java | 32 +++++++----------------- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java index 0f12eb1..7ae1a03 100644 --- a/src/main/java/racingcar/Controller.java +++ b/src/main/java/racingcar/Controller.java @@ -14,10 +14,9 @@ public void startGame() { System.out.println("Exception [Err_Msg] : " + e.getMessage()); } model.frequency = view.inputFrequency(); - for (int i = 0; i < model.frequency; i++) { - view.printCarProgress(model.cars, i); - } - view.printResult(model.cars); + view.printCarProgress(model.cars, model.frequency); + model.findWinner(); + view.printWinner(model.winner); } catch (Exception e) { } diff --git a/src/main/java/racingcar/Model/Model.java b/src/main/java/racingcar/Model/Model.java index fa9a4f7..031ac49 100644 --- a/src/main/java/racingcar/Model/Model.java +++ b/src/main/java/racingcar/Model/Model.java @@ -7,5 +7,22 @@ public class Model { public List cars = new ArrayList<>(); + public List winner = new ArrayList<>(); public int frequency = 0; + + public void findWinner() { + int max = 0; + + for (int i = 0; i < cars.size(); i++) { // 최댓값 찾기 + if (cars.get(i).getProgress() >= max) { + max = cars.get(i).getProgress(); + } + } + + for (int i = 0; i < cars.size(); i++) { // 우승자 찾기 + if (cars.get(i).getProgress() >= max) { + winner.add(cars.get(i).getName()); + } + } + } } \ No newline at end of file diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index 80f600a..5c6dd58 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -35,32 +35,18 @@ public int inputFrequency() throws IOException { return Integer.parseInt(Console.readLine()); } - public void printCarProgress(List cars, int index) { - System.out.print(cars.get(index).getName() + " : "); - int progress = cars.get(index).getProgress(); - for (int i = 0; i < progress; i++) { - System.out.print("-"); - } - System.out.println(); - } - - public void printResult(List cars) { - List winner = new ArrayList<>(); - - int max = 0; - - for (int i = 0; i < cars.size(); i++) { // 최댓값 찾기 - if (cars.get(i).getProgress() >= max) { - max = cars.get(i).getProgress(); - } - } - - for (int i = 0; i < cars.size(); i++) { // 우승자 찾기 - if (cars.get(i).getProgress() >= max) { - winner.add(cars.get(i).getName()); + public void printCarProgress(List cars, int frequency) { + for (int index = 0; index < frequency; index++) { + System.out.print(cars.get(index).getName() + " : "); + int progress = cars.get(index).getProgress(); + for (int i = 0; i < progress; i++) { + System.out.print("-"); } + System.out.println(); } + } + public void printWinner(List winner) { System.out.print("최종 우승자 : "); for (int i = 0; i < winner.size(); i++) { System.out.print(winner.get(i)); From 53c50efd4f7f2aaa04d15e1a2dddc8305e5679f2 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 19:22:40 +0900 Subject: [PATCH 13/15] refactor: refactor split name methods --- src/main/java/racingcar/Controller.java | 8 ++----- src/main/java/racingcar/Model/Model.java | 13 +++++++++++ src/main/java/racingcar/View.java | 28 ++++++++++-------------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java index 7ae1a03..d3248d1 100644 --- a/src/main/java/racingcar/Controller.java +++ b/src/main/java/racingcar/Controller.java @@ -8,17 +8,13 @@ public class Controller { public void startGame() { try { - try { - model.cars = view.inputCarNames(); - } catch (Exception e) { - System.out.println("Exception [Err_Msg] : " + e.getMessage()); - } + model.splitNames(view.inputCarNames()); model.frequency = view.inputFrequency(); view.printCarProgress(model.cars, model.frequency); model.findWinner(); view.printWinner(model.winner); } catch (Exception e) { - + System.out.println("Exception [Err_Msg] : " + e.getMessage()); } } } diff --git a/src/main/java/racingcar/Model/Model.java b/src/main/java/racingcar/Model/Model.java index 031ac49..9cf87da 100644 --- a/src/main/java/racingcar/Model/Model.java +++ b/src/main/java/racingcar/Model/Model.java @@ -4,12 +4,25 @@ import java.util.ArrayList; import java.util.List; +import java.util.StringTokenizer; public class Model { public List cars = new ArrayList<>(); public List winner = new ArrayList<>(); public int frequency = 0; + public void splitNames(String carNames) { + StringTokenizer st = new StringTokenizer(carNames, ","); + while (st.hasMoreTokens()) { + String str = st.nextToken(); + Car car = new Car(str, 0, false); + cars.add(car); + if (str.length() > 5) { + throw new IllegalArgumentException("Car name should be less than 5 characters"); + } + } + } + public void findWinner() { int max = 0; diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index 5c6dd58..dc7e54c 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -9,30 +9,26 @@ import java.util.StringTokenizer; public class View { - public List inputCarNames() { - List cars = new ArrayList<>(); + public String inputCarNames() { + String carNames = ""; try { System.out.println("자동차의 이름들을 입력하세요"); - String carNames = Console.readLine(); - StringTokenizer st = new StringTokenizer(carNames, ","); - while (st.hasMoreTokens()) { - String str = st.nextToken(); - Car car = new Car(str, 0, false); - cars.add(car); - if (str.length() > 5) { - throw new IllegalArgumentException("Car name should be less than 5 characters"); - } - } + carNames = Console.readLine(); } catch (Exception e) { System.out.println("Exception [Err_location] : " + e.getStackTrace()[0]); throw new RuntimeException(e); } - return cars; + return carNames; } - public int inputFrequency() throws IOException { - System.out.println("총 시도할 횟수를 입력하세요"); - return Integer.parseInt(Console.readLine()); + public int inputFrequency() { + try { + System.out.println("총 시도할 횟수를 입력하세요"); + return Integer.parseInt(Console.readLine()); + } catch (Exception e) { + System.out.println("Exception [Err_location] : " + e.getStackTrace()[0]); + throw new RuntimeException(e); + } } public void printCarProgress(List cars, int frequency) { From 28ae9b74bf9bfb12a22c7c0dac6fba17ed715d17 Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 19:34:05 +0900 Subject: [PATCH 14/15] feat : create moveCars method --- src/main/java/racingcar/Controller.java | 3 ++- src/main/java/racingcar/Model/Model.java | 10 ++++++++-- src/main/java/racingcar/View.java | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java index d3248d1..2a4e0a3 100644 --- a/src/main/java/racingcar/Controller.java +++ b/src/main/java/racingcar/Controller.java @@ -10,7 +10,8 @@ public void startGame() { try { model.splitNames(view.inputCarNames()); model.frequency = view.inputFrequency(); - view.printCarProgress(model.cars, model.frequency); + model.moveCars(); + view.printCarProgress(model.cars, model.cars.size()); model.findWinner(); view.printWinner(model.winner); } catch (Exception e) { diff --git a/src/main/java/racingcar/Model/Model.java b/src/main/java/racingcar/Model/Model.java index 9cf87da..b544464 100644 --- a/src/main/java/racingcar/Model/Model.java +++ b/src/main/java/racingcar/Model/Model.java @@ -1,7 +1,5 @@ package racingcar.Model; -import camp.nextstep.edu.missionutils.Randoms; - import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; @@ -11,6 +9,14 @@ public class Model { public List winner = new ArrayList<>(); public int frequency = 0; + public void moveCars() { + for (int i = 0; i < frequency; i++) { + for (Car car : cars) { + car.move(); + } + } + } + public void splitNames(String carNames) { StringTokenizer st = new StringTokenizer(carNames, ","); while (st.hasMoreTokens()) { diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index dc7e54c..7df2ae5 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -31,8 +31,8 @@ public int inputFrequency() { } } - public void printCarProgress(List cars, int frequency) { - for (int index = 0; index < frequency; index++) { + public void printCarProgress(List cars, int length) { + for (int index = 0; index < length; index++) { System.out.print(cars.get(index).getName() + " : "); int progress = cars.get(index).getProgress(); for (int i = 0; i < progress; i++) { From bc89e7fbb034718e557fb9507ed553d57df6a9aa Mon Sep 17 00:00:00 2001 From: boroboro01 Date: Sat, 7 Sep 2024 19:37:34 +0900 Subject: [PATCH 15/15] fix : printing error --- src/main/java/racingcar/Controller.java | 6 ++++-- src/main/java/racingcar/Model/Model.java | 6 ++---- src/main/java/racingcar/View.java | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java index 2a4e0a3..f679de5 100644 --- a/src/main/java/racingcar/Controller.java +++ b/src/main/java/racingcar/Controller.java @@ -10,8 +10,10 @@ public void startGame() { try { model.splitNames(view.inputCarNames()); model.frequency = view.inputFrequency(); - model.moveCars(); - view.printCarProgress(model.cars, model.cars.size()); + for (int i = 0; i <= model.frequency; i++) { + model.moveCars(); + view.printCarProgress(model.cars, model.cars.size()); + } model.findWinner(); view.printWinner(model.winner); } catch (Exception e) { diff --git a/src/main/java/racingcar/Model/Model.java b/src/main/java/racingcar/Model/Model.java index b544464..ac01eac 100644 --- a/src/main/java/racingcar/Model/Model.java +++ b/src/main/java/racingcar/Model/Model.java @@ -10,10 +10,8 @@ public class Model { public int frequency = 0; public void moveCars() { - for (int i = 0; i < frequency; i++) { - for (Car car : cars) { - car.move(); - } + for (Car car : cars) { + car.move(); } } diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java index 7df2ae5..58d1546 100644 --- a/src/main/java/racingcar/View.java +++ b/src/main/java/racingcar/View.java @@ -40,6 +40,7 @@ public void printCarProgress(List cars, int length) { } System.out.println(); } + System.out.println(); } public void printWinner(List winner) {