From d25be3d2f1827f1487886c468902cd218d8076a9 Mon Sep 17 00:00:00 2001 From: jungminji Date: Thu, 23 May 2024 02:31:16 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- REQUIREMENTS.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md index 44b50fda4..78e6ce509 100644 --- a/REQUIREMENTS.md +++ b/REQUIREMENTS.md @@ -2,19 +2,23 @@ ### 로또 -- [ ] 로또 1장의 가격은 1000원이다. +- [x] 로또 1장의 가격은 1000원이다. - [x] 로또 번호는 1~45 사이의 정수여야 한다. - [x] 로또 번호는 6개여야 한다. - [x] 로또 번호는 중복되면 안 된다. -- [ ] 보너스 번호는 당첨 번호와 중복될 수 없다. +- [x] 보너스 번호는 당첨 번호와 중복될 수 없다. ### 로또 게임 -- [ ] 구입 금액만큼 로또 발행한다. -- [ ] 수익률 계산 -- [ ] 당첨은 1등부터 5등까지 있다. +- [x] 구입 금액만큼 로또 발행한다. +- [x] 수익률 계산 +- [x] 당첨은 1등부터 5등까지 있다. ### 입출력 -- [ ] 당첨 번호화 보너스 번호를 입력할 수 있다. -- [ ] 수익룰 출력 +- [x] 당첨 번호화 보너스 번호를 입력할 수 있다. +- [x] 수익룰 출력 +- [ ] 로또는 오름차순으로 정렬하여 보여준다. +- [ ] 당첨 통계를 출력한 뒤에는 재시작/종료 여부를 입력받는다. + - [ ] 재시작할 경우 구입 금액 입력부터 게임 다시 시작 + - [ ] 종료하는 경우 그대로 프로그램 종료 From 045ad6874f45c7f6d49646f4ff439ae7003fb397 Mon Sep 17 00:00:00 2001 From: jungminji Date: Fri, 24 May 2024 00:31:43 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat=20:=20=EB=A1=9C=EB=98=90=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EC=98=A4=EB=A6=84=EC=B0=A8=EC=88=9C=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/domain/LottoMachine.js | 4 +--- src/js/domain/StatisticsLotto.js | 1 + src/js/view/output.js | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/js/domain/LottoMachine.js b/src/js/domain/LottoMachine.js index ac75d4e5e..c2f59ae92 100644 --- a/src/js/domain/LottoMachine.js +++ b/src/js/domain/LottoMachine.js @@ -8,9 +8,7 @@ class LottoMachine { generateLottoNumber() { return new Lotto( - Array(LottoMachine.LOTTO_LENGTH) - .fill() - .map(() => this.#generateRandomNumbers()) + Array(LottoMachine.LOTTO_LENGTH).fill().map(this.#generateRandomNumbers) ); } diff --git a/src/js/domain/StatisticsLotto.js b/src/js/domain/StatisticsLotto.js index 0808868d8..4ba4ca7c0 100644 --- a/src/js/domain/StatisticsLotto.js +++ b/src/js/domain/StatisticsLotto.js @@ -6,6 +6,7 @@ const PRIZES = { FIFTH: { count: 0, amount: 5000, match: 3 }, // 5등 : 3개 번호 일치 }; +// PRIZE_MAP 내부를 수정하지 않고 각 등수별 count를 얻는 방법이 없을까 const PRIZE_MAP = [ { when: ({ hit, bonus }) => hit === 6, match: PRIZES.FIRST }, { when: ({ hit, bonus }) => hit === 5 && bonus, match: PRIZES.SECOND }, diff --git a/src/js/view/output.js b/src/js/view/output.js index 2cc6e4aaf..ec1c1e89d 100644 --- a/src/js/view/output.js +++ b/src/js/view/output.js @@ -3,7 +3,7 @@ export function printCount(count) { } export function printLottoNumber(lottoNumbers) { - console.log(lottoNumbers); + console.log(lottoNumbers.sort((a, b) => a - b)); } export function printStatisticsLotto(prizes) { From a8844b42825deb1ae62e39e421836337c6fe692f Mon Sep 17 00:00:00 2001 From: jungminji Date: Fri, 24 May 2024 02:23:42 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat=20:=20=EC=9E=AC=EC=8B=9C=EC=9E=91=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- REQUIREMENTS.md | 6 +++--- src/js/domain/StatisticsLotto.js | 21 ++++++++++++--------- src/js/view/output.js | 10 +++++----- src/step-console-index.js | 15 +++++++++++++++ 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md index 78e6ce509..926def3ec 100644 --- a/REQUIREMENTS.md +++ b/REQUIREMENTS.md @@ -19,6 +19,6 @@ - [x] 당첨 번호화 보너스 번호를 입력할 수 있다. - [x] 수익룰 출력 - [ ] 로또는 오름차순으로 정렬하여 보여준다. -- [ ] 당첨 통계를 출력한 뒤에는 재시작/종료 여부를 입력받는다. - - [ ] 재시작할 경우 구입 금액 입력부터 게임 다시 시작 - - [ ] 종료하는 경우 그대로 프로그램 종료 +- [x] 당첨 통계를 출력한 뒤에는 재시작/종료 여부를 입력받는다. + - [x] 재시작할 경우 구입 금액 입력부터 게임 다시 시작 + - [x] 종료하는 경우 그대로 프로그램 종료 diff --git a/src/js/domain/StatisticsLotto.js b/src/js/domain/StatisticsLotto.js index 4ba4ca7c0..44ec7420c 100644 --- a/src/js/domain/StatisticsLotto.js +++ b/src/js/domain/StatisticsLotto.js @@ -6,13 +6,12 @@ const PRIZES = { FIFTH: { count: 0, amount: 5000, match: 3 }, // 5등 : 3개 번호 일치 }; -// PRIZE_MAP 내부를 수정하지 않고 각 등수별 count를 얻는 방법이 없을까 const PRIZE_MAP = [ - { when: ({ hit, bonus }) => hit === 6, match: PRIZES.FIRST }, - { when: ({ hit, bonus }) => hit === 5 && bonus, match: PRIZES.SECOND }, - { when: ({ hit, bonus }) => hit === 5 && !bonus, match: PRIZES.THIRD }, - { when: ({ hit, bonus }) => hit === 4, match: PRIZES.FOURTH }, - { when: ({ hit, bonus }) => hit === 3, match: PRIZES.FIFTH }, + { when: ({ hit, bonus }) => hit === 6, match: "FIRST" }, + { when: ({ hit, bonus }) => hit === 5 && bonus, match: "SECOND" }, + { when: ({ hit, bonus }) => hit === 5 && !bonus, match: "THIRD" }, + { when: ({ hit, bonus }) => hit === 4, match: "FOURTH" }, + { when: ({ hit, bonus }) => hit === 3, match: "FIFTH" }, ]; class StatisticsLotto { @@ -27,12 +26,10 @@ class StatisticsLotto { const prize = PRIZE_MAP.find(({ when }) => when({ hit, bonus })); if (prize) { - prize.match.count++; + this.#prizes[prize.match].count++; } this.#calculateReceiveMoney(this.#prizes); - - return prize; } #calculateReceiveMoney(prizes) { @@ -51,6 +48,12 @@ class StatisticsLotto { getPrizes() { return this.#prizes; } + + resetCounts() { + Object.values(this.#prizes).forEach((prize) => { + prize.count = 0; + }); + } } export { StatisticsLotto }; diff --git a/src/js/view/output.js b/src/js/view/output.js index ec1c1e89d..0d9174603 100644 --- a/src/js/view/output.js +++ b/src/js/view/output.js @@ -11,19 +11,19 @@ export function printStatisticsLotto(prizes) { console.log("--------------------"); console.log( - `${prizes.FIFTH.match}개 일치 (5,000원) - ${prizes.FIFTH.count}개` + `${prizes.FIFTH.count}개 일치 (5,000원) - ${prizes.FIFTH.count}개` ); console.log( - `${prizes.FOURTH.match}개 일치 (50,000원) - ${prizes.FOURTH.count}개` + `${prizes.FOURTH.count}개 일치 (50,000원) - ${prizes.FOURTH.count}개` ); console.log( - `${prizes.THIRD.match}개 일치 (1,500,000원) - ${prizes.THIRD.count}개` + `${prizes.THIRD.count}개 일치 (1,500,000원) - ${prizes.THIRD.count}개` ); console.log( - `${prizes.SECOND.match}개 일치, 보너스 볼 일치 (30,000,000원) - ${prizes.SECOND.count}개` + `${prizes.SECOND.count}개 일치, 보너스 볼 일치 (30,000,000원) - ${prizes.SECOND.count}개` ); console.log( - `${prizes.FIRST.match}개 일치 (2,000,000,000원) - ${prizes.FIRST.count}개` + `${prizes.FIRST.count}개 일치 (2,000,000,000원) - ${prizes.FIRST.count}개` ); } diff --git a/src/step-console-index.js b/src/step-console-index.js index ea152baf4..e7fa91b69 100644 --- a/src/step-console-index.js +++ b/src/step-console-index.js @@ -45,6 +45,21 @@ async function play() { // 총 수익률 출력 const rateOfReturn = statisticsLotto.calculateRateOfReturn(purchase); printRateOfReturn(rateOfReturn); + + await reply(statisticsLotto); // play 함수가 끝난 후 reply를 호출 +} + +async function reply(statisticsLotto) { + const replyAnswer = await readLineAsync("\n> 다시 시작하시겠습니까? (y/n)\n"); + + if (isReply(replyAnswer)) { + statisticsLotto.resetCounts(); + await play(); + } +} + +function isReply(replyAnswer) { + return replyAnswer === "y"; } play(); From fc41157ca8452deff2f5133fba484f6f12e200e8 Mon Sep 17 00:00:00 2001 From: jungminji Date: Sat, 25 May 2024 01:03:30 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat=20:=20=EC=9E=98=EB=AA=BB=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=ED=95=A0=20=EA=B2=BD=EC=9A=B0,=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=20=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- REQUIREMENTS.md | 1 + src/step-console-index.js | 34 ++++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md index 926def3ec..5fa29879f 100644 --- a/REQUIREMENTS.md +++ b/REQUIREMENTS.md @@ -13,6 +13,7 @@ - [x] 구입 금액만큼 로또 발행한다. - [x] 수익률 계산 - [x] 당첨은 1등부터 5등까지 있다. +- [x] 사용자가 잘못된 값을 입력한 경우 throw문을 사용해 예외를 발생시키고, 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다. ### 입출력 diff --git a/src/step-console-index.js b/src/step-console-index.js index e7fa91b69..bd44e0fca 100644 --- a/src/step-console-index.js +++ b/src/step-console-index.js @@ -10,26 +10,36 @@ import { WinningLotto } from "./js/domain/WinningLotto.js"; import { StatisticsLotto } from "./js/domain/StatisticsLotto.js"; async function play() { - const purchase = await readLineAsync("> 구입금액을 입력해 주세요. "); + let lottoMachine; + let count; + let purchase; + let lottos = []; - const lottoMachine = new LottoMachine(); - const count = lottoMachine.calculateLottoCount(purchase); - printCount(count); + while (true) { + try { + purchase = await readLineAsync("> 구입금액을 입력해 주세요. "); + lottoMachine = new LottoMachine(); + count = lottoMachine.calculateLottoCount(purchase); + printCount(count); - const lottos = Array.from({ length: count }, () => { - const lotto = lottoMachine.generateLottoNumber(); - const lottoNumbers = lotto.getLottoNumbers(); - printLottoNumber(lottoNumbers); - return lottoNumbers; - }); + lottos = Array.from({ length: count }, () => { + const lotto = lottoMachine.generateLottoNumber(); + const lottoNumbers = lotto.getLottoNumbers(); + printLottoNumber(lottoNumbers); + return lottoNumbers; + }); + break; + } catch (error) { + console.error("오류가 발생했습니다: ", error); + } + } const winningLottoNumbers = await readLineAsync( "\n> 당첨 번호를 입력해 주세요. " ); const bonusNumber = await readLineAsync("\n> 보너스 번호를 입력해 주세요. "); - // when const winningLotto = new WinningLotto(winningLottoNumbers, bonusNumber); const statisticsLotto = new StatisticsLotto(); @@ -46,7 +56,7 @@ async function play() { const rateOfReturn = statisticsLotto.calculateRateOfReturn(purchase); printRateOfReturn(rateOfReturn); - await reply(statisticsLotto); // play 함수가 끝난 후 reply를 호출 + await reply(statisticsLotto); } async function reply(statisticsLotto) {