Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[로또 게임] 김용주 미션 제출합니다. #398

Open
wants to merge 37 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
0fc001e
initiate
KimYjoo Oct 30, 2024
150bb11
docs : 첫 기능 구현 목록 작성
KimYjoo Oct 31, 2024
e7596d0
docs : 과제 수행 체크리스트 작성
KimYjoo Oct 31, 2024
20e6f3b
docs : 디자인 수정
KimYjoo Oct 31, 2024
ec7a64f
docs : 디자인 재수정
KimYjoo Oct 31, 2024
7753cc7
doc : 기능 목록 세분화
KimYjoo Oct 31, 2024
99f9177
docs : 과제 수행 체크리스트에 스터디 학습 내용 추가
KimYjoo Oct 31, 2024
a95a0de
feat : 유저 입력 세트 추가
KimYjoo Nov 2, 2024
19c5b67
fix : 유저 입력 세트 async 추가
KimYjoo Nov 2, 2024
3554819
feat(computeLottoForPurchase) : 구입 금액 대비 수령 로또 개수 계산 함수 추가
KimYjoo Nov 2, 2024
4b21933
feat(separateString) : 구분자 기준 문자열 분리 함수 추가
KimYjoo Nov 2, 2024
d2feca5
docs(README) : 예외처리목록 추가
KimYjoo Nov 2, 2024
706382b
feat : 구입 금액이 1000원 단위가 아닐때 예외 출력 추가
KimYjoo Nov 2, 2024
e81f8dd
feat : 입력 예외사항 추가
KimYjoo Nov 3, 2024
cc10121
feat : 에러사항 추가, 로또 번호가 1에서 45사이의 숫자가 아닐 경우
KimYjoo Nov 3, 2024
856a452
feat : 에러사항 추가, 로또 번호가 6개의 숫자가 아닐 경우
KimYjoo Nov 3, 2024
9f6af40
feat : 에러사항 추가, 로또 번호가 소수일 경우
KimYjoo Nov 3, 2024
177ff2c
docs : 입력 예외 처리 목록 구조화
KimYjoo Nov 3, 2024
8998397
feat : 에러사항 추가, 보너스 번호가 1에서 45사이의 숫자가 아닌 경우
KimYjoo Nov 3, 2024
3aaa530
docs : 입력 예외 처리 추가
KimYjoo Nov 3, 2024
d66d871
feat : 에러사항 추가, 보너스번호가 소수일 경우
KimYjoo Nov 3, 2024
ead5527
refactor : 완성된 사용자 입력 과정을 MVC 패턴을 적용시켜서 리펙토링을 진행
KimYjoo Nov 3, 2024
f1e72f8
feat(randomNumber) : 무작위 숫자 생성 기능 추가
KimYjoo Nov 3, 2024
3dbfabf
feat : 구입한 개수 만큼 로또를 생성하는 기능 추가
KimYjoo Nov 3, 2024
5032c89
chore : 로또 생성 과정에서 랜덤한 보너스 번호를 생성한다는 오해가 있었기에, 이를 제거
KimYjoo Nov 3, 2024
4714cd2
docs : 로또 당첨 여부 확인 과정 수정
KimYjoo Nov 3, 2024
fbaa233
feat : 로또 클래스 및 로또 상속 클래스 생성
KimYjoo Nov 3, 2024
38d8b8e
feat : 당첨 번호와 발행된 번호를 비교하는 함수 추가
KimYjoo Nov 3, 2024
262c56c
chore : 환경 이동을 위한 commit
KimYjoo Nov 3, 2024
9c18f12
feat : 사용자의 로또의 당첨 등수 기능 추가
KimYjoo Nov 4, 2024
eb4c4d3
feat : 사용자의 로또 수입률 계산 기능 추가
KimYjoo Nov 4, 2024
2f83685
feat : 로또 게임 출력 기능 추가
KimYjoo Nov 4, 2024
a1d3bca
chore : 보너스 당첨 여부 과정 오류 수정
KimYjoo Nov 4, 2024
0959eaf
chore : 필요없는 주석 제거
KimYjoo Nov 4, 2024
58d9c26
chore : 입력형식 정규표현식 수정
KimYjoo Nov 4, 2024
6ecf392
fix : 에러메시지 출력방식 수정
KimYjoo Nov 4, 2024
2c16dde
과제 제목 수정
KimYjoo Nov 5, 2024
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
79 changes: 78 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,78 @@
# javascript-lotto-precourse
# 우테코 프리코스 3주차 [로또]
## 과제 수행 체크리스트
#### 개발 과정 준수 사항
- [ ] 코드 포매팅 사용
- [ ] README.MD 기능 목록 수시로 업데이트
- [ ] 자바스크립트 코드 컨벤션 준수
- [ ] 코드의 목적이 들어나는 변수명 고려

