From c41634e112049f403bdf7d4c4ff1416e0909b757 Mon Sep 17 00:00:00 2001 From: mjmj0217 Date: Wed, 26 Jul 2023 22:40:10 +0900 Subject: [PATCH 1/6] docs : update readme --- docs/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb..b4eda6263 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,19 @@ +# 기능 목록 + +### 기능 + +- [ ] 게임 시작하기 +- [ ] 임의의 숫자 3개 생성하기 +- [ ] 임의의 숫자 입력받기 +- [ ] 스트라이크/볼/낫싱 판별 +- [ ] 결과 출력하기 +- [ ] 게임 재시작/종료 입력받기 +- [ ] 게임 재시작/종료하기 + +### 예외 + +- [ ] 숫자가 아닌 입력을 받은 경우 +- [ ] 3개 초과/미만의 숫자를 입력받은 경우 +- [ ] 재시작/종료의 경우 1,2 이외의 값을 입력받은 경우 +- [ ] 중복된 숫자를 입력받은 경우 +- [ ] 숫자를 이상하게 입력한 경우(1,2,3 or 1 2 3) From e0dc59b24477c2077defbc99767bc354426af026 Mon Sep 17 00:00:00 2001 From: mjmj0217 Date: Wed, 26 Jul 2023 22:41:05 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat=20:=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=8B=B4=EB=8B=B9=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/GameConsole.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/GameConsole.js diff --git a/src/GameConsole.js b/src/GameConsole.js new file mode 100644 index 000000000..8c360c9ef --- /dev/null +++ b/src/GameConsole.js @@ -0,0 +1,50 @@ +const { Console } = require("@woowacourse/mission-utils"); + +class GameConsole { + #outputs = { + START_MESSAGE: "숫자 야구 게임을 시작합니다.", + REQUIRE_NUMBERS: "숫자를 입력해주세요 : ", + REQUIRE_CMD: "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.", + END_MESSAGE: "3개의 숫자를 모두 맞히셨습니다! 게임 종료", + }; + + printStart() { + Console.print(this.#outputs.START_MESSAGE); + } + printResult(strike, ball) { + if (strike === 0 && ball === 0) { + Console.print("낫싱"); + return; + } + if (strike === 0) { + Console.print(ball + "볼"); + return; + } + if (ball === 0) { + Console.print(strike + "스트라이크"); + return; + } + Console.print(`${ball}볼 ${strike}스트라이크`); + } + + printEnd() { + Console.print(this.#outputs.END_MESSAGE); + } + + inputNumbers(callback) { + Console.readLine(this.#outputs.REQUIRE_NUMBERS, (numbers) => { + //validate input + return callback(numbers); + }); + } + inputCmd(callback) { + Console.readLine(this.#outputs.REQUIRE_CMD, (cmd) => { + //validate input + return callback(cmd); + }); + } +} + +module.exports = { + GameConsole, +}; From bb2f35cc53b3cb228c7fc628fd1f269e5daf6168 Mon Sep 17 00:00:00 2001 From: mjmj0217 Date: Sun, 30 Jul 2023 00:04:53 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat=20:=20=EC=9E=85=EB=A0=A5=EA=B0=92=20va?= =?UTF-8?q?lidator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Validator.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/Validator.js diff --git a/src/Validator.js b/src/Validator.js new file mode 100644 index 000000000..acd1a1de4 --- /dev/null +++ b/src/Validator.js @@ -0,0 +1,24 @@ +const { Console } = require("@woowacourse/mission-utils"); + +function validateNumbersInput(numbers) { + if (numbers.length != 3) { + Console.close(); + throw new Error("잘못된 입력입니다."); + } + if (isNaN(numbers)) { + throw new Error("숫자만 입력해주세요."); + } + for (idx in numbers) { + if (numbers.indexOf(numbers[idx]) !== Number(idx)) { + throw new Error("중복된 숫자가 있습니다."); + } + } +} + +function validateCmdInput(cmd) { + if (cmd !== "1" && cmd !== "2") { + throw new Error("잘못된 입력입니다."); + } +} + +module.exports = { validateCmdInput, validateNumbersInput }; From da1ee00417f6d88b39cd2617b8e8f4e04e96fcd0 Mon Sep 17 00:00:00 2001 From: mjmj0217 Date: Sun, 30 Jul 2023 00:09:25 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat=20:=20=EC=9E=85=EB=A0=A5=EA=B0=92=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/GameConsole.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/GameConsole.js b/src/GameConsole.js index 8c360c9ef..de683d903 100644 --- a/src/GameConsole.js +++ b/src/GameConsole.js @@ -1,4 +1,5 @@ const { Console } = require("@woowacourse/mission-utils"); +const { validateCmdInput, validateNumbersInput } = require("./Validator"); class GameConsole { #outputs = { @@ -33,13 +34,13 @@ class GameConsole { inputNumbers(callback) { Console.readLine(this.#outputs.REQUIRE_NUMBERS, (numbers) => { - //validate input + validateNumbersInput(numbers); return callback(numbers); }); } inputCmd(callback) { Console.readLine(this.#outputs.REQUIRE_CMD, (cmd) => { - //validate input + validateCmdInput(cmd); return callback(cmd); }); } From c9298e39fcf28f4c05507b7b5831d09ed58eb069 Mon Sep 17 00:00:00 2001 From: mjmj0217 Date: Sun, 30 Jul 2023 00:09:45 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=EC=95=BC=EA=B5=AC=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BaseballGame.js | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/BaseballGame.js diff --git a/src/BaseballGame.js b/src/BaseballGame.js new file mode 100644 index 000000000..0fd5f8175 --- /dev/null +++ b/src/BaseballGame.js @@ -0,0 +1,95 @@ +const { Console, Random } = require("@woowacourse/mission-utils"); +const { GameConsole } = require("./GameConsole"); + +class BaseballGame { + #answer; + #inputNumbers; + #strikeCnt; + #ballCnt; + #console; + + constructor() { + this.#answer = null; + this.#inputNumbers = null; + this.#strikeCnt = null; + this.#ballCnt = null; + this.#console = new GameConsole(); + } + + start() { + this.#makeRandomNumbers(); + this.#console.printStart(); + this.#getUserInput(); + } + + exit() { + Console.close(); + } + + restart() { + this.#answer = null; + this.#inputNumbers = null; + this.#strikeCnt = null; + this.#ballCnt = null; + this.#makeRandomNumbers(); + this.#getUserInput(); + } + + #checkStrikeCnt() { + let cnt = 0; + for (let i = 0; i < 3; i += 1) { + if (this.#answer[i] === Number(this.#inputNumbers[i])) cnt += 1; + } + this.#strikeCnt = cnt; + } + #checkBallCnt() { + let cnt = 0; + this.#inputNumbers.forEach((v, i) => { + if (Number(v) === this.#answer[0] && i !== 0) cnt++; + if (Number(v) === this.#answer[1] && i !== 1) cnt++; + if (Number(v) === this.#answer[2] && i !== 2) cnt++; + }); + + this.#ballCnt = cnt; + } + #getUserInput() { + this.#console.inputNumbers(this.#userNumberAfterFunc.bind(this)); + } + #userNumberAfterFunc(numbers) { + this.#inputNumbers = numbers.split(""); + this.#matchWithAnswer(); + } + #cmdAfterFunc(cmd) { + if (cmd === "1") this.restart(); + if (cmd === "2") this.exit(); + } + #makeRandomNumbers() { + const computer = []; + while (computer.length < 3) { + const number = Random.pickNumberInRange(1, 9); + if (!computer.includes(number)) { + computer.push(number); + } + } + this.#answer = computer; + console.log(this.#answer); // 확인용 + } + + #matchWithAnswer() { + this.#checkStrikeCnt(); + this.#checkBallCnt(); + + this.#console.printResult(this.#strikeCnt, this.#ballCnt); + + if (this.#strikeCnt === 3) { + this.#console.printEnd(); + this.#console.inputCmd(this.#cmdAfterFunc.bind(this)); + return; + } + this.#getUserInput(); + } +} + +module.exports = { + BaseballGame, +}; From f9fb25cf2f448f2ee7cfd53645c011b8fda9b595 Mon Sep 17 00:00:00 2001 From: mjmj0217 Date: Sun, 30 Jul 2023 00:10:06 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat:=20=EC=95=BC=EA=B5=AC=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20app=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index f53916abe..ee9f6a3c1 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,13 @@ +const { BaseballGame } = require("./BaseballGame"); + class App { - play() {} + play() { + const game = new BaseballGame(); + game.start(); + } } +const app = new App(); +app.play(); + module.exports = App;