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
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,27 @@
# javascript-planetlotto-precourse

# javascript-planetlotto-precourse

## 🛡️ (행성로또)

설명 :
주어진 view를 가지고 어떻게 구현을 할 것인가?

다른 사람이 만들어 놓은 코드를 보고 이해를 한 뒤, 어떻게 그 다음을 이어나갈 것인가가 main 포인트임
낯선 메서드에 대해서 잘 적응해보도록 하자!

### (메서드설명)

- [x] **printPurchasedLottos 설명:** 일급 컬렉션을 이용해야하지만, 캡슐화를 하면 안 됨
숫자 배열을 문자열로 만들기 때문에 조심해야함
- [x] **printResult 설명:** 결과를 담는 배열이 있어야함

- [x] **askWinningLotto 설명:** 숫자 배열이기 떄문에 비교에 유의하자

### (메서드설명)

- [x] **1** 구입 금액을 입력 받는다.
- [x] **2** 로또 번호를 반환해서 일급 컬렉션화를 시켜 로또 티켓을 생성한다.
- [x] **3** 형식에 맞게 당첨 번호와, 로또 번호를 입력한다.
- [x] 결과를 계산하는 객체를 만들어 결과를 저장한다.
- [x] 저장한 결과에 따라 출력한다.
73 changes: 71 additions & 2 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,74 @@
import { InputView } from "./view.js";
import { OutputView } from "./view.js";
import { Console } from "@woowacourse/mission-utils";
import LottoManager from "./model/LottoManager.js";
import Validate from "./model/Validate.js";
import ResultManager from "./model/ResultManager.js";
class App {
async run() {}
}
async run() {
const lottoList = await this.addPurChaseMoney();
const winningNumber = await this.addWinningLottoNumber(lottoList);
const bonusNumber = await this.addbonusNumber(winningNumber);
//[5] 얼마나 맞췄는지 계산 -> 리스트로 관리
const resultManager = new ResultManager();
resultManager.calculateIncom(lottoList, winningNumber, bonusNumber);
//[6] 계산 결과 출력
const resultList = resultManager.getResultList();

// Console.print(`테스트용 출력: ${resultList}`);

for (const num of resultList) {
OutputView.getCount(num);
}
OutputView.printResult();
}

async addPurChaseMoney() {
while (true) {
try {
// [1] 구입금액 입력
const purChaseMoney = await InputView.askAmount();
const lottoManager = new LottoManager();
const tryNumber = lottoManager.calculateTryNumber(purChaseMoney);
//[2] 로또 리스트 생성
lottoManager.makeLottoList(tryNumber);
const lottoList = lottoManager.getLottoList();
//[3] outputView를 활용해서 몇개를 출력했는지 출력
Console.print("");
OutputView.printPurchasedLottos(lottoList);
return lottoList;
} catch (error) {
Console.print(error.message);
}
}
}

async addWinningLottoNumber() {
while (true) {
try {
//[4] 사용자에게 로또 번호 입력 -> 숫자 배열로 입력 됨
Console.print("");
const winningLottoNumber = await InputView.askWinningLotto();
Validate.winningNumber(winningLottoNumber);
// Console.print(`테스트 위닝넘버 : ${winningLottoNumber}`);
Console.print("");
return winningLottoNumber;
} catch (error) {
Console.print(error.message);
}
}
}

async addbonusNumber(lottoList, winningLottoNumber) {
while (true) {
try {
const bonusNumber = await InputView.askBonusNumber();
Validate.bonusNumber(lottoList, bonusNumber);
return bonusNumber;
} catch (error) {
Console.print(error.message);
}
}
}
}
export default App;
54 changes: 54 additions & 0 deletions src/model/LottoManager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { Random } from "@woowacourse/mission-utils";

