diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..84cfc8e 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,6 +2,14 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + View view = new View(); + Controller controller = new Controller(view); + + try { + controller.startRace(); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + throw e; + } } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java new file mode 100644 index 0000000..9963f53 --- /dev/null +++ b/src/main/java/racingcar/Controller.java @@ -0,0 +1,47 @@ +package racingcar; + +import java.util.ArrayList; +import java.util.List; + +public class Controller { + private final View view; + private final List members = new ArrayList<>(); + + public Controller(View view) { + this.view = view; + } + + //레이스 시작 + public void startRace() { + // 경주차 등록 + String[] names = view.getMemberNames(); + for (String name : names) { + members.add(new Member(name.trim(),0)); + } + + // 시도 횟수 + int tryCount = view.getTryCount(); + + // 경주 진행 + for (int i = 0; i < tryCount; i++) { + for (Member m : members) { + m.startRandom(); + } + view.printProgress(members); + } + + // 우승자 계산 + int max = 0; + for (Member m : members) { + if (m.getGo() > max) { + max = m.getGo(); + } + } + List winners = new ArrayList<>(); + for (Member m : members) + if (m.getGo() == max) { + winners.add(m); + } + view.printWinners(winners); + } +} diff --git a/src/main/java/racingcar/Member.java b/src/main/java/racingcar/Member.java new file mode 100644 index 0000000..46f05ea --- /dev/null +++ b/src/main/java/racingcar/Member.java @@ -0,0 +1,37 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.Random; + +public class Member { + private String name; + private int go; + + public Member(String name, int go) { + validateName(name); + this.name = name; + this.go = 0; + } + + public String getName() { + return name; + } + + public int getGo() { + return go; + } + //랜덤 뽑기 + public void startRandom() { + int randomValue = Randoms.pickNumberInRange(0, 9); + if (randomValue >= 4) { // 4 이상이면 전진 + go++; + } + } + //예외처리 + private void validateName(String name) { + if (name == null || name.isBlank() || name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 1~5자 사이여야 합니다."); + } + } +} diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java new file mode 100644 index 0000000..c2563ac --- /dev/null +++ b/src/main/java/racingcar/View.java @@ -0,0 +1,53 @@ +package racingcar; + +import java.util.List; +import java.util.Scanner; + +public class View { + private final Scanner scanner; + + public View() { + this.scanner = new Scanner(System.in); + } + //경주차 이름 입력 + public String[] getMemberNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + List lst = List.of(scanner.nextLine().split(",")); + + for (String s : lst) { + String trimmed = s.trim(); + + if (trimmed.isEmpty()) { + throw new IllegalArgumentException("자동차 이름이 공백"); + } + + if (trimmed.length() > 5) { + throw new IllegalArgumentException("이름 오류"); + } + } + + return lst.stream() + .map(String::trim) + .toArray(String[]::new); + } + //시도 회수 결정 + public int getTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + int tryNum = scanner.nextInt(); + if (tryNum <= 0) { + throw new IllegalArgumentException("시도 횟수는 이상"); + } + return tryNum; + } + //경주차 간거 표시 + public void printProgress(List members) { + for (Member m : members) { + System.out.println(m.getName() + " : " + "-".repeat(m.getGo())); + } + System.out.println(); + } + //우승자 발표 + public void printWinners(List winners) { + System.out.println("최종 우승자 : " + String.join(", ", winners.stream().map(Member::getName).toList())); + } +} \ No newline at end of file