From 533565ee84ecdc12acec7fdf4a966199fdd648fe Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 9 Jun 2024 22:30:38 +0900 Subject: [PATCH 01/17] docs: update README.md --- README.md | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 491aece1..1c47d929 100644 --- a/README.md +++ b/README.md @@ -1 +1,45 @@ -# java-racingcar-precourse \ No newline at end of file +# java-racingcar-precourse + +## 구현 기능 목록 + +### Model + +#### RacingCar + +- 레이싱카 객체 +- 변수 + - 자동차 이름 + - 현재 위치 (=전진한 회수) +- 메서드 + - 전진 : 전진할지 말지 판단하는 메서드, 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우 전진 + +#### RacingCarGame + +- 레이싱카게임 객체 +- 변수 + - 게임에 참가하는 레이싱카 객체 리스트 + - 시도할 회수 (몇번의 이동을 할 것인지) + - 현재까지 시도한 회수 +- 메서드 + - 회수 진행 : 1번의 전진 회차를 진행 + - 우승자 판단 : 모든 시도 회수가 끝난 후 우승자를 판단하여 반환 + +### View + +#### GameInterface + +- 출력 및 입력 기능을 담당하는 게임 인터페이스 객체 +- 출력 기능 + - 전진 회수 진행 시, 현재 레이싱카들의 전진 상태 출력 + - 최종 우승자 결과 출력 + - 오류 메세지 출력 +- 입력 기능 + - 게임에 참가할 n개의 자동차 입력 + - 시도할 회수 입력 + +### Controller + +#### GameExecutor + +- 앱 최초 실행 시 main 함수에서 호출하는 exec 메서드 구현 +- model과 view를 연결하는 기능 \ No newline at end of file From 10269f19023611e5ee144274e86b462d27a72653 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 9 Jun 2024 22:34:06 +0900 Subject: [PATCH 02/17] =?UTF-8?q?feat:=20GameInterface=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/view/GameInterface.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/app/view/GameInterface.java diff --git a/src/main/java/app/view/GameInterface.java b/src/main/java/app/view/GameInterface.java new file mode 100644 index 00000000..b4a6fe2a --- /dev/null +++ b/src/main/java/app/view/GameInterface.java @@ -0,0 +1,17 @@ +package app.view; + +import java.util.Scanner; + +public class GameInterface { + private Scanner scanner = new Scanner(System.in); + + public String getRacingCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + return scanner.nextLine(); + } + + public int getAttemptCount() { + System.out.println("시도할 회수는 몇회인가요?"); + return scanner.nextInt(); + } +} From 0aeb291240f58b40c2bfdb1a17ab23ab4c76175e Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 9 Jun 2024 22:56:34 +0900 Subject: [PATCH 03/17] docs: update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1c47d929..3e767d7d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ - 자동차 이름 - 현재 위치 (=전진한 회수) - 메서드 + - 현재 위치 출력 : "자동차 이름 : (현재 위치만큼 - 출력)" 의 조건으로 출력 - 전진 : 전진할지 말지 판단하는 메서드, 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우 전진 + #### RacingCarGame From 9374d0bb088f1f7acb2e4a8c266a5ab23b07f7f1 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 9 Jun 2024 23:35:54 +0900 Subject: [PATCH 04/17] =?UTF-8?q?feat:=20RacingCar=20=EB=B3=80=EC=88=98,?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=9E=90,=20=ED=98=84=EC=9C=84=EC=B9=98?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/model/RacingCar.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/app/model/RacingCar.java diff --git a/src/main/java/app/model/RacingCar.java b/src/main/java/app/model/RacingCar.java new file mode 100644 index 00000000..9af57727 --- /dev/null +++ b/src/main/java/app/model/RacingCar.java @@ -0,0 +1,16 @@ +package app.model; + +public class RacingCar { + private String name; + private int location; + + public RacingCar(String name) { + this.name = name; + this.location = 0; + } + + public void printCurLocation() { + System.out.println(this.name + " : " + "-".repeat(location)); + } + +} From a6d59b4162d569c8c9cdc2d6caa7cf8cd556d207 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 9 Jun 2024 23:40:39 +0900 Subject: [PATCH 05/17] =?UTF-8?q?feat:=20GameInterface=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/view/GameInterface.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/app/view/GameInterface.java b/src/main/java/app/view/GameInterface.java index b4a6fe2a..9433ecb5 100644 --- a/src/main/java/app/view/GameInterface.java +++ b/src/main/java/app/view/GameInterface.java @@ -1,5 +1,8 @@ package app.view; +import app.model.RacingCar; + +import java.util.List; import java.util.Scanner; public class GameInterface { @@ -14,4 +17,20 @@ public int getAttemptCount() { System.out.println("시도할 회수는 몇회인가요?"); return scanner.nextInt(); } + + public void printAttemptResult(List carList) { + carList.stream().forEach(RacingCar::printCurLocation); + } + + public void printWinner(String winner) { + System.out.println("최종 우승자 : " + winner); + } + + public void printMessage(String message) { + System.out.println(message); + } + + public void printErrorMessage(String message) { + System.out.println("Error : " + message); + } } From 8dd69099cb81734afc7424180047f77f5fbbe44b Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 00:08:49 +0900 Subject: [PATCH 06/17] =?UTF-8?q?feat:=20RacingCar=20=EC=A0=84=EC=A7=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/model/RacingCar.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/app/model/RacingCar.java b/src/main/java/app/model/RacingCar.java index 9af57727..bd1c035d 100644 --- a/src/main/java/app/model/RacingCar.java +++ b/src/main/java/app/model/RacingCar.java @@ -1,5 +1,7 @@ package app.model; +import java.util.Random; + public class RacingCar { private String name; private int location; @@ -13,4 +15,10 @@ public void printCurLocation() { System.out.println(this.name + " : " + "-".repeat(location)); } + public void moveForward() { // 전진할지 말지 판단한 후, 전진하면 location 값 +1 + if (new Random().nextInt(10) >= 4) { + this.location++; + } + } + } From 60a8769eebc21d52e0d3367aef6a048735b4bcb0 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 01:20:52 +0900 Subject: [PATCH 07/17] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EB=B0=8F=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/app/controller/GameExecutor.java | 26 ++++++++++ src/main/java/app/model/RacingCarGame.java | 49 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/main/java/app/controller/GameExecutor.java create mode 100644 src/main/java/app/model/RacingCarGame.java diff --git a/src/main/java/app/controller/GameExecutor.java b/src/main/java/app/controller/GameExecutor.java new file mode 100644 index 00000000..b0450968 --- /dev/null +++ b/src/main/java/app/controller/GameExecutor.java @@ -0,0 +1,26 @@ +package app.controller; + +import app.model.RacingCarGame; +import app.view.GameInterface; + +public class GameExecutor { + private GameInterface gameInterface; + private RacingCarGame racingCarGame; + + public GameExecutor(GameInterface gameInterface, RacingCarGame racingCarGame) { + this.gameInterface = gameInterface; + this.racingCarGame = racingCarGame; + } + + public void exec() { + // 게임 최초 실행 시 동작 + while (racingCarGame.getCarList() == null) { + try { + racingCarGame.setCarList(gameInterface.getRacingCarNames()); + } catch (IllegalArgumentException e) { + gameInterface.printErrorMessage(e.getMessage()); + } + } + } + +} diff --git a/src/main/java/app/model/RacingCarGame.java b/src/main/java/app/model/RacingCarGame.java new file mode 100644 index 00000000..7e3bf255 --- /dev/null +++ b/src/main/java/app/model/RacingCarGame.java @@ -0,0 +1,49 @@ +package app.model; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class RacingCarGame { + private int attemptCnt; // 시도할 회수 + private int curCnt; // 현재까지 시도한 회수 + private List carList; + + public RacingCarGame() { + this.curCnt = 0; + } + + public int getAttemptCnt() { + return attemptCnt; + } + + public void setAttemptCnt(int attemptCnt) { + this.attemptCnt = attemptCnt; + } + + public int getCurCnt() { + return curCnt; + } + + public void setCurCnt(int curCnt) { + this.curCnt = curCnt; + } + + public List getCarList() { + return carList; + } + + public void setCarList(String carNames) { + String[] carNameList = carNames.split(","); + checkCarNameValidation(carNameList); + + this.carList = Arrays.stream(carNameList).map(RacingCar::new).collect(Collectors.toList()); + } + + public void checkCarNameValidation(String[] carNameList) { + Arrays.stream(carNameList).filter(name -> name.length() > 5 || name.length() < 1).findAny().ifPresent(name -> { + throw new IllegalArgumentException("자동차 이름은 1자리 이상 5자리 이하만 가능합니다."); + }); + } +} From 3cb1d92686c99c01b83baa4883a8e1fdd9e1480d Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 01:43:14 +0900 Subject: [PATCH 08/17] =?UTF-8?q?feat:=20=EC=8B=9C=EB=8F=84=20=ED=9A=8C?= =?UTF-8?q?=EC=88=98=20=EC=9E=85=EB=A0=A5=20=EB=B0=8F=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/controller/GameExecutor.java | 11 +++++++++++ src/main/java/app/model/RacingCarGame.java | 7 +++++-- src/main/java/app/view/GameInterface.java | 4 ++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/app/controller/GameExecutor.java b/src/main/java/app/controller/GameExecutor.java index b0450968..f19a753b 100644 --- a/src/main/java/app/controller/GameExecutor.java +++ b/src/main/java/app/controller/GameExecutor.java @@ -3,6 +3,8 @@ import app.model.RacingCarGame; import app.view.GameInterface; +import java.util.InputMismatchException; + public class GameExecutor { private GameInterface gameInterface; private RacingCarGame racingCarGame; @@ -21,6 +23,15 @@ public void exec() { gameInterface.printErrorMessage(e.getMessage()); } } + while (racingCarGame.getAttemptCnt() == 0) { + try { + racingCarGame.setAttemptCnt(gameInterface.getAttemptCount()); + } catch (NumberFormatException e) { + gameInterface.printErrorMessage("숫자만 입력해주세요."); + } catch (IllegalArgumentException e) { + gameInterface.printErrorMessage(e.getMessage()); + } + } } } diff --git a/src/main/java/app/model/RacingCarGame.java b/src/main/java/app/model/RacingCarGame.java index 7e3bf255..9ad77326 100644 --- a/src/main/java/app/model/RacingCarGame.java +++ b/src/main/java/app/model/RacingCarGame.java @@ -12,14 +12,17 @@ public class RacingCarGame { public RacingCarGame() { this.curCnt = 0; + this.attemptCnt = 0; } public int getAttemptCnt() { return attemptCnt; } - public void setAttemptCnt(int attemptCnt) { - this.attemptCnt = attemptCnt; + public void setAttemptCnt(String attemptCnt) { + int num = Integer.parseInt(attemptCnt); + if (num < 1) throw new IllegalArgumentException("시도 회수는 1 이상이어야 합니다."); + this.attemptCnt = num; } public int getCurCnt() { diff --git a/src/main/java/app/view/GameInterface.java b/src/main/java/app/view/GameInterface.java index 9433ecb5..245b11a0 100644 --- a/src/main/java/app/view/GameInterface.java +++ b/src/main/java/app/view/GameInterface.java @@ -13,9 +13,9 @@ public String getRacingCarNames() { return scanner.nextLine(); } - public int getAttemptCount() { + public String getAttemptCount() { System.out.println("시도할 회수는 몇회인가요?"); - return scanner.nextInt(); + return scanner.nextLine(); } public void printAttemptResult(List carList) { From 78a292a5346723f86a3ba4d78311dbc781a9eb72 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 01:52:41 +0900 Subject: [PATCH 09/17] docs: update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3e767d7d..b484383e 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ - 메서드 - 회수 진행 : 1번의 전진 회차를 진행 - 우승자 판단 : 모든 시도 회수가 끝난 후 우승자를 판단하여 반환 + - 게임 종료 판단 : 모든 회차를 진행하여 게임이 종료됐는지 판단 ### View From 5e274ec5ec14e03f836d93820138e70bec3d897b Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 02:04:38 +0900 Subject: [PATCH 10/17] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/controller/GameExecutor.java | 5 +++++ src/main/java/app/model/RacingCarGame.java | 10 +++++++++- src/main/java/app/view/GameInterface.java | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/app/controller/GameExecutor.java b/src/main/java/app/controller/GameExecutor.java index f19a753b..b43ffd36 100644 --- a/src/main/java/app/controller/GameExecutor.java +++ b/src/main/java/app/controller/GameExecutor.java @@ -32,6 +32,11 @@ public void exec() { gameInterface.printErrorMessage(e.getMessage()); } } + gameInterface.printMessage("\n실행 결과"); + while (!racingCarGame.isFinished()) { + racingCarGame.proceed(); + gameInterface.printAttemptResult(racingCarGame.getCarList()); + } } } diff --git a/src/main/java/app/model/RacingCarGame.java b/src/main/java/app/model/RacingCarGame.java index 9ad77326..01871fa4 100644 --- a/src/main/java/app/model/RacingCarGame.java +++ b/src/main/java/app/model/RacingCarGame.java @@ -1,6 +1,5 @@ package app.model; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -49,4 +48,13 @@ public void checkCarNameValidation(String[] carNameList) { throw new IllegalArgumentException("자동차 이름은 1자리 이상 5자리 이하만 가능합니다."); }); } + + public void proceed() { + carList.forEach(RacingCar::moveForward); + this.curCnt++; + } + + public boolean isFinished() { + return this.attemptCnt == this.curCnt; + } } diff --git a/src/main/java/app/view/GameInterface.java b/src/main/java/app/view/GameInterface.java index 245b11a0..00be7c97 100644 --- a/src/main/java/app/view/GameInterface.java +++ b/src/main/java/app/view/GameInterface.java @@ -20,6 +20,7 @@ public String getAttemptCount() { public void printAttemptResult(List carList) { carList.stream().forEach(RacingCar::printCurLocation); + System.out.println(); } public void printWinner(String winner) { From e448556f3e1e62c331d72f8ec3426f8e3880c935 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 02:37:07 +0900 Subject: [PATCH 11/17] =?UTF-8?q?feat:=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/model/RacingCarGame.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/app/model/RacingCarGame.java b/src/main/java/app/model/RacingCarGame.java index 01871fa4..8e51283d 100644 --- a/src/main/java/app/model/RacingCarGame.java +++ b/src/main/java/app/model/RacingCarGame.java @@ -1,7 +1,9 @@ package app.model; import java.util.Arrays; +import java.util.Comparator; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; public class RacingCarGame { @@ -54,6 +56,11 @@ public void proceed() { this.curCnt++; } + public List getWinnerList() { + int maxLocation = carList.stream().mapToInt(RacingCar::getLocation).max().orElse(0); + return carList.stream().filter(car -> car.getLocation() == maxLocation).collect(Collectors.toList()); + } + public boolean isFinished() { return this.attemptCnt == this.curCnt; } From ef66fd2ec9ef29952563a725ef486da5e39605bf Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 02:40:43 +0900 Subject: [PATCH 12/17] =?UTF-8?q?fix:=20=EC=B5=9C=EC=A2=85=20=EC=9A=B0?= =?UTF-8?q?=EC=8A=B9=EC=9E=90=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/view/GameInterface.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/app/view/GameInterface.java b/src/main/java/app/view/GameInterface.java index 00be7c97..c5e18622 100644 --- a/src/main/java/app/view/GameInterface.java +++ b/src/main/java/app/view/GameInterface.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Scanner; +import java.util.stream.Collectors; public class GameInterface { private Scanner scanner = new Scanner(System.in); @@ -23,8 +24,10 @@ public void printAttemptResult(List carList) { System.out.println(); } - public void printWinner(String winner) { - System.out.println("최종 우승자 : " + winner); + public void printWinner(List winnerList) { + System.out.println("최종 우승자 : " + winnerList.stream() + .map(RacingCar::getName) + .collect(Collectors.joining(","))); } public void printMessage(String message) { From 8262c955c5a06d999f7b4e8acff5d66407983887 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 02:45:53 +0900 Subject: [PATCH 13/17] =?UTF-8?q?feat:=20RacingCar=20Getter=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20main=20=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/RacingCarApplication.java | 12 ++++++++++++ src/main/java/app/model/RacingCar.java | 7 +++++++ 2 files changed, 19 insertions(+) create mode 100644 src/main/java/app/RacingCarApplication.java diff --git a/src/main/java/app/RacingCarApplication.java b/src/main/java/app/RacingCarApplication.java new file mode 100644 index 00000000..fba9f9d6 --- /dev/null +++ b/src/main/java/app/RacingCarApplication.java @@ -0,0 +1,12 @@ +package app; + +import app.controller.GameExecutor; +import app.model.RacingCarGame; +import app.view.GameInterface; + +public class RacingCarApplication { + public static void main(String[] args) { + GameExecutor gameExecutor = new GameExecutor(new GameInterface(), new RacingCarGame()); + gameExecutor.exec(); + } +} diff --git a/src/main/java/app/model/RacingCar.java b/src/main/java/app/model/RacingCar.java index bd1c035d..fa2ae560 100644 --- a/src/main/java/app/model/RacingCar.java +++ b/src/main/java/app/model/RacingCar.java @@ -21,4 +21,11 @@ public void moveForward() { // 전진할지 말지 판단한 후, 전진하 } } + public String getName() { + return name; + } + + public int getLocation() { + return location; + } } From e8b47460d719a2ef6cf535d06cc5948f380b5e02 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 02:47:00 +0900 Subject: [PATCH 14/17] =?UTF-8?q?style:=20GameInterface=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=EB=AC=B8=20=EB=AC=B8=EC=9E=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/view/GameInterface.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/app/view/GameInterface.java b/src/main/java/app/view/GameInterface.java index c5e18622..7edd7f67 100644 --- a/src/main/java/app/view/GameInterface.java +++ b/src/main/java/app/view/GameInterface.java @@ -27,7 +27,7 @@ public void printAttemptResult(List carList) { public void printWinner(List winnerList) { System.out.println("최종 우승자 : " + winnerList.stream() .map(RacingCar::getName) - .collect(Collectors.joining(","))); + .collect(Collectors.joining(", "))); } public void printMessage(String message) { @@ -35,6 +35,6 @@ public void printMessage(String message) { } public void printErrorMessage(String message) { - System.out.println("Error : " + message); + System.out.println("[Error] " + message); } } From 502681e2add5a24295ca7902d6c7f78ed5de9dd3 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 02:53:36 +0900 Subject: [PATCH 15/17] =?UTF-8?q?refactor:=20GameExecutor=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20step=20=EB=B3=84=EB=A1=9C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/app/controller/GameExecutor.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/app/controller/GameExecutor.java b/src/main/java/app/controller/GameExecutor.java index b43ffd36..c30a3033 100644 --- a/src/main/java/app/controller/GameExecutor.java +++ b/src/main/java/app/controller/GameExecutor.java @@ -14,8 +14,7 @@ public GameExecutor(GameInterface gameInterface, RacingCarGame racingCarGame) { this.racingCarGame = racingCarGame; } - public void exec() { - // 게임 최초 실행 시 동작 + public void step1() { while (racingCarGame.getCarList() == null) { try { racingCarGame.setCarList(gameInterface.getRacingCarNames()); @@ -23,6 +22,9 @@ public void exec() { gameInterface.printErrorMessage(e.getMessage()); } } + } + + public void step2() { while (racingCarGame.getAttemptCnt() == 0) { try { racingCarGame.setAttemptCnt(gameInterface.getAttemptCount()); @@ -32,6 +34,9 @@ public void exec() { gameInterface.printErrorMessage(e.getMessage()); } } + } + + public void step3() { gameInterface.printMessage("\n실행 결과"); while (!racingCarGame.isFinished()) { racingCarGame.proceed(); @@ -39,4 +44,15 @@ public void exec() { } } + public void step4() { + gameInterface.printWinner(racingCarGame.getWinnerList()); + } + + public void exec() { + step1(); // 1. 자동차 이름 입력 + step2(); // 2. 시도할 회수 입력 + step3(); // 3. 게임 진행 (경주) + step4(); // 4. 최종 우승자 출력 + } + } From 28abc00009f665a74ea4dccc3b9560cffc18ab9b Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 02:56:49 +0900 Subject: [PATCH 16/17] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=20import=20=EB=AC=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/app/controller/GameExecutor.java | 2 -- src/main/java/app/model/RacingCarGame.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/app/controller/GameExecutor.java b/src/main/java/app/controller/GameExecutor.java index c30a3033..3ee8d511 100644 --- a/src/main/java/app/controller/GameExecutor.java +++ b/src/main/java/app/controller/GameExecutor.java @@ -3,8 +3,6 @@ import app.model.RacingCarGame; import app.view.GameInterface; -import java.util.InputMismatchException; - public class GameExecutor { private GameInterface gameInterface; private RacingCarGame racingCarGame; diff --git a/src/main/java/app/model/RacingCarGame.java b/src/main/java/app/model/RacingCarGame.java index 8e51283d..8554e82e 100644 --- a/src/main/java/app/model/RacingCarGame.java +++ b/src/main/java/app/model/RacingCarGame.java @@ -1,9 +1,7 @@ package app.model; import java.util.Arrays; -import java.util.Comparator; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; public class RacingCarGame { From ad1d3d3f34fdb3904c7aeca2861ebfe55282877c Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 10 Jun 2024 03:28:01 +0900 Subject: [PATCH 17/17] =?UTF-8?q?test:=20RacingCarGame=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/app/model/RacingCarGameTest.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/test/java/app/model/RacingCarGameTest.java diff --git a/src/test/java/app/model/RacingCarGameTest.java b/src/test/java/app/model/RacingCarGameTest.java new file mode 100644 index 00000000..36d979a0 --- /dev/null +++ b/src/test/java/app/model/RacingCarGameTest.java @@ -0,0 +1,78 @@ +package app.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class RacingCarGameTest { + + @Test + @DisplayName("5자리 이상 자동차 이름이 입력됐을 경우") + void test1() { + String inputCarNames = "가나,다라마바,사아자차카타,파하"; + + assertThatThrownBy(() -> { + RacingCarGame racingCarGame = new RacingCarGame(); + racingCarGame.setCarList(inputCarNames); + }) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("자동차 이름은 1자리 이상 5자리 이하만 가능합니다."); + } + + @Test + @DisplayName("자동차 이름에 공백이 입력됐을 경우") + void test2() { + String inputCarNames1 = ""; + + assertThatThrownBy(() -> { + RacingCarGame racingCarGame = new RacingCarGame(); + racingCarGame.setCarList(inputCarNames1); + }) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("자동차 이름은 1자리 이상 5자리 이하만 가능합니다."); + + String inputCarNames2 = "가나,다라마,,바사"; + + assertThatThrownBy(() -> { + RacingCarGame racingCarGame = new RacingCarGame(); + racingCarGame.setCarList(inputCarNames2); + }) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("자동차 이름은 1자리 이상 5자리 이하만 가능합니다."); + } + + @Test + @DisplayName("시도 회수에 숫자 외 문자가 입력됐을 경우") + void test3() { + String input = "asd@34"; + + assertThatThrownBy(() -> { + RacingCarGame racingCarGame = new RacingCarGame(); + racingCarGame.setAttemptCnt(input); + }) + .isInstanceOf(NumberFormatException.class); + } + + @Test + @DisplayName("시도 회수에 1 미만 숫자가 입력됐을 경우") + void test4() { + String input1 = "-1"; + + assertThatThrownBy(() -> { + RacingCarGame racingCarGame = new RacingCarGame(); + racingCarGame.setAttemptCnt(input1); + }) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("시도 회수는 1 이상이어야 합니다."); + + String input2 = "0"; + + assertThatThrownBy(() -> { + RacingCarGame racingCarGame = new RacingCarGame(); + racingCarGame.setAttemptCnt(input2); + }) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("시도 회수는 1 이상이어야 합니다."); + } +}