class LottoManager {
#tryNumber;
#lottoList;
constructor() {
this.#tryNumber;
this.#lottoList = [];
}
calculateTryNumber(purChaseMoney) {
this.validateMoney(purChaseMoney);
return purChaseMoney / 500; // 이따 수정해야함
}
makeLottoList(tryNumber) {
for (let index = 0; index < tryNumber; index++) {
this.#lottoList[index] = this.makeRandomVariavle();
}
}
getLottoList() {
return this.#lottoList;
}

makeRandomVariavle() {
const lottoNumber = Random.pickUniqueNumbersInRange(1, 30, 5).sort(
(a, b) => a - b
);
return lottoNumber;
}

validateMoney(purChaseMoney) {
const testPurchaseMoney = purChaseMoney.toString().split("");
if (!purChaseMoney)
throw new Error("[ERROR] 구입금액은 들어오지 않았습니다.");
if (testPurchaseMoney[0] === "0")
throw new Error("[ERROR] 맨 앞자리에 0이 존재하면 안 됩니다.");
testPurchaseMoney.forEach((num) => {
if (Number.isNaN(Number(num)))
throw new Error("[ERROR] 문자가 포함되어 있습니다.");
});
if (testPurchaseMoney.includes(" "))
throw new Error("[ERROR] 문자에 공백이 존재합니다.");
const integerNumner = Number(purChaseMoney);
if (Number.isNaN(integerNumner))
throw new Error("[ERROR] 구입금액은 숫자여야 합니다.");
if (!Number.isInteger(integerNumner))
throw new Error("[ERROR] 구입금액은 정수여야 합니다.");
if (integerNumner <= 0)
throw new Error("[ERROR] 구입금액은 0보다 커야합니다.");
if (integerNumner % 500 !== 0) {
throw new Error("[ERROR] 구입금액은 500원 단위여야합니다.");
}
}
}
export default LottoManager;
56 changes: 56 additions & 0 deletions src/model/ResultManager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { Console } from "@woowacourse/mission-utils";

class ResultManager {
#resultList;

static lottoPrizeIndex = {
0: { index: 0 }, // 필요
1: { index: 0 }, // 필요
1: { index: 0 }, // 필요
2: { index: 0 },
"2b": { index: 1 }, // 필요
3: { index: 0 },
"3b": { index: 2 }, // 필요
4: { index: 3 }, // 필요
"4b": { index: 3 }, // 필요
5: { index: 4 }, // 필요
};

constructor() {
this.#resultList = [0, 0, 0, 0, 0, 0];
}
calculateIncom(lottoList, inputWinningNumber, bonusNumber) {
const integerBonus = Number(bonusNumber);
const winningNumber = inputWinningNumber.map(Number);
Console.print(`확인용 ${winningNumber}`);

for (const lotto of lottoList) {
// const lotto = lottoString.split(", ");
const match = winningNumber.filter((num) => lotto.includes(num)).length;

const prizeIndex = ResultManager.lottoPrizeIndex[match];

// Console.print(prizeIndex.index);

if (!prizeIndex) continue;
else if (prizeIndex.index === 3 && lotto.includes(integerBonus)) {
this.#resultList[prizeIndex.index] += 1;
} else if (prizeIndex.index === 3 && lotto.includes(integerBonus))
this.#resultList[prizeIndex.index] += 1;
else if (prizeIndex.index === 4 && !lotto.includes(integerBonus))
this.#resultList[3] += 1;
else if (prizeIndex.index === 4 && lotto.includes(integerBonus))
this.#resultList[4] += 1;
else if (prizeIndex.index === 5) this.#resultList[5] += 1;
else if (prizeIndex) {
this.#resultList[prizeIndex.index] += 1;
}
}
}

getResultList() {
return this.#resultList;
}
}

export default ResultManager;
33 changes: 33 additions & 0 deletions src/model/Validate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
class Validate {
static winningNumber(winningNumber) {
winningNumber.forEach((num) => {
if (num < 0 || num > 30)
throw new Error("[ERROR] 숫자 범위가 틀렸습니다.");
if (Number.isNaN(num))
throw new Error("[ERROR] 숫자가 아닌 문자가 포함되어 있습니다.");
if (!Number.isInteger(num)) {
throw new Error("[ERROR] 로또 번호는 정수로 입력받아야 합니다.");
}
});
if (winningNumber.includes(""))
throw new Error(`[ERROR] 공백을 포함하고 있습니다.`);
if (winningNumber.length !== 5)
throw new Error(`[ERROR] 5자리 수를 입력 받아야합니다.`);
const testSetNumber = new Set(winningNumber);
if (testSetNumber.size !== winningNumber.length)
throw new Error(`[ERROR] 중복값이 존재합니다.`);
}

static bonusNumber(winningLottoNumber, bonusNumber) {
const integerNumber = Number(bonusNumber);
if (integerNumber < 0 || integerNumber > 46)
throw new Error("[ERROR] 숫자 범위가 틀렸습니다.");
if (winningLottoNumber.includes(integerNumber))
throw new Error("[ERROR] 보너스번호가 포함되어 있습니다.");
if (!Number.isInteger(integerNumber)) {
throw new Error("[ERROR] 보너스 번호는 정수를 입력 받아야합니다.");
}
}
}

export default Validate;