#### 코드 준수 사항
- [ ] let 선언 줄이기, const 사용
- [ ] 접근제어자 표시
- [ ] 값 하드 코딩 금지, 상수화
- [ ] 들여쓰기 depth 2이내
- [ ] else 문 지양
- [ ] 함수 길이 15라인 이내 유지 (한 가지 기능)
- [ ] 구현 순서 준수(클래스 : 필드, 생성자, 매서드 순)
- [ ] 메서드가 한 가지 기능을 담당하는지 확인하는 기준 세우기 (ex: 15줄 이내)
- [ ] 예외 처리 (validation) 를 따로 분류하여 관리하기

#### 테스트 코드 준수 사항
- [ ] 테스트를 작성하는 이유에 대해 생각하기
- [ ] Jest 이용 테스트코드
- [ ] 기능의 단위 테스트 작성 (UI(System.out, System.in, Scanner) 로직은 제외한다.)

## 기능 구현 목록
### 입력
- #### 사용자 입력
- [x] 로또 구입 금액을 입력한다.
- [x] 당첨번호를 입력한다.
- [x] 보너스 번호를 입력한다.
- #### 입력 처리
- [x] 로또 구입 금액을 통해 로또 구입 개수 계산한다.
- [x] 당첨 번호 입력을 구분자로 구분한다.
- [x] 사용자의 구입 금액을 저장한다.
- [x] 사용자의 당첨 번호를 저장한다.
- [x] 사용자의 보너스 번호를 저장한다.

- #### 입력 조건
- 로또 구입 금액은 1000원 단위로 입력 받는다.
- 당첨 번호는 쉼표를 기준으로 구분한다.
- 로또 번호는 1에서 45사이의 숫자여야 한다.
- 로또 번호의 중복이 있으면 안된다. (보너스도 마찬가지)
- 로또 번호는 6자리이다.
- 보너스 번호는 숫자 하나이다.

- #### 입력 예외 처리 목록
- 구입 금액
- [x] 로또 구입 금액이 숫자가 아닌 값이 입력된 경우.
- [x] 로또 구입 금액이 1000원 단위가 아닐 경우.
- [x] 로또 구입 금액이 소수인 경우.
- 로또 번호
- [x] 로또 번호 중 숫자가 아닌 특수문자가 있을 경우. 로또 번호 입력형식에 맞지 않은 경우.
- [x] 로또 번호가 1에서 45사이의 숫자가 아닐 경우.
- [x] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함.
- [x] 로또 번호가 보너스 제외하고 6자리가 아닐 경우.
- [x] 로또 번호가 소수일 경우
- 보너스 번호
- [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우.
- [x] 보너스 번호가 1에서 45사이의 숫자가 아닐 경우.
- [ ] 보너스 번호가 중복일 경우
- [x] 보너스 번호가 소수일 경우

### 로또 게임 진행
- #### 당첨 로또 번호 생성
- [x] 랜덤한 당첨 번호를 생성한다.
- #### 사용자의 로또 당첨 여부 확인
- [x] 사용자의 당첨 번호와 보너스 번호를 비교했을 때 일치하는 개수를 구한다.
- #### 사용자의 로또 게임 결과 판단
- [x] 사용자의 로또가 몇 등 당첨인지 판단한다.
- [x] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다.

### 출력
- #### 안내 메시지
- [x] 구매한 로또의 개수를 출력한다.
- [x] 당첨 통계 안내 메시지를 출력한다.
- #### 로또 결과 출력
- [x] 정해진 당첨 등수를 모두 출력한다. 그와 함께 사용자가 각 등수에 당첨된 개수를 출력한다.
- [x] 사용자의 수익률을 출력한다.
49 changes: 27 additions & 22 deletions package-lock.json

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

23 changes: 20 additions & 3 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
import {Console} from '@woowacourse/mission-utils'
import LottoGameController from './LottoGameController.js'
import LottoGameView from './LottoGameView.js'
import LottoGameService from './LottoGameService.js'
import Lotto from './Lotto.js'

class App {
async run() {}
}
controller;

constructor(){
this.controller = new LottoGameController(
new LottoGameView(),
new LottoGameService()
)
}

async run() {
await this.controller.run();
}
}

