From 06ecdded177a6e8e0e3b0d4105640fefdc41221d Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 18:07:02 +0900 Subject: [PATCH 01/32] initial commit --- src/App.js | 10 +++++++++- src/controller/RacingController.js | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/controller/RacingController.js diff --git a/src/App.js b/src/App.js index 091aa0a5d..c9da09c8a 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,13 @@ +import RacingController from "./controller/RacingController.js"; + class App { - async run() {} + constructor () { + this.racingController = new RacingController + } + + async run() { + this.racingController.racing(); + } } export default App; diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js new file mode 100644 index 000000000..15612835b --- /dev/null +++ b/src/controller/RacingController.js @@ -0,0 +1,7 @@ +class RacingController { + async racing () { + + } +} + +export default RacingController; \ No newline at end of file From 6a0644b1a52b296f126248971cf39f8ced7d65e6 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 18:09:30 +0900 Subject: [PATCH 02/32] =?UTF-8?q?docs(README):=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/README.md b/README.md index e078fd41f..a7f049b24 100644 --- a/README.md +++ b/README.md @@ -1 +1,65 @@ # javascript-racingcar-precourse + +  +## 초간단 자동차 경주 게임을 구현한다. + +  +### ● 경주할 자동차 이름을 쉼표(,)기준으로 구분하여 각각 5자 이하로만 입력받는다. + +  +### ● 입력받은 자동차 이름값들을 검증한다. +- 빈값 여부 +- 에러 여부 +- 쉼표 구분여부 +- 영어입력 여부 +- 5자이하 여부 + + +  +### ● 검증 중 입력값에 문제가 있을 경우, 완전히 종료된다. +사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다. + + +  +### ● 시도할 횟수를 입력받는다. + + +  +### ● 입력받은 시도할 홧수를 검증한다. +사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다. + + +  +### ● 검증 중 입력값에 문제가 있을 경우, 완전히 종료된다. + + +  +### ● 입력받은 값들에 문제가 없으면 게임이 시작된다. + + +  +### ● 게임 진행 규칙 +주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. +전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. + + +  +### ● 게임 진행 상황을 출력할 때 자동차 이름을 같이 출력한다. +<출력 예시> +pobi : -- +woni : +jun : - + + +  +### ● 우승자 출력하기 +입력된 시도횟수만큼 게임 진행 후 가장 멀리 간 자동차가 우승이다. +자동차 경주 게임을 완료한 후 누가 우승했는지를 출력하여 알려준다. +<출력 예시> +최종 우승자 : pobi + +전진한 횟수가 동점인 경우 우승자는 한 명 이상일 수 있다. +우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. +<출력 예시> +최종 우승자 : pobi, jun + From bc1f8a32085af4368662ab9fb810cb6d315cdf64 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 19:12:09 +0900 Subject: [PATCH 03/32] # npm audit report cross-spawn 7.0.0 - 7.0.4 Severity: high Regular Expression Denial of Service (ReDoS) in cross-spawn - https://github.com/advisories/GHSA-3xgq-45jj-v275 fix available via `npm audit fix` node_modules/cross-spawn --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 93036a07f..bc33080fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3351,9 +3351,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { From 63b47f4e277ea50833d0dff4abb20d0f304b9a3c Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 19:16:20 +0900 Subject: [PATCH 04/32] =?UTF-8?q?docs(README):=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a7f049b24..766344b87 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@   ### ● 경주할 자동차 이름을 쉼표(,)기준으로 구분하여 각각 5자 이하로만 입력받는다. +경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분) \n => +   ### ● 입력받은 자동차 이름값들을 검증한다. @@ -22,7 +24,7 @@   ### ● 시도할 횟수를 입력받는다. - +시도할 횟수는 몇 회인가요? \n =>   ### ● 입력받은 시도할 홧수를 검증한다. From fca67092ab769cf7e994d7d282dd4bed0a53116c Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 19:17:32 +0900 Subject: [PATCH 05/32] =?UTF-8?q?feat(InputView):=20=EA=B2=BD=EC=A3=BC?= =?UTF-8?q?=ED=95=A0=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 15612835b..22976c807 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -1,7 +1,22 @@ +import { MissionUtils } from "@woowacourse/mission-utils"; + class RacingController { - async racing () { + constructor() {} + + async racing() { + const carNames = await this.readCarNames(); + + return console.log(carNames); + } + // 1. 경주할 자동차 이름을 쉼표(,)기준으로 구분하여 각각 5자 이하로만 입력받는다. + async readCarNames() { + const inputCarNames = await MissionUtils.Console.readLineAsync( + "경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분) \n => " + ); + const stringType = String(inputCarNames); + return stringType; } } -export default RacingController; \ No newline at end of file +export default RacingController; From cef977cce21ac2e2b52a12fa35ec991ecccfe391 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 20:06:55 +0900 Subject: [PATCH 06/32] feat(constants): add errorMessages for validation --- src/constants/errorMessages.js | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/constants/errorMessages.js diff --git a/src/constants/errorMessages.js b/src/constants/errorMessages.js new file mode 100644 index 000000000..d626c90f0 --- /dev/null +++ b/src/constants/errorMessages.js @@ -0,0 +1,7 @@ +const ERROR_MESSAGES = { + VALIDATE_EMPTY: "[ERROR] 입력값이 없습니다. 다시 입력해주세요.", + VALIDATE_NOT_CORRECT_REGEX: "[ERROR] 형식이 올바르지 않습니다.", + VALIDATE_FIVE_LENGTH: "[ERROR] 입력된 자동차 이름 중에서 5글자가 넘는 이름이 존재합니다.", +}; + +export default ERROR_MESSAGES; \ No newline at end of file From 36fecba8d8052fb49c9010e640c07daa74df4198 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 20:09:30 +0900 Subject: [PATCH 07/32] =?UTF-8?q?feat(validation):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EA=B0=92=EC=9D=84=20=EA=B2=80=EC=A6=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B0=81=EA=B0=81=EC=9D=98=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 값이 비어있을 경우 에러 - 정규표현식을 통하여 입력된 값에 대한 규칙 검증 - 값을 배열로 만들어서 각 자동차 이름들이 5글자가 넘어가지 않는지 검증 --- src/validation/functions/validateEmpty.js | 11 +++++++++++ src/validation/functions/validateFiveLength.js | 15 +++++++++++++++ src/validation/functions/validateRegEx.js | 12 ++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 src/validation/functions/validateEmpty.js create mode 100644 src/validation/functions/validateFiveLength.js create mode 100644 src/validation/functions/validateRegEx.js diff --git a/src/validation/functions/validateEmpty.js b/src/validation/functions/validateEmpty.js new file mode 100644 index 000000000..8d31f2b06 --- /dev/null +++ b/src/validation/functions/validateEmpty.js @@ -0,0 +1,11 @@ +import ERROR_MESSAGES from "../../constants/errorMessages.js"; + +const validateEmpty = (value) => { + if (value == "") { + throw new Error(ERROR_MESSAGES.VALIDATE_EMPTY); + } + + return true; +}; + +export default validateEmpty; \ No newline at end of file diff --git a/src/validation/functions/validateFiveLength.js b/src/validation/functions/validateFiveLength.js new file mode 100644 index 000000000..0231f3a4a --- /dev/null +++ b/src/validation/functions/validateFiveLength.js @@ -0,0 +1,15 @@ +import ERROR_MESSAGES from "../../constants/errorMessages.js"; +import makeArrayFromString from "../../utils/makeArrayFormString.js"; + +const validateFiveLength = (value) => { + const carNamesArray = makeArrayFromString(value); + carNamesArray.map((carName) => { + if (carName.length > 5) + throw new Error(ERROR_MESSAGES.VALIDATE_FIVE_LENGTH); + return carName; + }); + + return true; +}; + +export default validateFiveLength; diff --git a/src/validation/functions/validateRegEx.js b/src/validation/functions/validateRegEx.js new file mode 100644 index 000000000..50bdb5cd9 --- /dev/null +++ b/src/validation/functions/validateRegEx.js @@ -0,0 +1,12 @@ +import ERROR_MESSAGES from "../../constants/errorMessages.js"; + +const validateRegEx = (inputProducts, regExPattern) => { + const validInclusion = regExPattern.test(inputProducts); + + if (!validInclusion) { + throw new Error(ERROR_MESSAGES.VALIDATE_NOT_CORRECT_REGEX); + } + return true; +}; + +export default validateRegEx; From c5b77a3fcc132fa6cda0d6b3bd15b61f2e8b03df Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 20:10:12 +0900 Subject: [PATCH 08/32] =?UTF-8?q?feat(validation):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EA=B0=92=EB=93=A4=EC=9D=84=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/validation/validateCarNames.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/validation/validateCarNames.js diff --git a/src/validation/validateCarNames.js b/src/validation/validateCarNames.js new file mode 100644 index 000000000..9f495ad7d --- /dev/null +++ b/src/validation/validateCarNames.js @@ -0,0 +1,13 @@ +import validateEmpty from "./functions/validateEmpty"; +import validateFiveLength from "./functions/validateFiveLength"; +import validateRegEx from "./functions/validateRegEx"; + +const validateCarNames = (validateTarget) => { + validateEmpty(validateTarget); + const regExPattern = /^(\w+)(,\w+)*$/; + validateRegEx(validateTarget, regExPattern); + validateFiveLength(validateTarget); + return true; +} + +export default validateCarNames; \ No newline at end of file From 38c680e4e8c25a8b866607194b4debbc1a9b284a Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 20:13:58 +0900 Subject: [PATCH 09/32] =?UTF-8?q?feat(util):=20string=20type=EC=9D=98=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EA=B0=92=EC=9D=84=20(,)=EB=A5=BC=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=EC=9C=BC=EB=A1=9C=20array=EB=A1=9C=20=EB=A7=8C?= =?UTF-8?q?=EB=93=9C=EB=8A=94=20=EB=8F=84=EA=B5=AC=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/makeArrayFormString.js | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/utils/makeArrayFormString.js diff --git a/src/utils/makeArrayFormString.js b/src/utils/makeArrayFormString.js new file mode 100644 index 000000000..7105dfaab --- /dev/null +++ b/src/utils/makeArrayFormString.js @@ -0,0 +1,5 @@ +const makeArrayFromString = (stringValue) => { + return stringValue.split(','); +} + +export default makeArrayFromString; \ No newline at end of file From 3c6a46b1519c8b9042f41309d350b795c7b66218 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 20:17:28 +0900 Subject: [PATCH 10/32] =?UTF-8?q?fix(validation):=20import=EC=97=90=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EB=AA=85=20.js=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/validation/validateCarNames.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/validation/validateCarNames.js b/src/validation/validateCarNames.js index 9f495ad7d..961ebc9ae 100644 --- a/src/validation/validateCarNames.js +++ b/src/validation/validateCarNames.js @@ -1,6 +1,6 @@ -import validateEmpty from "./functions/validateEmpty"; -import validateFiveLength from "./functions/validateFiveLength"; -import validateRegEx from "./functions/validateRegEx"; +import validateEmpty from "./functions/validateEmpty.js"; +import validateFiveLength from "./functions/validateFiveLength.js"; +import validateRegEx from "./functions/validateRegEx.js"; const validateCarNames = (validateTarget) => { validateEmpty(validateTarget); From b841c71da4cca3ff65e7b66de7727fa061835391 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 20:18:39 +0900 Subject: [PATCH 11/32] =?UTF-8?q?feat(controller):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EA=B0=92=EB=93=A4=EC=9D=84=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 22976c807..4110b6d36 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -1,12 +1,14 @@ import { MissionUtils } from "@woowacourse/mission-utils"; +import validateCarNames from "../validation/validateCarNames.js"; class RacingController { constructor() {} async racing() { const carNames = await this.readCarNames(); + this.validationCarNames(carNames); - return console.log(carNames); + return; } // 1. 경주할 자동차 이름을 쉼표(,)기준으로 구분하여 각각 5자 이하로만 입력받는다. @@ -15,8 +17,16 @@ class RacingController { "경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분) \n => " ); const stringType = String(inputCarNames); - return stringType; + const removeSpace = stringType.replace(/ /g, ""); + return removeSpace; } + + // 2. 입력받은 자동차 이름값들을 검증한다. + validationCarNames(validationTarget) { + validateCarNames(validationTarget) + } + + } export default RacingController; From f83dff311b0623126af49802b1632dbcfdcb112c Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 20:22:25 +0900 Subject: [PATCH 12/32] =?UTF-8?q?feat(InputView):=20=EC=8B=9C=EB=8F=84?= =?UTF-8?q?=ED=95=A0=20=ED=9A=9F=EC=88=98=EB=A5=BC=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 4110b6d36..923871e9a 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -7,7 +7,7 @@ class RacingController { async racing() { const carNames = await this.readCarNames(); this.validationCarNames(carNames); - + this.readTryNumbers(); return; } @@ -23,10 +23,18 @@ class RacingController { // 2. 입력받은 자동차 이름값들을 검증한다. validationCarNames(validationTarget) { - validateCarNames(validationTarget) + validateCarNames(validationTarget); } - + // 3. 시도할 횟수를 입력받는다. + async readTryNumbers() { + const inputCarNames = await MissionUtils.Console.readLineAsync( + "시도할 횟수는 몇 회인가요? \n => " + ); + const removeSpace = inputCarNames.replace(/ /g, ""); + const numberType = Number(removeSpace); + return numberType; + } } export default RacingController; From df510725fc8ea42bc9f278b8ac2b46dc311ecfc7 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 20:56:33 +0900 Subject: [PATCH 13/32] feat(constants): add errorMessage for number of try --- src/constants/errorMessages.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/constants/errorMessages.js b/src/constants/errorMessages.js index d626c90f0..dfee91baa 100644 --- a/src/constants/errorMessages.js +++ b/src/constants/errorMessages.js @@ -2,6 +2,7 @@ const ERROR_MESSAGES = { VALIDATE_EMPTY: "[ERROR] 입력값이 없습니다. 다시 입력해주세요.", VALIDATE_NOT_CORRECT_REGEX: "[ERROR] 형식이 올바르지 않습니다.", VALIDATE_FIVE_LENGTH: "[ERROR] 입력된 자동차 이름 중에서 5글자가 넘는 이름이 존재합니다.", + VALIDATE_LIMIT_NUMBER: "[ERROR] 너무 과도한 시도 횟수를 입력하셨습니다.", }; export default ERROR_MESSAGES; \ No newline at end of file From 1c9cd308ed705e0da79ce689a2eab1ea10602262 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:11:08 +0900 Subject: [PATCH 14/32] =?UTF-8?q?docs(README):=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 766344b87..14293c97e 100644 --- a/README.md +++ b/README.md @@ -28,12 +28,14 @@   ### ● 입력받은 시도할 홧수를 검증한다. -사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다. +- 빈값 여부 +- 숫자가 입력되었는지 여부 +- 과도한 시도 횟수 방지 (임의 20 제한)   ### ● 검증 중 입력값에 문제가 있을 경우, 완전히 종료된다. - +사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다.   ### ● 입력받은 값들에 문제가 없으면 게임이 시작된다. From 302f4940e1680b16fa20d3da9d8505e2af70b8aa Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:12:03 +0900 Subject: [PATCH 15/32] =?UTF-8?q?feat(validation):=20=EA=B3=BC=EB=8F=84?= =?UTF-8?q?=ED=95=9C=20=EC=8B=9C=EB=8F=84=ED=9A=9F=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/validation/functions/validateLimitNumber.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/validation/functions/validateLimitNumber.js diff --git a/src/validation/functions/validateLimitNumber.js b/src/validation/functions/validateLimitNumber.js new file mode 100644 index 000000000..697fe00e6 --- /dev/null +++ b/src/validation/functions/validateLimitNumber.js @@ -0,0 +1,11 @@ +import ERROR_MESSAGES from "../../constants/errorMessages.js"; + +const validateLimitNumber = (value) => { + const numberValue = Number(value); + if(numberValue > 20) + throw new Error(ERROR_MESSAGES.VALIDATE_LIMIT_NUMBER); + + return true; +} + +export default validateLimitNumber; \ No newline at end of file From c7fd9e570b79ebf7e3742fbf43fd62699ec380ea Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:13:17 +0900 Subject: [PATCH 16/32] =?UTF-8?q?chore:=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/validation/functions/validateRegEx.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/validation/functions/validateRegEx.js b/src/validation/functions/validateRegEx.js index 50bdb5cd9..8a9b56eb9 100644 --- a/src/validation/functions/validateRegEx.js +++ b/src/validation/functions/validateRegEx.js @@ -1,7 +1,7 @@ import ERROR_MESSAGES from "../../constants/errorMessages.js"; -const validateRegEx = (inputProducts, regExPattern) => { - const validInclusion = regExPattern.test(inputProducts); +const validateRegEx = (value, regExPattern) => { + const validInclusion = regExPattern.test(value); if (!validInclusion) { throw new Error(ERROR_MESSAGES.VALIDATE_NOT_CORRECT_REGEX); From 4ddb838a6860a80b66f88b772b616c1712a7c119 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:14:32 +0900 Subject: [PATCH 17/32] =?UTF-8?q?feat(validation):=20=EC=8B=9C=EB=8F=84?= =?UTF-8?q?=ED=9A=9F=EC=88=98=EB=A5=BC=20=EA=B2=80=EC=A6=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20validation=20=ED=95=A8=EC=88=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/validation/validateTryNumber.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/validation/validateTryNumber.js diff --git a/src/validation/validateTryNumber.js b/src/validation/validateTryNumber.js new file mode 100644 index 000000000..a1f6166c3 --- /dev/null +++ b/src/validation/validateTryNumber.js @@ -0,0 +1,13 @@ +import validateEmpty from "./functions/validateEmpty.js"; +import validateLimitNumber from "./functions/validateLimitNumber.js"; +import validateRegEx from "./functions/validateRegEx.js"; + +const validateTryNumber = (validationTarget) => { + validateEmpty(validationTarget); + const regExPattern = /^\d{1,2}$/; + validateRegEx(validationTarget, regExPattern); + validateLimitNumber(validationTarget); + return true; +}; + +export default validateTryNumber; From c3b8cd64173b14af76f8a7437262cc6b9ca8909a Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:19:48 +0900 Subject: [PATCH 18/32] =?UTF-8?q?feat(controller):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EC=8B=9C=EB=8F=84=ED=95=A0=20=ED=99=A7?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EA=B2=80=EC=A6=9D=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 923871e9a..49fed71e9 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -1,13 +1,15 @@ import { MissionUtils } from "@woowacourse/mission-utils"; import validateCarNames from "../validation/validateCarNames.js"; +import validateTryNumber from "../validation/validateTryNumber.js"; class RacingController { constructor() {} async racing() { const carNames = await this.readCarNames(); - this.validationCarNames(carNames); - this.readTryNumbers(); + const validatedCarNames = this.validationCarNames(carNames); + const tryNumber = await this.readTryNumbers(); + const validatedTryNumber = this.validationTryNumber(tryNumber); return; } @@ -24,6 +26,7 @@ class RacingController { // 2. 입력받은 자동차 이름값들을 검증한다. validationCarNames(validationTarget) { validateCarNames(validationTarget); + return validationTarget; } // 3. 시도할 횟수를 입력받는다. @@ -32,8 +35,13 @@ class RacingController { "시도할 횟수는 몇 회인가요? \n => " ); const removeSpace = inputCarNames.replace(/ /g, ""); - const numberType = Number(removeSpace); - return numberType; + return removeSpace; + } + + // 4. 입력받은 시도할 홧수를 검증한다. + validationTryNumber(validationTarget) { + const validatedValue = validateTryNumber(validationTarget); + return Number(validationTarget); } } From 30e255d39c5a2b455ff22b406c79741ed7fb1599 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:26:06 +0900 Subject: [PATCH 19/32] =?UTF-8?q?feat(controller):=200=EC=97=90=EC=84=9C?= =?UTF-8?q?=209=20=EC=82=AC=EC=9D=B4=EC=97=90=EC=84=9C=20=EB=AC=B4?= =?UTF-8?q?=EC=9E=91=EC=9C=84=20=EA=B0=92=EC=9D=84=20=EA=B5=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 49fed71e9..6a8c3f6f6 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -43,6 +43,17 @@ class RacingController { const validatedValue = validateTryNumber(validationTarget); return Number(validationTarget); } + + // 5. 게임 진행 + // 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. + getRandomNumber() { + return MissionUtils.Random.pickNumberInRange(0, 9); + } + + + + + } export default RacingController; From 2c93fd0d9b0fe70bf55685527c05b95fec6ede04 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:34:31 +0900 Subject: [PATCH 20/32] =?UTF-8?q?chore(controller):=20carName=EC=9D=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B3=A0=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=84=20racing=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=EC=84=9C=20=EB=B9=BC?= =?UTF-8?q?=EC=84=9C=20=EB=B3=84=EB=8F=84=EC=9D=98=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EB=A7=8C=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 6a8c3f6f6..b8821b606 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -1,18 +1,27 @@ import { MissionUtils } from "@woowacourse/mission-utils"; import validateCarNames from "../validation/validateCarNames.js"; import validateTryNumber from "../validation/validateTryNumber.js"; +import makeArrayFromString from "../utils/makeArrayFormString.js"; + class RacingController { constructor() {} async racing() { - const carNames = await this.readCarNames(); - const validatedCarNames = this.validationCarNames(carNames); + const carNames = this.carNamesArray(); const tryNumber = await this.readTryNumbers(); const validatedTryNumber = this.validationTryNumber(tryNumber); return; } + async carNamesArray() { + const carNames = await this.readCarNames(); + const validatedCarNames = this.validationCarNames(carNames); + return makeArrayFromString(validatedCarNames); + } + + + //----------------------------------------------------------------- // 1. 경주할 자동차 이름을 쉼표(,)기준으로 구분하여 각각 5자 이하로만 입력받는다. async readCarNames() { const inputCarNames = await MissionUtils.Console.readLineAsync( @@ -45,11 +54,12 @@ class RacingController { } // 5. 게임 진행 - // 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. + // 0에서 9 사이에서 무작위 값을 구한다. getRandomNumber() { return MissionUtils.Random.pickNumberInRange(0, 9); } + // 전진하는 조건을 무작위 값이 4 이상일 경우이다. From 0bb40ae9536d3bb307f63d434a7a1e4ec7c8e498 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:36:27 +0900 Subject: [PATCH 21/32] =?UTF-8?q?chore(controller):=20tryNumber=EC=9D=84?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B3=A0=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=84=20racing=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=EC=84=9C=20=EB=B9=BC?= =?UTF-8?q?=EC=84=9C=20=EB=B3=84=EB=8F=84=EC=9D=98=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EB=A7=8C=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index b8821b606..91116730a 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -8,18 +8,24 @@ class RacingController { constructor() {} async racing() { - const carNames = this.carNamesArray(); - const tryNumber = await this.readTryNumbers(); - const validatedTryNumber = this.validationTryNumber(tryNumber); + const carNamesArray = this.getCarNamesArray(); + const tryNumber = this.getTryNumber(); return; } - async carNamesArray() { + + async getCarNamesArray() { const carNames = await this.readCarNames(); const validatedCarNames = this.validationCarNames(carNames); return makeArrayFromString(validatedCarNames); } + async getTryNumber() { + const tryNumber = await this.readTryNumbers(); + const validtedTryNumber = this.validationTryNumber(tryNumber); + return Number(validtedTryNumber); + } + //----------------------------------------------------------------- // 1. 경주할 자동차 이름을 쉼표(,)기준으로 구분하여 각각 5자 이하로만 입력받는다. From 8807125c9a6940a77ec1a96db7f096f6f5c8596e Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:38:07 +0900 Subject: [PATCH 22/32] =?UTF-8?q?fix(controller):=20validationTryNumber()?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=EC=84=9C=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=EC=97=86=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20Number()=20=ED=83=80=EC=9E=85=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 91116730a..6113b1a4b 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -13,7 +13,7 @@ class RacingController { return; } - + async getCarNamesArray() { const carNames = await this.readCarNames(); const validatedCarNames = this.validationCarNames(carNames); @@ -55,8 +55,8 @@ class RacingController { // 4. 입력받은 시도할 홧수를 검증한다. validationTryNumber(validationTarget) { - const validatedValue = validateTryNumber(validationTarget); - return Number(validationTarget); + validateTryNumber(validationTarget); + return validationTarget; } // 5. 게임 진행 From 1aaefa534a83e8cb7c88e74759df783c64255cdc Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:39:23 +0900 Subject: [PATCH 23/32] =?UTF-8?q?fix(controller):=20await=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=88=84=EB=9D=BD=EC=9C=BC=EB=A1=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 6113b1a4b..aeaa508db 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -8,8 +8,8 @@ class RacingController { constructor() {} async racing() { - const carNamesArray = this.getCarNamesArray(); - const tryNumber = this.getTryNumber(); + const carNamesArray = await this.getCarNamesArray(); + const tryNumber = await this.getTryNumber(); return; } From 7e32df4fdfb484813ca826a7cf45178d5ce2ee92 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:55:10 +0900 Subject: [PATCH 24/32] =?UTF-8?q?chore(util):=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=98=A4=ED=83=80=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=ED=8C=8C=EC=9D=BC=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/{makeArrayFormString.js => makeArrayFromString.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/utils/{makeArrayFormString.js => makeArrayFromString.js} (100%) diff --git a/src/utils/makeArrayFormString.js b/src/utils/makeArrayFromString.js similarity index 100% rename from src/utils/makeArrayFormString.js rename to src/utils/makeArrayFromString.js From 104dc60b7b48afd25d34007e66220aeff15fca60 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 21:59:42 +0900 Subject: [PATCH 25/32] =?UTF-8?q?feat(util):=20array=EB=A5=BC=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=B0=B0=EC=97=B4=EB=A1=9C=20=EB=A7=8C=EB=93=A4=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8A=94=20=EB=8F=84=EA=B5=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/makeObjectFromArray.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/utils/makeObjectFromArray.js diff --git a/src/utils/makeObjectFromArray.js b/src/utils/makeObjectFromArray.js new file mode 100644 index 000000000..d259a551b --- /dev/null +++ b/src/utils/makeObjectFromArray.js @@ -0,0 +1,8 @@ +const makeObjectFromArray = (array) => { + const objectedValue = array.map((array) => { + return {name : array, foward : 0}; + }) + return objectedValue; +} + +export default makeObjectFromArray; \ No newline at end of file From 81dc21eb69983adb6b41cfb8807c97ffe59ba7d9 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 22:01:42 +0900 Subject: [PATCH 26/32] =?UTF-8?q?feat(controller):=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=EC=97=90=20array=20=ED=98=95=ED=83=9C=EB=A1=9C=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=ED=96=88=EB=8D=98=20carName=EC=9D=84=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=B0=B0=EC=97=B4=EB=A1=9C=20=EB=B0=9B=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20makeObjectFromArray?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index aeaa508db..2029feced 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -1,23 +1,23 @@ import { MissionUtils } from "@woowacourse/mission-utils"; import validateCarNames from "../validation/validateCarNames.js"; import validateTryNumber from "../validation/validateTryNumber.js"; -import makeArrayFromString from "../utils/makeArrayFormString.js"; - +import makeArrayFromString from "../utils/makeArrayFromString.js"; +import makeObjectFromArray from "../utils/makeObjectFromArray.js"; class RacingController { constructor() {} async racing() { - const carNamesArray = await this.getCarNamesArray(); + const carNamesObject = await this.getCarNamesObject(); const tryNumber = await this.getTryNumber(); return; } - - async getCarNamesArray() { + async getCarNamesObject() { const carNames = await this.readCarNames(); const validatedCarNames = this.validationCarNames(carNames); - return makeArrayFromString(validatedCarNames); + const carNamesArray = makeArrayFromString(validatedCarNames); + return makeObjectFromArray(carNamesArray); } async getTryNumber() { @@ -26,7 +26,6 @@ class RacingController { return Number(validtedTryNumber); } - //----------------------------------------------------------------- // 1. 경주할 자동차 이름을 쉼표(,)기준으로 구분하여 각각 5자 이하로만 입력받는다. async readCarNames() { @@ -60,7 +59,7 @@ class RacingController { } // 5. 게임 진행 - // 0에서 9 사이에서 무작위 값을 구한다. + // 0에서 9 사이에서 무작위 값을 구한다. getRandomNumber() { return MissionUtils.Random.pickNumberInRange(0, 9); } @@ -68,8 +67,7 @@ class RacingController { // 전진하는 조건을 무작위 값이 4 이상일 경우이다. - - + } export default RacingController; From 6b7336beb2ec377ba78406073b69d692ea38c20d Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 22:04:36 +0900 Subject: [PATCH 27/32] =?UTF-8?q?chore(util):=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EB=B0=B0=EC=97=B4=20=EB=AA=85=EC=B9=AD=20=EC=98=A4=ED=83=80?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=98=EC=97=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/makeObjectFromArray.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/makeObjectFromArray.js b/src/utils/makeObjectFromArray.js index d259a551b..553f55696 100644 --- a/src/utils/makeObjectFromArray.js +++ b/src/utils/makeObjectFromArray.js @@ -1,6 +1,6 @@ const makeObjectFromArray = (array) => { const objectedValue = array.map((array) => { - return {name : array, foward : 0}; + return {name : array, forward : 0}; }) return objectedValue; } From 9c50bc7f0ae81ef0c4531bbc45b87f6a865c1d9a Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 22:28:07 +0900 Subject: [PATCH 28/32] =?UTF-8?q?feat(controller):=20=EC=A0=84=EC=A7=84?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=A1=B0=EA=B1=B4=EC=9D=80=20=EB=AC=B4?= =?UTF-8?q?=EC=9E=91=EC=9C=84=20=EA=B0=92=EC=9D=B4=204=20=EC=9D=B4?= =?UTF-8?q?=EC=83=81=EC=9D=BC=20=EA=B2=BD=EC=9A=B0=EC=9D=B4=EB=8B=A4.=20?= =?UTF-8?q?=EC=9D=B4=20=EC=A1=B0=EA=B1=B4=EC=9C=BC=EB=A1=9C=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=EC=9D=84=20=EC=8B=9C=EC=9E=91=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 2029feced..4182c99d6 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -5,11 +5,12 @@ import makeArrayFromString from "../utils/makeArrayFromString.js"; import makeObjectFromArray from "../utils/makeObjectFromArray.js"; class RacingController { - constructor() {} async racing() { const carNamesObject = await this.getCarNamesObject(); + console.log(carNamesObject); const tryNumber = await this.getTryNumber(); + this.startCarRacing(carNamesObject, tryNumber); return; } @@ -64,10 +65,22 @@ class RacingController { return MissionUtils.Random.pickNumberInRange(0, 9); } - // 전진하는 조건을 무작위 값이 4 이상일 경우이다. + // 전진하는 조건은 무작위 값이 4 이상일 경우이다. 이 조건으로 게임을 시작한다. + startCarRacing(carNamesObject, tryNumber) { + for(let i = 0; i < tryNumber; i++) { + let updateObject = carNamesObject; + const racingResult = updateObject.map((object) => { + const randomNumber = this.getRandomNumber(); + if(randomNumber > 4) object.forward += 1; + return object; + }) + updateObject = racingResult; + MissionUtils.Console.print(updateObject); + } + } + // pobi, jun, boram, sujin, minji - } export default RacingController; From 1959b1f09f73a3507fe5a65c9b33d322dd7d305c Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 22:56:03 +0900 Subject: [PATCH 29/32] =?UTF-8?q?feat(controller):=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EC=A7=84=ED=96=89=EC=83=81=ED=99=A9=EC=9D=B4=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=EB=90=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 41 ++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 4182c99d6..c13a1b546 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -5,10 +5,8 @@ import makeArrayFromString from "../utils/makeArrayFromString.js"; import makeObjectFromArray from "../utils/makeObjectFromArray.js"; class RacingController { - async racing() { const carNamesObject = await this.getCarNamesObject(); - console.log(carNamesObject); const tryNumber = await this.getTryNumber(); this.startCarRacing(carNamesObject, tryNumber); return; @@ -18,12 +16,14 @@ class RacingController { const carNames = await this.readCarNames(); const validatedCarNames = this.validationCarNames(carNames); const carNamesArray = makeArrayFromString(validatedCarNames); + MissionUtils.Console.print(""); return makeObjectFromArray(carNamesArray); } async getTryNumber() { const tryNumber = await this.readTryNumbers(); const validtedTryNumber = this.validationTryNumber(tryNumber); + MissionUtils.Console.print(""); return Number(validtedTryNumber); } @@ -65,22 +65,35 @@ class RacingController { return MissionUtils.Random.pickNumberInRange(0, 9); } + // (forward 숫자를 dashe로 만들어주는 util) + changeDashUtil(number) { + let dash = ""; + for (let i = 0; i < number; i++) { + dash += "-"; + } + return dash; + } + + // (print게임진행상황) + printGameProgress(object) { + object.map((array) => { + const carName = array.name; + const dash = this.changeDashUtil(array.forward); + return MissionUtils.Console.print(`${carName} : ${dash}`); + }); + MissionUtils.Console.print(""); + } + // 전진하는 조건은 무작위 값이 4 이상일 경우이다. 이 조건으로 게임을 시작한다. startCarRacing(carNamesObject, tryNumber) { - for(let i = 0; i < tryNumber; i++) { - let updateObject = carNamesObject; - const racingResult = updateObject.map((object) => { - const randomNumber = this.getRandomNumber(); - if(randomNumber > 4) object.forward += 1; + for (let i = 0; i < tryNumber; i++) { + const racingResult = carNamesObject.map((object) => { + if (this.getRandomNumber() > 4) object.forward += 1; return object; - }) - updateObject = racingResult; - MissionUtils.Console.print(updateObject); - } + }); + this.printGameProgress(racingResult); + } } - - // pobi, jun, boram, sujin, minji - } export default RacingController; From 0dcbc5f1d007d498cda12313739cd09a9cae290f Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 23:23:21 +0900 Subject: [PATCH 30/32] =?UTF-8?q?feat(controller):=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=EC=B6=9C=EB=A0=A5=ED=95=98=EA=B8=B0=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index c13a1b546..86071105b 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -8,7 +8,8 @@ class RacingController { async racing() { const carNamesObject = await this.getCarNamesObject(); const tryNumber = await this.getTryNumber(); - this.startCarRacing(carNamesObject, tryNumber); + const carRacingResult = this.startCarRacing(carNamesObject, tryNumber); + this.printWinner(carRacingResult); return; } @@ -85,14 +86,29 @@ class RacingController { } // 전진하는 조건은 무작위 값이 4 이상일 경우이다. 이 조건으로 게임을 시작한다. + // 6. 게임 진행 상황을 출력할 때 자동차 이름을 같이 출력한다. startCarRacing(carNamesObject, tryNumber) { + let racingResult = carNamesObject; for (let i = 0; i < tryNumber; i++) { - const racingResult = carNamesObject.map((object) => { + racingResult = racingResult.map((object) => { if (this.getRandomNumber() > 4) object.forward += 1; return object; }); this.printGameProgress(racingResult); } + return racingResult; + } + + // 7. 우승자 출력하기 + printWinner(carRacingResult) { + const maxForwardNumber = Math.max( + ...carRacingResult.map((object) => object.forward) + ); + const winnerArray = carRacingResult + .filter((object) => object.forward === maxForwardNumber) + .map((object) => object.name); + const winner = winnerArray.join(", "); + return MissionUtils.Console.print(`최종우승자 : ${winner}`); } } From be1773b79be1355cde3f6c433e6afa9a21acfa1d Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 23:37:16 +0900 Subject: [PATCH 31/32] =?UTF-8?q?fix(validation):=20import=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD,=20forEach=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/validation/functions/validateFiveLength.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/validation/functions/validateFiveLength.js b/src/validation/functions/validateFiveLength.js index 0231f3a4a..08d3364d5 100644 --- a/src/validation/functions/validateFiveLength.js +++ b/src/validation/functions/validateFiveLength.js @@ -1,15 +1,16 @@ import ERROR_MESSAGES from "../../constants/errorMessages.js"; -import makeArrayFromString from "../../utils/makeArrayFormString.js"; +import makeArrayFromString from "../../utils/makeArrayFromString.js"; const validateFiveLength = (value) => { const carNamesArray = makeArrayFromString(value); - carNamesArray.map((carName) => { - if (carName.length > 5) + carNamesArray.forEach((carName) => { + if (carName.length > 5) { throw new Error(ERROR_MESSAGES.VALIDATE_FIVE_LENGTH); - return carName; + } }); - + return true; }; export default validateFiveLength; + From 0d7efeda0db41ee3b3782e71269a7aac4161c013 Mon Sep 17 00:00:00 2001 From: BoRamSon Date: Sat, 23 Nov 2024 23:37:40 +0900 Subject: [PATCH 32/32] =?UTF-8?q?chore(controller):=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/RacingController.js | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/controller/RacingController.js b/src/controller/RacingController.js index 86071105b..027d615aa 100644 --- a/src/controller/RacingController.js +++ b/src/controller/RacingController.js @@ -15,7 +15,8 @@ class RacingController { async getCarNamesObject() { const carNames = await this.readCarNames(); - const validatedCarNames = this.validationCarNames(carNames); + const stringType = String(carNames); + const validatedCarNames = this.validationCarNames(stringType); const carNamesArray = makeArrayFromString(validatedCarNames); MissionUtils.Console.print(""); return makeObjectFromArray(carNamesArray); @@ -28,8 +29,6 @@ class RacingController { return Number(validtedTryNumber); } - //----------------------------------------------------------------- - // 1. 경주할 자동차 이름을 쉼표(,)기준으로 구분하여 각각 5자 이하로만 입력받는다. async readCarNames() { const inputCarNames = await MissionUtils.Console.readLineAsync( "경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분) \n => " @@ -39,13 +38,11 @@ class RacingController { return removeSpace; } - // 2. 입력받은 자동차 이름값들을 검증한다. validationCarNames(validationTarget) { validateCarNames(validationTarget); return validationTarget; } - // 3. 시도할 횟수를 입력받는다. async readTryNumbers() { const inputCarNames = await MissionUtils.Console.readLineAsync( "시도할 횟수는 몇 회인가요? \n => " @@ -54,19 +51,15 @@ class RacingController { return removeSpace; } - // 4. 입력받은 시도할 홧수를 검증한다. validationTryNumber(validationTarget) { validateTryNumber(validationTarget); return validationTarget; } - // 5. 게임 진행 - // 0에서 9 사이에서 무작위 값을 구한다. getRandomNumber() { return MissionUtils.Random.pickNumberInRange(0, 9); } - // (forward 숫자를 dashe로 만들어주는 util) changeDashUtil(number) { let dash = ""; for (let i = 0; i < number; i++) { @@ -75,7 +68,6 @@ class RacingController { return dash; } - // (print게임진행상황) printGameProgress(object) { object.map((array) => { const carName = array.name; @@ -85,8 +77,6 @@ class RacingController { MissionUtils.Console.print(""); } - // 전진하는 조건은 무작위 값이 4 이상일 경우이다. 이 조건으로 게임을 시작한다. - // 6. 게임 진행 상황을 출력할 때 자동차 이름을 같이 출력한다. startCarRacing(carNamesObject, tryNumber) { let racingResult = carNamesObject; for (let i = 0; i < tryNumber; i++) { @@ -99,7 +89,6 @@ class RacingController { return racingResult; } - // 7. 우승자 출력하기 printWinner(carRacingResult) { const maxForwardNumber = Math.max( ...carRacingResult.map((object) => object.forward)