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 한다. diff --git a/src/App.js b/src/App.js index c38b30d5b..b52419d14 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,26 @@ +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 game = new Game(); + + 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; + } + } + } + } } export default App; diff --git a/src/Game.js b/src/Game.js new file mode 100644 index 000000000..ac0fb7a86 --- /dev/null +++ b/src/Game.js @@ -0,0 +1,45 @@ +import { Console } from "@woowacourse/mission-utils"; +import { createNumber } from "./createNumber.js"; + +class Game { + constructor() { + this.computer = createNumber(); + this.ball = 0; + this.strike = 0; + } + resetCount() { + this.ball = 0; + this.strike = 0; + } + + countBallandStrike(user) { + this.computer.map((num, idx) => { + if (num === user[idx]) { + this.strike++; + } else if (this.computer.includes(user[idx])) { + this.ball++; + } + }); + } + + checkNumbers(numbers) { + this.resetCount(); + this.countBallandStrike(numbers); + + if (this.strike === 3) { + Console.print("3스트라이크"); + Console.print("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + return true; + } else if (this.strike === 0 && this.ball === 0) { + Console.print("낫싱"); + } 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; + } +} +export default Game; diff --git a/src/createNumber.js b/src/createNumber.js new file mode 100644 index 000000000..cc996a568 --- /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; +}; diff --git a/src/getInput.js b/src/getInput.js new file mode 100644 index 000000000..34ff14b70 --- /dev/null +++ b/src/getInput.js @@ -0,0 +1,24 @@ +import { Console } from "@woowacourse/mission-utils"; + +export const getNumber = async () => { + const INPUT = await Console.readLineAsync("숫자를 입력해주세요 : "); + + let numbers = []; + numbers = INPUT.split("").map(Number); + + if (new Set(numbers).size !== 3) { + throw new Error("[ERROR] 잘못된 입력입니다."); + } + return numbers; +}; + +export const getContinueGame = async () => { + const INPUT = await Console.readLineAsync( + "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n" + ); + if (INPUT === "1" || INPUT === "2") { + return INPUT; + } else { + throw new Error("[ERROR] 잘못된 입력입니다."); + } +};