From 0365c481ae3ce61825f4a8fcca651140590c8836 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:23:18 +0900 Subject: [PATCH 01/26] =?UTF-8?q?docs:=20ver.1=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=9E=91=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 63 ++++++++++++++++++- .../controller/LottoController.java | 4 ++ src/main/java/planetlotto/domain/Lotto.java | 4 ++ src/main/java/planetlotto/domain/Rank.java | 4 ++ src/main/java/planetlotto/domain/Stats.java | 4 ++ .../java/planetlotto/domain/WinningLotto.java | 4 ++ .../repository/LottoRepository.java | 4 ++ .../planetlotto/service/LottoService.java | 4 ++ 8 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/main/java/planetlotto/controller/LottoController.java create mode 100644 src/main/java/planetlotto/domain/Lotto.java create mode 100644 src/main/java/planetlotto/domain/Rank.java create mode 100644 src/main/java/planetlotto/domain/Stats.java create mode 100644 src/main/java/planetlotto/domain/WinningLotto.java create mode 100644 src/main/java/planetlotto/repository/LottoRepository.java create mode 100644 src/main/java/planetlotto/service/LottoService.java diff --git a/README.md b/README.md index 8a4f22ed0..d474ea4ab 100644 --- a/README.md +++ b/README.md @@ -1 +1,62 @@ -# java-planetlotto-precourse +# 미션 : 행성 로또 - 구현 기능 정리 + +## Domain +### Lotto +- 기능 구현 + - [x] 번호 리스트를 가진다. + - [x] getter +- 예외 처리 + - [x] 번호는 숫자여야 한다. + - [x] 번호의 범위는 1~30이다. + - [x] 번호는 중복되어서는 안된다. + +### WinningLotto +- 기능 구현 + - [x] Lotto와 bonusNum을 가진다. +- 예외 처리 + - [x] bonusNum은 숫자여야 한다. + - [x] bonusNum은 1~30 사이어야 한다. + +### Rank (ENUM) +- 기능 구현 + - [x] 등수이름, 일치 번호 수, 보너스 일치 여부, 당첨 금액을 필드로 가진다. + - [x] 순서는 NONE 부터 FIRST 순으로 간다. (그래야 VALUE를 이용 가능) + - [x] 일치 번호와 보너스 일치 여부로 순위를 출력하는 것이 있다. +- 예외 처리 + - [ ] + +### Stats : printResult에 바로 연결하기 위함이다. +- 기능 구현 + - [x] Map을 이용해서 당첨 랭킹(숫자로)과 당첨 카운트를 가진다. + - [x] 카운트를 증가시키는 기능이 있다. +- 예외 처리 + - [ ] + +--- + +## Repository +### LottoRepository +- 기능 구현 + - [x] 로또들을 리스트로 저장한다. + - [x] 모든 로또들을 outputView에 맞는 List> 형태로 내보낸다. + +--- + +## Service +### LottoService +- 기능 구현 + - [x] 구입 금액을 만들어서 로또를 생성하는 기능 + - [x] winningLotto를 이용해서 각 lotto의 순위를 구한다. +- 예외 처리 + - [x] + +--- + +## Controller +### LottoController +- 기능 구현 + - [x] 로또 리스트를 생성하고 outputView로 출력한다. + - [x] winningLotto를 만든다. + - [x] stats를 outputView로 내보낸다. +- 예외 처리 + - [ ] diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java new file mode 100644 index 000000000..c61dbbc0c --- /dev/null +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -0,0 +1,4 @@ +package planetlotto.controller; + +public class LottoController { +} diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java new file mode 100644 index 000000000..e625bfdd4 --- /dev/null +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public class Lotto { +} diff --git a/src/main/java/planetlotto/domain/Rank.java b/src/main/java/planetlotto/domain/Rank.java new file mode 100644 index 000000000..3c08c93f9 --- /dev/null +++ b/src/main/java/planetlotto/domain/Rank.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public enum Rank { +} diff --git a/src/main/java/planetlotto/domain/Stats.java b/src/main/java/planetlotto/domain/Stats.java new file mode 100644 index 000000000..62146b9e4 --- /dev/null +++ b/src/main/java/planetlotto/domain/Stats.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public class Stats { +} diff --git a/src/main/java/planetlotto/domain/WinningLotto.java b/src/main/java/planetlotto/domain/WinningLotto.java new file mode 100644 index 000000000..94a677222 --- /dev/null +++ b/src/main/java/planetlotto/domain/WinningLotto.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public class WinningLotto { +} diff --git a/src/main/java/planetlotto/repository/LottoRepository.java b/src/main/java/planetlotto/repository/LottoRepository.java new file mode 100644 index 000000000..ddc67040e --- /dev/null +++ b/src/main/java/planetlotto/repository/LottoRepository.java @@ -0,0 +1,4 @@ +package planetlotto.repository; + +public class LottoRepository { +} diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java new file mode 100644 index 000000000..ff1e41cbd --- /dev/null +++ b/src/main/java/planetlotto/service/LottoService.java @@ -0,0 +1,4 @@ +package planetlotto.service; + +public class LottoService { +} From e08cb05586eda3bd322057c45743aa5a595bebba Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:23:37 +0900 Subject: [PATCH 02/26] =?UTF-8?q?feat:=20lotto=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=9E=91=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Lotto.java | 51 +++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index e625bfdd4..da1656837 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -1,4 +1,55 @@ package planetlotto.domain; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + public class Lotto { + private final List lotto; + + public Lotto(List nums) { + validate(nums); + this.lotto = nums; + } + + public List getLotto() { + return lotto; + } + + private void validate(List nums) { + validateRange(nums); + validateDuplicate(nums); + } + + private void validateRange(List nums) { + for (Integer num : nums) { + if (num < 1 || num > 30) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 1과 30 사이어야 합니다."); + } + } + } + + private void validateDuplicate(List nums) { + Set numSet = new HashSet<>(); + for (Integer num : nums) { + numSet.add(num); + } + + if (numSet.size() != nums.size()) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); + } + } + + public int countNum(List compareNumber) { + int count = 0; + for(Integer compare : compareNumber) { + if(this.lotto.contains(compare)) + count++; + } + return count; + } + + public boolean contains(int number) { + return this.lotto.contains(number); + } } From 880c1a954164b1bb3cc1aa4a782de6aaf31dce42 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:24:36 +0900 Subject: [PATCH 03/26] =?UTF-8?q?feat:=20rank=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. enum으로 구성하여 캡슐화 2. 맞는 번호와 보너스 번호를 조합해서 등수를 구하는 로직 마련 --- src/main/java/planetlotto/domain/Rank.java | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/main/java/planetlotto/domain/Rank.java b/src/main/java/planetlotto/domain/Rank.java index 3c08c93f9..8908f5d82 100644 --- a/src/main/java/planetlotto/domain/Rank.java +++ b/src/main/java/planetlotto/domain/Rank.java @@ -1,4 +1,62 @@ package planetlotto.domain; public enum Rank { + NONE("낙첨", 0, false, 0), + FIRST("1등", 5, false, 100_000_000), + SECOND("2등", 4, true, 10_000_000), + THIRD("3등", 4, false, 1_500_000), + FOURTH("4등", 3, true, 500_000), + FIFTH("5첨", 2, true, 5_000); + + private final String displayName; + private final int countNum; + private final boolean isBonus; + private final int price; + + Rank(String displayName, int countNum, boolean isBonus, int price) { + this.displayName = displayName; + this.countNum = countNum; + this.isBonus = isBonus; + this.price = price; + } + + public String getDisplayName() { + return displayName; + } + + public int getCountNum() { + return countNum; + } + + public boolean isBonus() { + return isBonus; + } + + public int getPrice() { + return price; + } + + public static Rank calculateRank(int countNum, boolean isBonus) { + if (countNum == 5 && !isBonus) { + return FIRST; + } + + if (countNum == 4 && isBonus) { + return SECOND; + } + + if (countNum == 4 && !isBonus) { + return THIRD; + } + + if (countNum == 3 && isBonus) { + return FOURTH; + } + + if (countNum == 2 && isBonus) { + return FIFTH; + } + + return NONE; + } } From 905686dbb270afc9de7da561ef86933030102b4d Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:25:08 +0900 Subject: [PATCH 04/26] =?UTF-8?q?feat:=20=EB=93=B1=EC=88=98=20=ED=86=B5?= =?UTF-8?q?=EA=B3=84=ED=99=94=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EB=A7=88=EB=A0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Stats.java | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/planetlotto/domain/Stats.java b/src/main/java/planetlotto/domain/Stats.java index 62146b9e4..52d5caeb0 100644 --- a/src/main/java/planetlotto/domain/Stats.java +++ b/src/main/java/planetlotto/domain/Stats.java @@ -1,4 +1,27 @@ package planetlotto.domain; +import java.util.HashMap; +import java.util.Map; + public class Stats { + private Map rank; // 순위 인덱스와 카운트 + + // TODO : 이걸 생성하는게 옳은 선택인지 감이 안잡혀서 일단 이렇게.. + public Stats() { + this.rank = new HashMap<>(); + } + + public Map getRank() { + return rank; + } + + // 해당하는 순위의 당첨수를 하나 증가시키는 로직이다. + public void addCount(Rank rank) { + int rankInd = rank.ordinal(); + + int cnt = this.rank.getOrDefault(rankInd,0); + cnt++; + + this.rank.put(rankInd,cnt); + } } From 6253a49b4044c19fe83972fbb85b3ca6899f78d7 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:25:25 +0900 Subject: [PATCH 05/26] =?UTF-8?q?feat:=20=EC=9A=B0=EC=8A=B9=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/planetlotto/domain/WinningLotto.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/planetlotto/domain/WinningLotto.java b/src/main/java/planetlotto/domain/WinningLotto.java index 94a677222..bc3484ac6 100644 --- a/src/main/java/planetlotto/domain/WinningLotto.java +++ b/src/main/java/planetlotto/domain/WinningLotto.java @@ -1,4 +1,27 @@ package planetlotto.domain; public class WinningLotto { + private final Lotto winningLotto; + private final int bonus; + + public WinningLotto(Lotto lotto, int bonus) { + this.winningLotto = lotto; + + validateRange(bonus); + this.bonus = bonus; + } + + public Lotto getWinningLotto() { + return winningLotto; + } + + public int getBonus() { + return bonus; + } + + private void validateRange(int bonus) { + if (bonus < 1 || bonus > 30) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 1과 30 사이어야 합니다."); + } + } } From 35a568ffd353655e626c6a405a045981ceaa744f Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:26:06 +0900 Subject: [PATCH 06/26] =?UTF-8?q?feat:=20=EC=83=9D=EC=84=B1=EB=90=9C=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=EB=93=A4=EC=9D=84=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20repotitory=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/LottoRepository.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/planetlotto/repository/LottoRepository.java b/src/main/java/planetlotto/repository/LottoRepository.java index ddc67040e..52fa0a28d 100644 --- a/src/main/java/planetlotto/repository/LottoRepository.java +++ b/src/main/java/planetlotto/repository/LottoRepository.java @@ -1,4 +1,32 @@ package planetlotto.repository; +import planetlotto.domain.Lotto; + +import java.util.ArrayList; +import java.util.List; + public class LottoRepository { + private final List lottos; + + public LottoRepository() { + this.lottos = new ArrayList<>(); + } + + public void addLotto(Lotto lotto) { + lottos.add(lotto); + } + + public List getLottos() { + return lottos; + } + + public List> findAllLottos() { + List> result = new ArrayList<>(); + + for (Lotto lotto : lottos) { + result.add(lotto.getLotto()); + } + + return result; + } } From 288263f251a6b8f2e2c472e6dc15473cb079e4a7 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:26:53 +0900 Subject: [PATCH 07/26] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=EB=A5=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EA=B3=BC,=20=EB=A1=9C=EB=98=90=20=EA=B3=84=EC=82=B0=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../planetlotto/service/LottoService.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index ff1e41cbd..7e93b9cb8 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -1,4 +1,45 @@ package planetlotto.service; +import camp.nextstep.edu.missionutils.Randoms; +import planetlotto.domain.Lotto; +import planetlotto.domain.Rank; +import planetlotto.domain.Stats; +import planetlotto.domain.WinningLotto; +import planetlotto.repository.LottoRepository; + +import java.sql.SQLOutput; +import java.util.List; +import java.util.Map; + public class LottoService { + private final LottoRepository repository; + + public LottoService(LottoRepository repository) { + this.repository = repository; + } + + public List> generateLotto(int amount) { + int count = amount / 500; + + for (int i = 0; i < count; i++) { + List nums = Randoms.pickUniqueNumbersInRange(1, 30, 5); + repository.addLotto(new Lotto(nums)); + } + + return repository.findAllLottos(); + } + + //TODO : Stats stats = new Stats();은 Controller에서 만든다. + public Map calculateRank(WinningLotto winningLotto, Stats stats) { + List lottos = repository.getLottos(); + + for (Lotto lotto : lottos) { + int count = lotto.countNum(winningLotto.getWinningLotto().getLotto()); + boolean isBonus = lotto.contains(winningLotto.getBonus()); + + Rank rank = Rank.calculateRank(count, isBonus); + stats.addCount(rank); + } + return stats.getRank(); + } } From b96ceff7d6e5a672ec48b754ca04b9cdd3b6bfba Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:27:15 +0900 Subject: [PATCH 08/26] =?UTF-8?q?feat:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=EC=97=90=EC=84=9C=20=EC=A1=B0=EB=A6=BD=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/LottoController.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index c61dbbc0c..0ae5a382d 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -1,4 +1,81 @@ package planetlotto.controller; +import planetlotto.domain.Lotto; +import planetlotto.domain.Stats; +import planetlotto.domain.WinningLotto; +import planetlotto.repository.LottoRepository; +import planetlotto.service.LottoService; +import planetlotto.view.InputView; +import planetlotto.view.OutputView; + +import java.util.List; +import java.util.Map; + public class LottoController { + private final InputView inputView; + private final OutputView outputView; + private final LottoService lottoService; + + public LottoController() { + this.inputView = new InputView(); + this.outputView = new OutputView(); + + LottoRepository lottoRepository = new LottoRepository(); + this.lottoService = new LottoService(lottoRepository); + } + + public void run() { + // 1. 로또 리스트 출력 + int amount; + while (true) { + try{ + amount = inputView.askAmount(); + break; + }catch(IllegalArgumentException e){ + System.out.println("[ERROR] " + e.getMessage()); + } + } + + + while (true) { + if (generateLottos(amount)) { + break; + } + } + + // 2. stats 만들기 TODO : 이 부분 NULL 들어오는지 잘 보기 그 부분부터 라는 말이 좀 걸려서 일단 이렇게 두고 나중에 고치기 + WinningLotto winningLotto; + + while (true) { + try { + winningLotto = createWinningLotto(); + break; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + + Stats stats = new Stats(); + Map rankStat = lottoService.calculateRank(winningLotto, stats); + outputView.printResult(rankStat); + } + + private WinningLotto createWinningLotto() { + List nums = inputView.askWinningLotto(); + int bonus = inputView.askBonusNumber(); + + return new WinningLotto(new Lotto(nums), bonus); + } + + private boolean generateLottos(int amount) { + try { + List> lottos = lottoService.generateLotto(amount); // TODO : 여기서 에러 터져서 다시 입력 받는지 봐야 한다. + outputView.printPurchasedLottos(lottos); + + return true; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + return false; + } } From 8457f65fde4dd18b64631dac8c866b718d7b67b7 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:27:36 +0900 Subject: [PATCH 09/26] =?UTF-8?q?feat:=20application=EC=97=90=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EC=99=84=EB=A3=8C,=20test=20=EB=8F=99=EC=9E=91=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/Application.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 27d0a8f96..56a727681 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,7 +1,11 @@ package planetlotto; +import planetlotto.controller.LottoController; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + LottoController controller = new LottoController(); + controller.run(); } } From fe00302b7c8d45c6d5098f61ffa280167f72b57d Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 14:58:29 +0900 Subject: [PATCH 10/26] =?UTF-8?q?docs:=20=ED=96=89=EC=9A=B4=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B5=AC=ED=98=84=20=EB=AA=A9=ED=91=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=A0=95=EB=A6=AC=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 92 ++++++++++++++++++++++--------------------------------- 1 file changed, 37 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index d474ea4ab..96d71af5c 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,44 @@ # 미션 : 행성 로또 - 구현 기능 정리 -## Domain +## 구현한 기능 목록 +- [x] 사용자에게서 금액을 입력받으면, lottoMaker는 lotto를 만들어준다. +- [ ] 당첨 번호와 보너스 번호를 입력하면, 내가 구매한 로또가 몇 등인지를 알 수 있다. +- [ ] 총 통계를 결과로 내보낸다. + +## 예외 처리 ### Lotto -- 기능 구현 - - [x] 번호 리스트를 가진다. - - [x] getter -- 예외 처리 - [x] 번호는 숫자여야 한다. - [x] 번호의 범위는 1~30이다. - [x] 번호는 중복되어서는 안된다. -### WinningLotto -- 기능 구현 - - [x] Lotto와 bonusNum을 가진다. -- 예외 처리 - - [x] bonusNum은 숫자여야 한다. - - [x] bonusNum은 1~30 사이어야 한다. - -### Rank (ENUM) -- 기능 구현 - - [x] 등수이름, 일치 번호 수, 보너스 일치 여부, 당첨 금액을 필드로 가진다. - - [x] 순서는 NONE 부터 FIRST 순으로 간다. (그래야 VALUE를 이용 가능) - - [x] 일치 번호와 보너스 일치 여부로 순위를 출력하는 것이 있다. -- 예외 처리 - - [ ] - -### Stats : printResult에 바로 연결하기 위함이다. -- 기능 구현 - - [x] Map을 이용해서 당첨 랭킹(숫자로)과 당첨 카운트를 가진다. - - [x] 카운트를 증가시키는 기능이 있다. -- 예외 처리 - - [ ] - ---- - -## Repository -### LottoRepository -- 기능 구현 - - [x] 로또들을 리스트로 저장한다. - - [x] 모든 로또들을 outputView에 맞는 List> 형태로 내보낸다. - ---- - -## Service -### LottoService -- 기능 구현 - - [x] 구입 금액을 만들어서 로또를 생성하는 기능 - - [x] winningLotto를 이용해서 각 lotto의 순위를 구한다. -- 예외 처리 - - [x] - ---- - -## Controller -### LottoController -- 기능 구현 - - [x] 로또 리스트를 생성하고 outputView로 출력한다. - - [x] winningLotto를 만든다. - - [x] stats를 outputView로 내보낸다. -- 예외 처리 - - [ ] +----- + +# 🍀 도전 과제 - 행운 점수 게임 +> 저는 항상 무언가를 만들고, 새로 배울때 하고 싶은 것을 무작정 시도해보고는 합니다. +> +> 오픈 미션을 통해 Rust라는 언어를 배우고, 이 언어의 쓰임새를 확장해보고 싶어서 Rudis를 만들었듯이 +> +> 이번에도 lotto 프로젝트를 확장하여 **lotto로 쌓은 나만의 행운 점수로 하는 게임**을 만들어보고자 합니다. + +최근에 저와 제 친구들은, 카카오톡의 **검 키우기**에 빠져 있습니다. +이 게임의 매력은, 검으로 벌어들인 돈으로 여러 랜덤 무기들을 뽑고, 결투를 통해 승률을 올리는 것입니다. +단순한 게임이지만 참 재밌어서 아직까지도 하는 중이고, 제 친구들도 이미 중독되어 버렸습니다. + +> 😋 만약 로또를 사는것에서 끝나지 않고, 로또뽑기를 통해 얻은 행운점수로 게임을 할 수 있다면 어떨까요? + +## 구현 목표 기능 +### 1. 내 프로필 확인 +- [ ] 유저가 행운점수 기능에 입장하면, 1번을 클릭하여 내 프로필을 볼 수 있습니다. +- [ ] 각 유저들은 자신만의 행운 점수를 가지고 있습니다. (행운 점수는 로또 당첨을 통해 크게 얻을 수도 있고, 승률을 올리면 얻을 수 있습니다.) +- [ ] 승률은 ENUM으로 관리하여 각 승률을 통해 얻을 수 있는 행운 점수를 내부에 포함하도록 합니다. + +### 2. 랭킹 확인 +- [ ] 플레이 유저들의 승률 순위를 볼 수 있습니다 +- [ ] 유저들을 한 번에 다 만들기는 너무 힘들기 때문에,, 임시 유저 md 파일을 만들어서, 이를 읽어서 user로 저장하도록 합니다. +- [ ] 사용자들은 자신의 순위를 보고, 더 분발해서 게임을 즐길 수 있습니다. + +### 3. 내 무기 강화하기 +- [ ] 💥 아마 시간관계상 여기까지 못 만들 것 같습니다... +- [ ] 유저들은 각자 자신의 무기를 가집니다. +- [ ] 무기의 레벨이 오를수록 공격력이 올라 승리 확률이 커집니다. +- [ ] 무기는 레벨이 오를수록 파괴 확률도 올라갑니다. \ No newline at end of file From 19e18173a447031eac7ec13a40af3fb985a17222 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:14:48 +0900 Subject: [PATCH 11/26] =?UTF-8?q?docs:=20=ED=96=89=EC=9A=B4=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B8=B0=EB=8A=A5=20=EB=A6=AC=EB=93=9C=EB=AF=B8?= =?UTF-8?q?=EC=97=90=20=EC=A0=95=EB=A6=AC=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 ++++++++++++++----- .../controller/GameController.java | 4 +++ .../controller/MainController.java | 4 +++ src/main/java/planetlotto/domain/User.java | 4 +++ src/main/java/planetlotto/domain/Weapon.java | 4 +++ src/main/java/planetlotto/domain/WinRate.java | 4 +++ .../java/planetlotto/domain/WinRecord.java | 4 +++ src/main/java/planetlotto/dto/ProfileDto.java | 4 +++ .../repository/UserRepository.java | 4 +++ .../service/GameProfileService.java | 4 +++ .../java/planetlotto/view/GameInputView.java | 4 +++ .../java/planetlotto/domain/WinRateTest.java | 4 +++ 12 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 src/main/java/planetlotto/controller/GameController.java create mode 100644 src/main/java/planetlotto/controller/MainController.java create mode 100644 src/main/java/planetlotto/domain/User.java create mode 100644 src/main/java/planetlotto/domain/Weapon.java create mode 100644 src/main/java/planetlotto/domain/WinRate.java create mode 100644 src/main/java/planetlotto/domain/WinRecord.java create mode 100644 src/main/java/planetlotto/dto/ProfileDto.java create mode 100644 src/main/java/planetlotto/repository/UserRepository.java create mode 100644 src/main/java/planetlotto/service/GameProfileService.java create mode 100644 src/main/java/planetlotto/view/GameInputView.java create mode 100644 src/test/java/planetlotto/domain/WinRateTest.java diff --git a/README.md b/README.md index 96d71af5c..ba696b4ac 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ ## 구현한 기능 목록 - [x] 사용자에게서 금액을 입력받으면, lottoMaker는 lotto를 만들어준다. -- [ ] 당첨 번호와 보너스 번호를 입력하면, 내가 구매한 로또가 몇 등인지를 알 수 있다. -- [ ] 총 통계를 결과로 내보낸다. +- [x] 당첨 번호와 보너스 번호를 입력하면, 내가 구매한 로또가 몇 등인지를 알 수 있다. +- [x] 총 통계를 결과로 내보낸다. ## 예외 처리 ### Lotto @@ -27,18 +27,33 @@ > 😋 만약 로또를 사는것에서 끝나지 않고, 로또뽑기를 통해 얻은 행운점수로 게임을 할 수 있다면 어떨까요? ## 구현 목표 기능 +> 🌟 원래 view를 생성해서 제가 만든 기능으로 콘솔 전환할 수 있는 기능을 만들고 싶었는데, 이렇게 하니 기본 **기능 테스트가 NoSuchArgumentException으>로 깨져서**, 뷰 없이 기능들만 만들어 뒀습니다. + ### 1. 내 프로필 확인 -- [ ] 유저가 행운점수 기능에 입장하면, 1번을 클릭하여 내 프로필을 볼 수 있습니다. -- [ ] 각 유저들은 자신만의 행운 점수를 가지고 있습니다. (행운 점수는 로또 당첨을 통해 크게 얻을 수도 있고, 승률을 올리면 얻을 수 있습니다.) -- [ ] 승률은 ENUM으로 관리하여 각 승률을 통해 얻을 수 있는 행운 점수를 내부에 포함하도록 합니다. +- [x] 유저가 행운점수 기능에 입장하면, 1번을 클릭하여 내 프로필을 볼 수 있습니다. +- [x] 각 유저들은 자신만의 행운 점수를 가지고 있습니다. (행운 점수는 로또 당첨을 통해 크게 얻을 수도 있고, 승률을 올리면 얻을 수 있습니다.) +- [x] 승률은 ENUM으로 관리하여 각 승률을 통해 얻을 수 있는 행운 점수를 내부에 포함하도록 합니다. ### 2. 랭킹 확인 - [ ] 플레이 유저들의 승률 순위를 볼 수 있습니다 -- [ ] 유저들을 한 번에 다 만들기는 너무 힘들기 때문에,, 임시 유저 md 파일을 만들어서, 이를 읽어서 user로 저장하도록 합니다. - [ ] 사용자들은 자신의 순위를 보고, 더 분발해서 게임을 즐길 수 있습니다. ### 3. 내 무기 강화하기 - [ ] 💥 아마 시간관계상 여기까지 못 만들 것 같습니다... - [ ] 유저들은 각자 자신의 무기를 가집니다. - [ ] 무기의 레벨이 오를수록 공격력이 올라 승리 확률이 커집니다. -- [ ] 무기는 레벨이 오를수록 파괴 확률도 올라갑니다. \ No newline at end of file +- [ ] 무기는 레벨이 오를수록 파괴 확률도 올라갑니다. + +## 신경쓴 부분 +### enum 도메인 test 로직 작성 +- 현재 승,무,패를 관리하는 WinRate에는 승리, 패배 로직이 있습니다. +- 이 로직의 경우, 각각 유저의 럭키 스코어를 수정해야 함과 동시에 WinRecord의 승,무,패 count도 수정해야 합니다. +- 정합성이 유지되어야 하는 로직이므로, test code를 작성하여 검증하였습니다. + +### DTO 마련 +- 유저의 프로필을 조회하는 기능을 만들기 위해, 유저의 여러 정보와 무기의 정보, 승패의 정보를 가져와야 했습니다. +- 해당 정보들을 outputView에서 더 쉽게 화면에 출력할 수 있도록 하기 위해 dto를 마련했습니다. + +### Service 분기 +- 원래 view 연결이 가능했다면, 입력받는 번호별로 기능을 분기해서 잡을 계획이었으나, view 연결이 불가능한 상황이라 임시 view를 만들어서 각각 서비스별로 분기하도록 해두었습니다. +- 시간 관계상 목표했던 두 번째 기능인 랭킹 확인 기능은 만들지 못하였으나, 첫 번째 기능인 프로필 확인 기능을 GameProfileService로 따로 분기하여 구성했습니다. \ No newline at end of file diff --git a/src/main/java/planetlotto/controller/GameController.java b/src/main/java/planetlotto/controller/GameController.java new file mode 100644 index 000000000..95496b1d4 --- /dev/null +++ b/src/main/java/planetlotto/controller/GameController.java @@ -0,0 +1,4 @@ +package planetlotto.controller; + +public class GameController { +} diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java new file mode 100644 index 000000000..bb425c595 --- /dev/null +++ b/src/main/java/planetlotto/controller/MainController.java @@ -0,0 +1,4 @@ +package planetlotto.controller; + +public class MainController { +} diff --git a/src/main/java/planetlotto/domain/User.java b/src/main/java/planetlotto/domain/User.java new file mode 100644 index 000000000..a69f6247e --- /dev/null +++ b/src/main/java/planetlotto/domain/User.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public class User { +} diff --git a/src/main/java/planetlotto/domain/Weapon.java b/src/main/java/planetlotto/domain/Weapon.java new file mode 100644 index 000000000..08824710b --- /dev/null +++ b/src/main/java/planetlotto/domain/Weapon.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public class Weapon { +} diff --git a/src/main/java/planetlotto/domain/WinRate.java b/src/main/java/planetlotto/domain/WinRate.java new file mode 100644 index 000000000..9c70ba487 --- /dev/null +++ b/src/main/java/planetlotto/domain/WinRate.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public enum WinRate { +} diff --git a/src/main/java/planetlotto/domain/WinRecord.java b/src/main/java/planetlotto/domain/WinRecord.java new file mode 100644 index 000000000..8b24250e9 --- /dev/null +++ b/src/main/java/planetlotto/domain/WinRecord.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public class WinRecors { +} diff --git a/src/main/java/planetlotto/dto/ProfileDto.java b/src/main/java/planetlotto/dto/ProfileDto.java new file mode 100644 index 000000000..65900d446 --- /dev/null +++ b/src/main/java/planetlotto/dto/ProfileDto.java @@ -0,0 +1,4 @@ +package planetlotto.dto; + +public class ProfileDto { +} diff --git a/src/main/java/planetlotto/repository/UserRepository.java b/src/main/java/planetlotto/repository/UserRepository.java new file mode 100644 index 000000000..82d99705a --- /dev/null +++ b/src/main/java/planetlotto/repository/UserRepository.java @@ -0,0 +1,4 @@ +package planetlotto.repository; + +public class UserRepository { +} diff --git a/src/main/java/planetlotto/service/GameProfileService.java b/src/main/java/planetlotto/service/GameProfileService.java new file mode 100644 index 000000000..b23a1b880 --- /dev/null +++ b/src/main/java/planetlotto/service/GameProfileService.java @@ -0,0 +1,4 @@ +package planetlotto.service; + +public class GameProfileService { +} diff --git a/src/main/java/planetlotto/view/GameInputView.java b/src/main/java/planetlotto/view/GameInputView.java new file mode 100644 index 000000000..ad459a3ac --- /dev/null +++ b/src/main/java/planetlotto/view/GameInputView.java @@ -0,0 +1,4 @@ +package planetlotto.view; + +public class GameInputView { +} diff --git a/src/test/java/planetlotto/domain/WinRateTest.java b/src/test/java/planetlotto/domain/WinRateTest.java new file mode 100644 index 000000000..cd3e5380e --- /dev/null +++ b/src/test/java/planetlotto/domain/WinRateTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class WinRateTest { + +} \ No newline at end of file From 2d521c1c5ca4ffc3c9bd22e1fee13a6c918e31e6 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:15:47 +0900 Subject: [PATCH 12/26] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20user=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/User.java | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/main/java/planetlotto/domain/User.java b/src/main/java/planetlotto/domain/User.java index a69f6247e..9888c453d 100644 --- a/src/main/java/planetlotto/domain/User.java +++ b/src/main/java/planetlotto/domain/User.java @@ -1,4 +1,43 @@ package planetlotto.domain; public class User { + private final String userName; + private final Weapon weapon; // 무기 + private final WinRecord record; // 승패 상태 + private int luckyScore; + + public User(String userName, Weapon weapon) { + this.userName = userName; + this.weapon = weapon; + record = new WinRecord(); + this.luckyScore = 1000; // 첫 입장시 럭키스코어 기본 1000 + } + + // 유저 데이터 넣기 위한 +// public User(String userName, Weapon weapon, WinRecord record, int luckyScore) { +// this.userName = userName; +// this.weapon = weapon; +// this.record = record; +// this.luckyScore = luckyScore; +// } + + public String getUserName() { + return userName; + } + + public Weapon getWeapon() { + return weapon; + } + + public WinRecord getRecord() { + return record; + } + + public int getLuckyScore() { + return luckyScore; + } + + public void setLuckyScore(int luckyScore) { + this.luckyScore = luckyScore; + } } From 4721fffca188f9801752423fc60d02a984f3a625 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:16:09 +0900 Subject: [PATCH 13/26] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=EA=B0=80=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=A0=20weapon=20domain=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Weapon.java | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/planetlotto/domain/Weapon.java b/src/main/java/planetlotto/domain/Weapon.java index 08824710b..8756c1eff 100644 --- a/src/main/java/planetlotto/domain/Weapon.java +++ b/src/main/java/planetlotto/domain/Weapon.java @@ -1,4 +1,31 @@ package planetlotto.domain; public class Weapon { + private final String weaponName; + private final String type; + private int level; + private int power; + + public Weapon(String weaponName, String type) { + this.weaponName = weaponName; + this.type = type; + level = 1; + power = 1; + } + + public String getWeaponName() { + return weaponName; + } + + public String getType() { + return type; + } + + public int getLevel() { + return level; + } + + public int getPower() { + return power; + } } From 6ed011f14777b8419e45b45d33a1e5428292a69a Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:16:27 +0900 Subject: [PATCH 14/26] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=EC=9D=98=20?= =?UTF-8?q?=EC=8A=B9=EB=A5=A0=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=8B=B4?= =?UTF-8?q?=EC=9D=80=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/WinRate.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/main/java/planetlotto/domain/WinRate.java b/src/main/java/planetlotto/domain/WinRate.java index 9c70ba487..913ad4e2e 100644 --- a/src/main/java/planetlotto/domain/WinRate.java +++ b/src/main/java/planetlotto/domain/WinRate.java @@ -1,4 +1,54 @@ package planetlotto.domain; +/* +승룰 관리 + +1승은 행운점수 + 10점, +1무는 행운점수 + 0점 +1패는 행운점수 -3점 + */ public enum WinRate { + WIN("승", "plus", 10), + TIE("무", "plus", 0), + LOSS("패", "minus", 3); + + private final String type; + private final String calculate; + private final int score; + + WinRate(String type, String calculate, int score) { + this.type = type; + this.calculate = calculate; + this.score = score; + } + + // 한번 이김 + public static void win(User user, WinRecord record) { + int luckyScore = user.getLuckyScore(); + user.setLuckyScore(luckyScore + WIN.score); + record.win(); // 이겼으니까 같이 업데이트 해야 한다. + } + + // 한번 짐 + public static void lose(User user, WinRecord record) { + int luckyScore = user.getLuckyScore(); + user.setLuckyScore(luckyScore - LOSS.score); + record.loss(); + } + + public static void tie(User user, WinRecord record) { + record.tie(); + } + + public String getType() { + return type; + } + + public String getCalculate() { + return calculate; + } + + public int getScore() { + return score; + } } From 333e7fb7739b8ab1171b4d166f3b031874fd65c8 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:16:57 +0900 Subject: [PATCH 15/26] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=EC=9D=98=20?= =?UTF-8?q?=EC=8A=B9=EB=A5=A0=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=8B=B4?= =?UTF-8?q?=EC=9D=80=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/planetlotto/domain/WinRecord.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/main/java/planetlotto/domain/WinRecord.java b/src/main/java/planetlotto/domain/WinRecord.java index 8b24250e9..65d156169 100644 --- a/src/main/java/planetlotto/domain/WinRecord.java +++ b/src/main/java/planetlotto/domain/WinRecord.java @@ -1,4 +1,37 @@ package planetlotto.domain; -public class WinRecors { +public class WinRecord { + private int winCnt; + private int tieCnt; + private int lossCnt; + + public WinRecord() { // 처음엔 0승 0무 0패로 시작한다. + this.winCnt = 0; + this.tieCnt = 0; + this.lossCnt = 0; + } + + public int getWinCnt() { + return winCnt; + } + + public int getTieCnt() { + return tieCnt; + } + + public int getLossCnt() { + return lossCnt; + } + + public void win(){ + this.winCnt++; + } + + public void tie(){ + this.tieCnt++; + } + + public void loss(){ + this.lossCnt++; + } } From 120d56c554355df8070ce9e341151e30a68606f5 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:17:23 +0900 Subject: [PATCH 16/26] =?UTF-8?q?feat:=20outputView=EC=97=90=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20dto=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/dto/ProfileDto.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/planetlotto/dto/ProfileDto.java b/src/main/java/planetlotto/dto/ProfileDto.java index 65900d446..b09dd04a1 100644 --- a/src/main/java/planetlotto/dto/ProfileDto.java +++ b/src/main/java/planetlotto/dto/ProfileDto.java @@ -1,4 +1,30 @@ package planetlotto.dto; -public class ProfileDto { +import planetlotto.domain.User; +import planetlotto.domain.Weapon; +import planetlotto.domain.WinRecord; + +public record ProfileDto( + String userName, + int userWinNum, + int userTieNum, + int userLossNum, + String weaponName, + int weaponLevel, + int userLuckyScore +) { + public static ProfileDto of(User user) { + WinRecord winRecord = user.getRecord(); + Weapon weapon = user.getWeapon(); + + return new ProfileDto( + user.getUserName(), + winRecord.getWinCnt(), + winRecord.getTieCnt(), + winRecord.getLossCnt(), + weapon.getWeaponName(), + weapon.getLevel(), + user.getLuckyScore() + ); + } } From bd9232981425e3cf3ef45443e46432f9f91bc619 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:17:45 +0900 Subject: [PATCH 17/26] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=93=A4=EC=9D=84=20=EC=A0=80=EC=9E=A5=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20userRepository=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/UserRepository.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/planetlotto/repository/UserRepository.java b/src/main/java/planetlotto/repository/UserRepository.java index 82d99705a..d6ff6ab6a 100644 --- a/src/main/java/planetlotto/repository/UserRepository.java +++ b/src/main/java/planetlotto/repository/UserRepository.java @@ -1,4 +1,24 @@ package planetlotto.repository; +import planetlotto.domain.User; + +import java.util.ArrayList; +import java.util.List; + public class UserRepository { + private final List users; + + public UserRepository() { + this.users = new ArrayList<>(); + } + + public List getUsers() { + return users; + } + + public User findUserByUsername(String userName) { + return users.stream() + .filter(user -> userName.equals(user.getUserName())) + .findFirst().orElse(null); + } } From ded39c5b08dfdcd1d662fc0dfb45aba9f4d6930c Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:18:12 +0900 Subject: [PATCH 18/26] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=A1=B0=ED=9A=8C=20service=EB=A5=BC=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/GameProfileService.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/planetlotto/service/GameProfileService.java b/src/main/java/planetlotto/service/GameProfileService.java index b23a1b880..52efea079 100644 --- a/src/main/java/planetlotto/service/GameProfileService.java +++ b/src/main/java/planetlotto/service/GameProfileService.java @@ -1,4 +1,23 @@ package planetlotto.service; +import planetlotto.domain.User; +import planetlotto.dto.ProfileDto; +import planetlotto.repository.UserRepository; + +/* +유저의 프로필과 관련된 서비스 + +1. 해당 유저의 프로필 확인하는 기능 + */ public class GameProfileService { + private UserRepository repository; + + public GameProfileService(UserRepository repository) { + this.repository = repository; + } + + public ProfileDto getUserProfile(String userName) { + User user = repository.findUserByUsername(userName); + return ProfileDto.of(user); + } } From e0b5fec7b44e894d97a0af7810f134e27b052fb9 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:18:33 +0900 Subject: [PATCH 19/26] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=83=88=EB=A1=9C?= =?UTF-8?q?=EC=9A=B4=20inputView=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/planetlotto/view/GameInputView.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/main/java/planetlotto/view/GameInputView.java b/src/main/java/planetlotto/view/GameInputView.java index ad459a3ac..6b136a7c0 100644 --- a/src/main/java/planetlotto/view/GameInputView.java +++ b/src/main/java/planetlotto/view/GameInputView.java @@ -1,4 +1,51 @@ package planetlotto.view; +import camp.nextstep.edu.missionutils.Console; + +import java.util.function.Supplier; + public class GameInputView { + public String gameIntro() { + return retryOnError(() -> { + System.out.println("🍀 로또로 얻은 행운 점수로 행운 점수 게임을 해보세요!"); + System.out.println("입장을 원하시면 입장을, 종료를 원하시면 종료를 입력해주세요"); + String input = Console.readLine(); + + if(!"입장".equals(input) && !"종료".equals(input)){ + throw new IllegalArgumentException("[ERROR] 입장 혹은 종료만 입력 가능합니다."); + } + + return input; + }); + } + + public String chooseMenu() { + return retryOnError(() -> { + System.out.println("🍀 원하시는 메뉴를 입력해주세요 (1~3, 종료를 원하실 경우 Q를 입력해주세요)"); + + String input = Console.readLine(); + + return input; + }); + } + + public String inputNick() { + return retryOnError(() -> { + System.out.println("🍀 유저 닉네임을 입력해주세요"); + + String input = Console.readLine(); + + return input; + }); + } + + private T retryOnError(Supplier supplier) { + while (true) { + try { + return supplier.get(); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } } From 2c12ff101fc8e73a2f2ceadf2e085ef4b7fa63db Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:18:57 +0900 Subject: [PATCH 20/26] =?UTF-8?q?test:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20test=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/Application.java | 4 +- .../controller/GameController.java | 21 +++++ .../controller/MainController.java | 22 ++++- .../java/planetlotto/domain/WinRateTest.java | 81 ++++++++++++++++++- 4 files changed, 123 insertions(+), 5 deletions(-) diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 56a727681..7e1686caa 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,11 +1,11 @@ package planetlotto; -import planetlotto.controller.LottoController; +import planetlotto.controller.MainController; public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 - LottoController controller = new LottoController(); + MainController controller = new MainController(); controller.run(); } } diff --git a/src/main/java/planetlotto/controller/GameController.java b/src/main/java/planetlotto/controller/GameController.java index 95496b1d4..33a36ecd7 100644 --- a/src/main/java/planetlotto/controller/GameController.java +++ b/src/main/java/planetlotto/controller/GameController.java @@ -1,4 +1,25 @@ package planetlotto.controller; +import planetlotto.repository.UserRepository; +import planetlotto.service.GameProfileService; +import planetlotto.view.GameInputView; + public class GameController { + private final GameInputView inputView; + private final GameProfileService gameProfileService; + + public GameController() { + this.inputView = new GameInputView(); + UserRepository userRepository = new UserRepository(); + this.gameProfileService = new GameProfileService(userRepository); + } + + public void run(){ + // 원래 시나리오 대로라면, 1을 누르면 연결된다. + String input = inputView.chooseMenu(); + if(input.equals("1")){ + String nickName = inputView.inputNick(); + gameProfileService.getUserProfile(nickName); + } + } } diff --git a/src/main/java/planetlotto/controller/MainController.java b/src/main/java/planetlotto/controller/MainController.java index bb425c595..3826900ae 100644 --- a/src/main/java/planetlotto/controller/MainController.java +++ b/src/main/java/planetlotto/controller/MainController.java @@ -1,4 +1,24 @@ package planetlotto.controller; - +/* +원래 로또가 끝나고 바로 연결하는 로직을 만들고 싶었으나, 이렇게 하면 기능 테스트에서 에러가 나서,, 주석 처리 해두었습니다. + */ public class MainController { + private LottoController lottoController; + private GameController gameController; + + public MainController() { + lottoController = new LottoController(); + gameController = new GameController(); + } + + public void run() { + lottoController.run(); + +// String input = gampInputView.inputEnterButton(); +// if ("종료".equals(input)) { +// return; +// } + // 여기서 새로 붙인 기능으로 기능변환 +// gameController.run(); + } } diff --git a/src/test/java/planetlotto/domain/WinRateTest.java b/src/test/java/planetlotto/domain/WinRateTest.java index cd3e5380e..22eec34ed 100644 --- a/src/test/java/planetlotto/domain/WinRateTest.java +++ b/src/test/java/planetlotto/domain/WinRateTest.java @@ -1,4 +1,81 @@ -import static org.junit.jupiter.api.Assertions.*; +package planetlotto.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; + +/* +1. 유저가 이겼을때, +2. 유저가 졌을때 + +두 경우의 행운 점수를 test한다. + */ +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class WinRateTest { - + private User user; + private WinRecord record; + + @BeforeEach + void setUp() { + user = new User("김말랑이", new Weapon("아주 단단한 몽둥이", "땅")); + record = user.getRecord(); + } + + @Test + void 유저_생성시_기본_행운점수_1000점() { + //then + assertSimpleTest(() -> { + Assertions.assertThat(user.getLuckyScore()).isEqualTo(1000); + }); + } + + @Test + void 유저가_지면_행운점수가_3점_깎인다() { + //when + WinRate.lose(user, record); + + //then + assertSimpleTest(() -> { + Assertions.assertThat(user.getLuckyScore()).isEqualTo(997); + }); + } + + @Test + void 유저가_이기면_행운점수가_10점_늘어난다() { + //when + WinRate.win(user, record); + + //then + assertSimpleTest(() -> { + Assertions.assertThat(user.getLuckyScore()).isEqualTo(1010); + }); + } + + @Test + void 유저가_지면_loss의_카운트가_1_증가한다() { + //given + + //when + WinRate.lose(user, record); + //then + assertSimpleTest(() -> { + Assertions.assertThat(record.getLossCnt()).isEqualTo(1); + }); + } + + @Test + void 유저가_이기면_win의_카운트가_1_증가한다() { + //given + + //when + WinRate.win(user, record); + //then + assertSimpleTest(() -> { + Assertions.assertThat(record.getWinCnt()).isEqualTo(1); + }); + } } \ No newline at end of file From 7ab9ca5ae9af2474175a708b8a38ef9388b0cd72 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:26:20 +0900 Subject: [PATCH 21/26] =?UTF-8?q?refactor:=20controller=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EA=B0=81=20=EA=B8=B0=EB=8A=A5=EB=B3=84=EB=A1=9C=20while=20?= =?UTF-8?q?=EB=AC=B8=EC=9D=84=20method=EC=97=90=20=EB=AC=B6=EC=96=B4?= =?UTF-8?q?=EC=84=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/LottoController.java | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 0ae5a382d..01458f534 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -25,57 +25,56 @@ public LottoController() { } public void run() { - // 1. 로또 리스트 출력 + int amount = getAmount(); + generateLottos(amount); + + WinningLotto winningLotto = createWinningLotto(); + + Stats stats = new Stats(); + Map rankStat = lottoService.calculateRank(winningLotto, stats); + outputView.printResult(rankStat); + } + + private int getAmount() { int amount; while (true) { - try{ + try { amount = inputView.askAmount(); break; - }catch(IllegalArgumentException e){ + } catch (IllegalArgumentException e) { System.out.println("[ERROR] " + e.getMessage()); } } + return amount; + } - - while (true) { - if (generateLottos(amount)) { - break; - } - } - - // 2. stats 만들기 TODO : 이 부분 NULL 들어오는지 잘 보기 그 부분부터 라는 말이 좀 걸려서 일단 이렇게 두고 나중에 고치기 + private WinningLotto createWinningLotto() { WinningLotto winningLotto; while (true) { try { - winningLotto = createWinningLotto(); + List nums = inputView.askWinningLotto(); + int bonus = inputView.askBonusNumber(); + winningLotto = new WinningLotto(new Lotto(nums), bonus); break; } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } - Stats stats = new Stats(); - Map rankStat = lottoService.calculateRank(winningLotto, stats); - outputView.printResult(rankStat); + return winningLotto; } - private WinningLotto createWinningLotto() { - List nums = inputView.askWinningLotto(); - int bonus = inputView.askBonusNumber(); - - return new WinningLotto(new Lotto(nums), bonus); - } - - private boolean generateLottos(int amount) { - try { - List> lottos = lottoService.generateLotto(amount); // TODO : 여기서 에러 터져서 다시 입력 받는지 봐야 한다. - outputView.printPurchasedLottos(lottos); + private void generateLottos(int amount) { + while (true) { + try { + List> lottos = lottoService.generateLotto(amount); + outputView.printPurchasedLottos(lottos); - return true; - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); + break; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } } - return false; } } From 78d6bd8922838f837662574722a8b108d801362a Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:28:22 +0900 Subject: [PATCH 22/26] =?UTF-8?q?refactor:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=B5=9C=EC=86=8C,=20=EC=B5=9C=EB=8C=80=20=EB=B2=88=ED=98=B8?= =?UTF-8?q?=20=EB=A7=A4=EC=A7=81=20=EB=84=98=EB=B2=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Lotto.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index da1656837..bdeaff0b2 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -5,6 +5,9 @@ import java.util.Set; public class Lotto { + private static final int MINIMUM_NUMBER_OF_LOTTO = 1; + private static final int MAXIMUM_NUMBER_OF_LOTTO = 30; + private final List lotto; public Lotto(List nums) { @@ -23,7 +26,7 @@ private void validate(List nums) { private void validateRange(List nums) { for (Integer num : nums) { - if (num < 1 || num > 30) { + if (num < MINIMUM_NUMBER_OF_LOTTO || num > MAXIMUM_NUMBER_OF_LOTTO) { throw new IllegalArgumentException("[ERROR] 로또 번호는 1과 30 사이어야 합니다."); } } @@ -42,8 +45,8 @@ private void validateDuplicate(List nums) { public int countNum(List compareNumber) { int count = 0; - for(Integer compare : compareNumber) { - if(this.lotto.contains(compare)) + for (Integer compare : compareNumber) { + if (this.lotto.contains(compare)) count++; } return count; From c9ed579f75f85b88549451db281897372e77dd87 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:41:35 +0900 Subject: [PATCH 23/26] =?UTF-8?q?feat:=204,5=EB=93=B1=EC=9D=98=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EB=B3=B4=EB=84=88=EC=8A=A4=20=EB=B2=88=ED=98=B8?= =?UTF-8?q?=EA=B0=80=20=EB=A7=9E=EC=A7=80=20=EC=95=8A=EC=95=98=EC=9D=84=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=EB=8F=84=20=ED=98=9C=ED=83=9D=EC=9D=84=20?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Rank.java | 43 ++++++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/main/java/planetlotto/domain/Rank.java b/src/main/java/planetlotto/domain/Rank.java index 8908f5d82..10969731a 100644 --- a/src/main/java/planetlotto/domain/Rank.java +++ b/src/main/java/planetlotto/domain/Rank.java @@ -1,23 +1,27 @@ package planetlotto.domain; public enum Rank { - NONE("낙첨", 0, false, 0), - FIRST("1등", 5, false, 100_000_000), - SECOND("2등", 4, true, 10_000_000), - THIRD("3등", 4, false, 1_500_000), - FOURTH("4등", 3, true, 500_000), - FIFTH("5첨", 2, true, 5_000); + NONE("낙첨", 0, false, 0, 0), + FIRST("1등", 5, false, 100_000_000, 100_000_000), + SECOND("2등", 4, true, 10_000_000, 10_000_000), + THIRD("3등", 4, false, 1_500_000, 1_500_000), + FOURTH("4등", 3, true, 500_000, 500_000), + FIFTH("5첨", 2, true, 5_000, 5_000), + BONUS_FOURTH("보너스 4등", 3, false, 0, 500_000), + BONUS_FIFTH("보너스 5등", 2, false, 0, 5_000); private final String displayName; private final int countNum; private final boolean isBonus; private final int price; + private final int luckyScore; - Rank(String displayName, int countNum, boolean isBonus, int price) { + Rank(String displayName, int countNum, boolean isBonus, int price, int luckyScore) { this.displayName = displayName; this.countNum = countNum; this.isBonus = isBonus; this.price = price; + this.luckyScore = luckyScore; } public String getDisplayName() { @@ -36,6 +40,29 @@ public int getPrice() { return price; } + public int getLuckyScore() { + return luckyScore; + } + + public static boolean isBonusRank(Rank rank) { + if (rank == Rank.BONUS_FOURTH || rank == Rank.BONUS_FIFTH) { + return true; + } + return false; + } + + public static Rank getBonusRank(int countNum, boolean isBonus) { + if (countNum == 3 && !isBonus) { // 아쉽게 보너스 번호 하나 안 맞은 당신! 럭키 스코어는 그대로 + return BONUS_FOURTH; + } + + if (countNum == 2 && !isBonus) { // 아쉽게 보너스 번호 하나 안 맞은 당신! 럭키 스코어는 그대로 + return BONUS_FIFTH; + } + + return NONE; + } + public static Rank calculateRank(int countNum, boolean isBonus) { if (countNum == 5 && !isBonus) { return FIRST; @@ -57,6 +84,6 @@ public static Rank calculateRank(int countNum, boolean isBonus) { return FIFTH; } - return NONE; + return getBonusRank(countNum, isBonus); } } From 8a9723f90a95c78e7a02f714ad098894b3f0f5d6 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:42:28 +0900 Subject: [PATCH 24/26] =?UTF-8?q?fix:=20=EC=A3=BC=EC=84=9D=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Stats.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/planetlotto/domain/Stats.java b/src/main/java/planetlotto/domain/Stats.java index 52d5caeb0..d9a111c6d 100644 --- a/src/main/java/planetlotto/domain/Stats.java +++ b/src/main/java/planetlotto/domain/Stats.java @@ -6,7 +6,6 @@ public class Stats { private Map rank; // 순위 인덱스와 카운트 - // TODO : 이걸 생성하는게 옳은 선택인지 감이 안잡혀서 일단 이렇게.. public Stats() { this.rank = new HashMap<>(); } @@ -15,13 +14,12 @@ public Map getRank() { return rank; } - // 해당하는 순위의 당첨수를 하나 증가시키는 로직이다. public void addCount(Rank rank) { int rankInd = rank.ordinal(); - int cnt = this.rank.getOrDefault(rankInd,0); + int cnt = this.rank.getOrDefault(rankInd, 0); cnt++; - this.rank.put(rankInd,cnt); + this.rank.put(rankInd, cnt); } } From d591e4890e35ac8ec05cfe3c357f173d9822aad9 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:43:00 +0900 Subject: [PATCH 25/26] =?UTF-8?q?feat:=20=EC=83=88=EB=A1=9C=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A4=EC=96=B4=EC=A7=84=20=EB=93=B1=EA=B8=89=EC=9D=98=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0,=20=ED=96=89=EC=9A=B4=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=EB=A7=8C=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=B4=20lotto=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A0=9C=EC=99=B8=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/service/LottoService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/planetlotto/service/LottoService.java b/src/main/java/planetlotto/service/LottoService.java index 7e93b9cb8..ea1a7d872 100644 --- a/src/main/java/planetlotto/service/LottoService.java +++ b/src/main/java/planetlotto/service/LottoService.java @@ -29,7 +29,6 @@ public List> generateLotto(int amount) { return repository.findAllLottos(); } - //TODO : Stats stats = new Stats();은 Controller에서 만든다. public Map calculateRank(WinningLotto winningLotto, Stats stats) { List lottos = repository.getLottos(); @@ -38,6 +37,10 @@ public Map calculateRank(WinningLotto winningLotto, Stats stat boolean isBonus = lotto.contains(winningLotto.getBonus()); Rank rank = Rank.calculateRank(count, isBonus); + // 여기서 BONUS_FOURTH, BONUS_FIFTH는 통계에서 제외 (이건 행운 게임에서만 사용한다.) + if(Rank.isBonusRank(rank)){ + continue; + } stats.addCount(rank); } return stats.getRank(); From bb20650fbcc0d648d99537a170e85f44dc466865 Mon Sep 17 00:00:00 2001 From: sunJ0120 Date: Sat, 10 Jan 2026 16:46:44 +0900 Subject: [PATCH 26/26] =?UTF-8?q?docs:=20=EC=B5=9C=EC=A2=85=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EA=B8=B0=EB=8A=A5=20=EC=A0=95=EB=A6=AC=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ba696b4ac..42255a9db 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,24 @@ - [x] 번호의 범위는 1~30이다. - [x] 번호는 중복되어서는 안된다. +## ✅ 추가 기능 +### 새로운 등급 마련 +- 4, 5등에 해당하는데 아쉽게 보너스 번호 한끝 차이로 당첨금을 못 받을 경우를 위한 새로운 등급 마련 +- 기존의 로또 당첨금 체계에 추가할 경우, 로또 기본 기능 사항을 어기는 것이 되므로, 새로운 기능인 **게임**기능에 연결하도록 구성 +- 4, 5등의 점수인데 보너스 번호 하나 어긋나서 상금 수령이 어려운 경우, 상금은 0이지만, 4,5등과 같은 행운 스코어를 게임에서 적립하도록 한다. +- 시간 관계상 행운 스코어를 적립하는 로직은 만들지 못하였지만, 이를 통해 사용자들이 더 재미있게 로또 게임을 즐길 수 있을 것으로 보여집니다:) + +```java +BONUS_FOURTH("보너스 4등", 3, false, 0, 500_000), +BONUS_FIFTH("보너스 5등", 2, false, 0, 5_000); + +private final String displayName; +private final int countNum; +private final boolean isBonus; +private final int price; +private final int luckyScore; +``` + ----- # 🍀 도전 과제 - 행운 점수 게임 @@ -29,16 +47,16 @@ ## 구현 목표 기능 > 🌟 원래 view를 생성해서 제가 만든 기능으로 콘솔 전환할 수 있는 기능을 만들고 싶었는데, 이렇게 하니 기본 **기능 테스트가 NoSuchArgumentException으>로 깨져서**, 뷰 없이 기능들만 만들어 뒀습니다. -### 1. 내 프로필 확인 +### 1. 내 프로필 확인 (완성, GameOutputView는 미완) - [x] 유저가 행운점수 기능에 입장하면, 1번을 클릭하여 내 프로필을 볼 수 있습니다. - [x] 각 유저들은 자신만의 행운 점수를 가지고 있습니다. (행운 점수는 로또 당첨을 통해 크게 얻을 수도 있고, 승률을 올리면 얻을 수 있습니다.) - [x] 승률은 ENUM으로 관리하여 각 승률을 통해 얻을 수 있는 행운 점수를 내부에 포함하도록 합니다. -### 2. 랭킹 확인 +### 2. 랭킹 확인 (미완) - [ ] 플레이 유저들의 승률 순위를 볼 수 있습니다 - [ ] 사용자들은 자신의 순위를 보고, 더 분발해서 게임을 즐길 수 있습니다. -### 3. 내 무기 강화하기 +### 3. 내 무기 강화하기 (미완) - [ ] 💥 아마 시간관계상 여기까지 못 만들 것 같습니다... - [ ] 유저들은 각자 자신의 무기를 가집니다. - [ ] 무기의 레벨이 오를수록 공격력이 올라 승리 확률이 커집니다.