export default App;
export default App;
16 changes: 10 additions & 6 deletions src/Lotto.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
import {lottoNumberValidatePipe} from './lottoNumberValidatePipe.js'
import { validateLottoNumberAmount, validateLottoOverlap } from "./validate.js"

class Lotto {
#numbers;

constructor(numbers) {
this.#validate(numbers);
this.#numbers = numbers;
this.#numbers = numbers.map(Number).sort((a, b) => a - b);
}

#validate(numbers) {
if (numbers.length !== 6) {
throw new Error("[ERROR] 로또 번호는 6개여야 합니다.");
}
validateLottoNumberAmount(numbers);
validateLottoOverlap(numbers);
lottoNumberValidatePipe(numbers);
}
getNumbers() {
return this.#numbers;
}

// TODO: 추가 기능 구현
}

export default Lotto;
40 changes: 40 additions & 0 deletions src/Lotto/AnswerLotto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import Lotto from '../Lotto.js'

import {bonusNumberValidatePipe} from '../bonusNumberValidatePipe.js'
import {validateBonusOverlap} from '../validate.js'

class AnswerLotto extends Lotto {
#bonus;
#lottoTable;

constructor(numbers, bonus){
super(numbers);

this.#bonus = bonus;
this.applyLottoToTable(numbers);
this.#validateAnswerLotto(bonus);
}

static create(numbers, bonus) {
return new AnswerLotto(numbers, bonus);
}
#validateAnswerLotto(bonus){
bonusNumberValidatePipe(bonus);
validateBonusOverlap(this.#lottoTable, bonus);
}
getBonusNumber(){
return this.#bonus;
}
#setInitialStateLottoTable(){
this.#lottoTable = Array.from({ length: 45 }, () => 0);
}
applyLottoToTable(numbers) {
this.#setInitialStateLottoTable();
numbers.forEach((element) => {
this.#lottoTable[element - 1] += 1;
});
}

}

export default AnswerLotto
73 changes: 73 additions & 0 deletions src/Lotto/IssuedLotto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import Lotto from '../Lotto.js'
import {random} from '../utils/random.js'

class IssuedLotto extends Lotto {
#lottoTable;
#matchNumber;
#winningGrade;

constructor(numbers) {
super(numbers);
this.#winningGrade = '꼴등';
this.#matchNumber = 0;
}

static create(amount) {
return Array.from({length: amount}, () => new IssuedLotto(random.makeUniqueNumbers(1, 45, 6)));
}
getWinningGrade(){
return this.#winningGrade;
}
#setInitialStateLottoTable(){
this.#lottoTable = Array.from({ length: 45 }, () => 0);
}
applyLottoToTable(numbers) {
this.#setInitialStateLottoTable();
numbers.forEach((element) => {
this.#lottoTable[element - 1] += 1;
});
}
checkWinningIssuedLotto(answer){
this.#setWinningGrade(answer);
}
#setMatchNumber(answer) {
this.applyLottoToTable(super.getNumbers());
answer.getNumbers().forEach((element) => {
this.#matchNumber += this.#lottoTable[element-1];
});
}
#setWinningGrade(answer) {
this.#setMatchNumber(answer);
if(this.#matchNumber === 6){
this.#winningGrade = '1등';
return;
}
if(this.#matchNumber === 5 && this.isMatchedBonus(answer.getBonusNumber())){
this.#winningGrade = '보너스';
return;
}
if(this.#matchNumber === 5){
this.#winningGrade = '2등';
return;
}
if(this.#matchNumber === 4){
this.#winningGrade = '3등';
return;
}
if(this.#matchNumber === 3){
this.#winningGrade = '4등';
return;
}
this.#winningGrade = '꼴등';
return;
}

isMatchedBonus(bonus){
return this.#lottoTable[bonus-1] === 1;
}
getLottoTable(){
return this.#lottoTable;
}
}

export default IssuedLotto
Loading