From ef96f31ff9e6bd0d6c7d0cfe50e7ffdd537749fe Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 21:47:59 +0900 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20=EC=88=AB=EC=9E=90=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20=ED=95=A8=EC=88=98=20getInput?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/getInput.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/getInput.js diff --git a/src/getInput.js b/src/getInput.js new file mode 100644 index 000000000..669b20a3c --- /dev/null +++ b/src/getInput.js @@ -0,0 +1,8 @@ +import { Console } from "@woowacourse/mission-utils"; + +export const getNumber = async () => { + const input = await Console.readLineAsync("숫자를 입력해주세요 : "); + + let numbers = []; + numbers = input.split("").map(Number); +}; From a7eeffa93372f30ca4b063c13decdec8f7732bd8 Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 21:48:21 +0900 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20createNumber=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/createNumber.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/createNumber.js diff --git a/src/createNumber.js b/src/createNumber.js new file mode 100644 index 000000000..e0a8a9c5f --- /dev/null +++ b/src/createNumber.js @@ -0,0 +1,13 @@ +import { Random } from "@woowacourse/mission-utils"; + +export const createNumber = () => { + const computer = []; + for (let i = 0; i < 3; ) { + const number = Random.pickNumberInRange(1, 9); + if (!computer.includes(number)) { + computer.push(number); + i++; + } + } + return computer; +}; From 62ea5bece08222dcd343f8b04a4eb96aaffab7c4 Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 22:41:05 +0900 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20Game=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=B0=8F=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Game.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/Game.js diff --git a/src/Game.js b/src/Game.js new file mode 100644 index 000000000..2cdd8f07e --- /dev/null +++ b/src/Game.js @@ -0,0 +1,50 @@ +import { Console } from "@woowacourse/mission-utils"; +import { createNumber } from "./createNumber.js"; + +class Game { + constructor() { + this.computer = createNumber(); + } + + countBall(numbers) { + let ball = 0; + numbers.map((num, idx) => { + if (num === this.computer[idx]) { + ball++; + } + }); + return ball; + } + + countStrike(numbers) { + let strike = 0; + numbers.map((num, idx) => { + if (this.computer.includes(num) && this.computer.indexOf(num) != idx) { + strike++; + } + }); + return strike; + } + + checkNumbers(numbers) { + let ball = this.countBall(numbers); + let strike = this.countStrike(numbers); + console.log("computer: ", this.computer); + + if (strike === 3) { + Console.print("3스트라이크"); + Console.print("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + return true; + } else if (strike === 0 && ball === 0) { + Console.print("낫싱"); + } else if (strike > 0 && ball > 0) { + Console.print(`${ball}볼 ${strike}스트라이크`); + } else if (strike === 0 && ball > 0) { + Console.print(`${ball}볼`); + } else if (strike > 0 && ball === 0) { + Console.print(`${strike}스트라이크`); + } + return false; + } +} +export default Game; From 91a400397b2ec6acdcf00e2b95ea39e67628e7cd Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 22:50:23 +0900 Subject: [PATCH 04/12] =?UTF-8?q?fix:=20=EC=8A=A4=ED=8A=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=81=AC,=20=EB=B3=BC=20=EC=B9=B4=EC=9A=B4=ED=8A=B8?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Game.js | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/src/Game.js b/src/Game.js index 2cdd8f07e..a232b8969 100644 --- a/src/Game.js +++ b/src/Game.js @@ -4,45 +4,41 @@ import { createNumber } from "./createNumber.js"; class Game { constructor() { this.computer = createNumber(); + this.ball = 0; + this.strike = 0; } - - countBall(numbers) { - let ball = 0; - numbers.map((num, idx) => { - if (num === this.computer[idx]) { - ball++; - } - }); - return ball; + resetCount() { + this.ball = 0; + this.strike = 0; } - countStrike(numbers) { - let strike = 0; - numbers.map((num, idx) => { - if (this.computer.includes(num) && this.computer.indexOf(num) != idx) { - strike++; + countBallandStrike(user) { + this.computer.map((num, idx) => { + if (num === user[idx]) { + this.strike++; + } else if (this.computer.includes(user[idx])) { + this.ball++; } }); - return strike; } checkNumbers(numbers) { - let ball = this.countBall(numbers); - let strike = this.countStrike(numbers); console.log("computer: ", this.computer); + this.resetCount(); + this.countBallandStrike(numbers); - if (strike === 3) { + if (this.strike === 3) { Console.print("3스트라이크"); Console.print("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); return true; - } else if (strike === 0 && ball === 0) { + } else if (this.strike === 0 && this.ball === 0) { Console.print("낫싱"); - } else if (strike > 0 && ball > 0) { - Console.print(`${ball}볼 ${strike}스트라이크`); - } else if (strike === 0 && ball > 0) { - Console.print(`${ball}볼`); - } else if (strike > 0 && ball === 0) { - Console.print(`${strike}스트라이크`); + } else if (this.strike > 0 && this.ball > 0) { + Console.print(`${this.ball}볼 ${this.strike}스트라이크`); + } else if (this.strike === 0 && this.ball > 0) { + Console.print(`${this.ball}볼`); + } else if (this.strike > 0 && this.ball === 0) { + Console.print(`${this.strike}스트라이크`); } return false; } From 2dc91e517924b3fa4d0b62ad063d823605eee3df Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 22:54:16 +0900 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=80?= =?UTF-8?q?=EC=86=8D=20=EC=97=AC=EB=B6=80=20=EB=AC=BB=EB=8A=94=20getContin?= =?UTF-8?q?ue=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/getInput.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/getInput.js b/src/getInput.js index 669b20a3c..aabebbb2c 100644 --- a/src/getInput.js +++ b/src/getInput.js @@ -5,4 +5,20 @@ export const getNumber = async () => { let numbers = []; numbers = input.split("").map(Number); + return numbers; +}; + +export const getContinueGame = async () => { + let input; + while (1) { + input = await Console.readLineAsync( + "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n" + ); + if (input === "1" || input === "2") { + break; + } else { + Console.print("잘못된 입력입니다."); + } + } + return input; }; From 38e977b23fb2373e8e268748359492702d26e3df Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 22:57:30 +0900 Subject: [PATCH 06/12] =?UTF-8?q?fix:=20getContinue=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9E=98=EB=AA=BB=EB=90=9C=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20throw?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/getInput.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/getInput.js b/src/getInput.js index aabebbb2c..deb7b1ca0 100644 --- a/src/getInput.js +++ b/src/getInput.js @@ -15,10 +15,9 @@ export const getContinueGame = async () => { "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n" ); if (input === "1" || input === "2") { - break; + return input; } else { - Console.print("잘못된 입력입니다."); + throw new Error("[ERROR] 잘못된 입력입니다."); } } - return input; }; From 534b1793b700c718f1a07706aa46fc5bcc90dc38 Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 22:59:06 +0900 Subject: [PATCH 07/12] =?UTF-8?q?fix:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20throw?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/getInput.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/getInput.js b/src/getInput.js index deb7b1ca0..628ca2558 100644 --- a/src/getInput.js +++ b/src/getInput.js @@ -5,6 +5,10 @@ export const getNumber = async () => { let numbers = []; numbers = input.split("").map(Number); + + if (new Set(numbers).size !== 3) { + throw new Error("[ERROR] 잘못된 입력입니다."); + } return numbers; }; From 7d4b492b7bdab375987ff53e219c03a5e096bbb0 Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 22:59:46 +0900 Subject: [PATCH 08/12] =?UTF-8?q?chore:=20=ED=99=95=EC=9D=B8=EC=9A=A9=20co?= =?UTF-8?q?nsole.log=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Game.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Game.js b/src/Game.js index a232b8969..ac0fb7a86 100644 --- a/src/Game.js +++ b/src/Game.js @@ -23,7 +23,6 @@ class Game { } checkNumbers(numbers) { - console.log("computer: ", this.computer); this.resetCount(); this.countBallandStrike(numbers); From 53ffef112b3695f74ad10be4f76731912b93c4c7 Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 23:00:52 +0900 Subject: [PATCH 09/12] =?UTF-8?q?feat:=20App.js=EC=97=90=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A0=9C=EC=96=B4=20=EB=A1=9C=EC=A7=81=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/App.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index c38b30d5b..4f1ae97ef 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,27 @@ +import { Console } from "@woowacourse/mission-utils"; +import Game from "./Game.js"; +import { getContinueGame, getNumber } from "./getInput.js"; + class App { - async play() {} + async play() { + Console.print("숫자 야구 게임을 시작합니다."); + + let play = true; + let game = new Game(); + + while (play) { + const numbers = await getNumber(); + const result = game.checkNumbers(numbers); + if (result) { + let restart = await getContinueGame(); + if (restart === "1") { + game = new Game(); + } else { + break; + } + } + } + } } export default App; From a04c0b5145481ef29bff855f122ab9bcb15491db Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 23:03:40 +0900 Subject: [PATCH 10/12] =?UTF-8?q?fix:=20getContinueGame=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20while=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/getInput.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/getInput.js b/src/getInput.js index 628ca2558..8fa235775 100644 --- a/src/getInput.js +++ b/src/getInput.js @@ -13,15 +13,12 @@ export const getNumber = async () => { }; export const getContinueGame = async () => { - let input; - while (1) { - input = await Console.readLineAsync( - "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n" - ); - if (input === "1" || input === "2") { - return input; - } else { - throw new Error("[ERROR] 잘못된 입력입니다."); - } + const input = await Console.readLineAsync( + "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n" + ); + if (input === "1" || input === "2") { + return input; + } else { + throw new Error("[ERROR] 잘못된 입력입니다."); } }; From 84e03183d9ab4eaaeb60874398eac444962e66bd Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 23:09:04 +0900 Subject: [PATCH 11/12] =?UTF-8?q?fix:=20=EC=83=81=EC=88=98=20snake=20case?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 13 ++++++------- src/createNumber.js | 10 +++++----- src/getInput.js | 10 +++++----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/App.js b/src/App.js index 4f1ae97ef..b52419d14 100644 --- a/src/App.js +++ b/src/App.js @@ -6,15 +6,14 @@ class App { async play() { Console.print("숫자 야구 게임을 시작합니다."); - let play = true; let game = new Game(); - while (play) { - const numbers = await getNumber(); - const result = game.checkNumbers(numbers); - if (result) { - let restart = await getContinueGame(); - if (restart === "1") { + while (1) { + const User = await getNumber(); + const RESULT = game.checkNumbers(User); + if (RESULT) { + const RESULT = await getContinueGame(); + if (RESULT === "1") { game = new Game(); } else { break; diff --git a/src/createNumber.js b/src/createNumber.js index e0a8a9c5f..cc996a568 100644 --- a/src/createNumber.js +++ b/src/createNumber.js @@ -1,13 +1,13 @@ import { Random } from "@woowacourse/mission-utils"; export const createNumber = () => { - const computer = []; + const COMPUTER = []; for (let i = 0; i < 3; ) { - const number = Random.pickNumberInRange(1, 9); - if (!computer.includes(number)) { - computer.push(number); + const NUMBER = Random.pickNumberInRange(1, 9); + if (!COMPUTER.includes(NUMBER)) { + COMPUTER.push(NUMBER); i++; } } - return computer; + return COMPUTER; }; diff --git a/src/getInput.js b/src/getInput.js index 8fa235775..34ff14b70 100644 --- a/src/getInput.js +++ b/src/getInput.js @@ -1,10 +1,10 @@ import { Console } from "@woowacourse/mission-utils"; export const getNumber = async () => { - const input = await Console.readLineAsync("숫자를 입력해주세요 : "); + const INPUT = await Console.readLineAsync("숫자를 입력해주세요 : "); let numbers = []; - numbers = input.split("").map(Number); + numbers = INPUT.split("").map(Number); if (new Set(numbers).size !== 3) { throw new Error("[ERROR] 잘못된 입력입니다."); @@ -13,11 +13,11 @@ export const getNumber = async () => { }; export const getContinueGame = async () => { - const input = await Console.readLineAsync( + const INPUT = await Console.readLineAsync( "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n" ); - if (input === "1" || input === "2") { - return input; + if (INPUT === "1" || INPUT === "2") { + return INPUT; } else { throw new Error("[ERROR] 잘못된 입력입니다."); } From bd9da7c03af2911ac59a12941dc22219e9c8ead3 Mon Sep 17 00:00:00 2001 From: jwoo08 Date: Wed, 25 Oct 2023 23:29:07 +0900 Subject: [PATCH 12/12] docs: readme.md --- docs/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..450121c50 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,18 @@ +## 클래스 및 함수 설명 + +- App.js: 게임의 메인 흐름이 진행되는 클래스 +- Game.js: 한 판의 게임에 대한 정보를 가지는 클래스 +- getInput.js: 사용자로부터 입력을 받는 async 함수를 포함 +- createNumber.js: 랜덤한 3개의 숫자 배열을 반환하는 함수를 포함 + +## 숫자 야구 게임 진행 + +- App.js에서 게임의 메인 흐름이 진행된다. +- 게임 한 판이 진행될 때마다 새로운 Game 인스턴스를 만든다. +- 사용자 입력을 받은 후 Game의 checkNumbers 메서드를 통해 결과를 출력한다. +- 정답을 맞춘 경우 getContinueGame 함수를 통해 진행 여부를 입력 받는다. + +## 에러 출력 + +1. getNumber 함수에서 사용자로부터 서로 다른 수로 이루어진 3자리 숫자가 아닌 경우 에러를 throw 한다. +2. getContinueGame 함수에서 1 또는 2가 아닌 입력을 받는 경우 에러를 throw 한다.