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
5 changes: 5 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions .idea/javascript-baseball-6.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,33 @@
## 구현할 기능 목록
-게임의 전반적인 흐름을 관리하고, 사용자 입력 처리 및 게임 상태 제어 기능(게임 플레이 관련 로직)
-무작위 숫자를 생성해서 저장하는 기능(정답 생성 기능)
-사용자가 입력(추측)한 값과 실제 정답을 비교하여 계산 하는 기능

## 커밋 컨벤션

`Feat` : 새로운 기능 추가

`Fix` : 버그 수정

`Style` : 스타일 수정(코드 형식, 세미콜론 추가: 로직에 변화X)

`Docs` : 문서 수정(문서 추가, 수정, 삭제: 디렉토리도 O)

`Chore` : 패키지 추가, 셋팅 관련(빌드 스크립트, 패키지 변동사항)

`Test` : 테스트 코드 추가(Storybook 관련 코드가 될 것으로 예상)

`Refactor` : 코드 리펙토링


## 커밋 예시
> Chore: 커밋 메시지가 들어갑니다.

> Feat: 커밋 메시지가 들어갑니다.

> Style: 커밋 메시지가 들어갑니다.


# 미션 - 숫자 야구

## 🔍 진행 방식
Expand Down
78 changes: 77 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,81 @@
import {MissionUtils} from "@woowacourse/mission-utils";

class App {
async play() {}
constructor() {
this.randomNumbers = this.generateRandomNumbers();
}

generateRandomNumbers() {
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let result = [];
while (result.length < 3) {
const randomNum = MissionUtils.Random.pickNumberInRange(1, 9);
if (!result.includes(randomNum)) {
result.push(randomNum);
}
}
return result;

}
checkGuess(guess) {
let strike = 0;
let ball = 0;

for (let i = 0; i < 3; i++) {
if (guess[i] === this.randomNumbers[i]) {
strike++;
} else if (this.randomNumbers.includes(guess[i])) {
ball++;
}
}

if (strike === 0 && ball === 0) {
return '낫싱';
} else if (strike === 3) {
return '3스트라이크';
} else {
return `${ball ? ball + '볼' : ''} ${strike ? strike + '스트라이크' : ''}`.trim();
}
}

validateInput(input) {
if (input.length !== 3) throw new Error("[ERROR] 3자리의 숫자를 입력해주세요.");
if (new Set(input).size !== 3) throw new Error("[ERROR] 서로 다른 숫자를 입력해주세요.");
for (let num of input) {
if (num < 1 || num > 9) throw new Error("[ERROR] 1부터 9까지의 숫자만 입력 가능합니다.");
}
}
async play() {
try {
MissionUtils.Console.print("숫자 야구 게임을 시작합니다.");
while (true) {
const userInput = await MissionUtils.Console.readLineAsync("숫자를 입력해주세요 : ");
const guess = Array.from(userInput).map(Number);

this.validateInput(guess);
const result = this.checkGuess(guess);
MissionUtils.Console.print(result);

if (result === '3스트라이크') {
MissionUtils.Console.print("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
const restart = await MissionUtils.Console.readLineAsync("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
if (restart === '1') {
this.randomNumbers = this.generateRandomNumbers();
MissionUtils.Console.print("숫자 야구 게임을 시작합니다.");
continue;
} else if (restart === '2') {
return;
} else {
throw new Error("[ERROR] 1 또는 2만 입력해주세요.");
}
}
}
} catch (error) {
MissionUtils.Console.print(error.message);
throw error;
}
}

}

export default App;