Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -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 한다.
23 changes: 22 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -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;
45 changes: 45 additions & 0 deletions src/Game.js
Original file line number Diff line number Diff line change
@@ -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;
13 changes: 13 additions & 0 deletions src/createNumber.js
Original file line number Diff line number Diff line change
@@ -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;
};
24 changes: 24 additions & 0 deletions src/getInput.js
Original file line number Diff line number Diff line change
@@ -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] 잘못된 입력입니다.");
}
};