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
19 changes: 19 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,20 @@
# java-racingcar-precourse
# 구현할 기능 목록

## 입력 기능
- 자동차 이름 입력받기
- 시도 횟수 입력받기

## 검증 기능
- 자동차 이름이 5자 이하인지 검증
- 잘못된 입력 시 IllegalArgumentException 발생

## 자동차 경주 기능
- 자동차 객체 생성
- 0~9 사이 랜덤 값 생성
- 랜덤 값이 4 이상이면 전진
- 주어진 횟수만큼 경주 진행

## 출력 기능
- 각 라운드마다 자동차 위치 출력
- 최종 우승자 출력 (공동 우승자 포함)
119 changes: 118 additions & 1 deletion src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,124 @@
package racingcar;

import camp.nextstep.edu.missionutils.Console;
import camp.nextstep.edu.missionutils.Randoms;

import java.util.ArrayList;
import java.util.List;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
try {
List<Car> cars = getCars();
int rounds = getRounds();

System.out.println();
System.out.println("실행 결과");
playGame(cars, rounds);

announceWinners(cars);
} catch (IllegalArgumentException e) {
throw e;
}
}

private static List<Car> getCars() {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
String input = Console.readLine();
String[] names = input.split(",");

List<Car> cars = new ArrayList<>();
for (String name : names) {
validateName(name);
cars.add(new Car(name));
}
return cars;
}

private static void validateName(String name) {
if (name.length() > 5) {
throw new IllegalArgumentException("자동차 이름은 5자 이하여야 합니다.");
}
}

private static int getRounds() {
System.out.println("시도할 횟수는 몇 회인가요?");
String input = Console.readLine();
return Integer.parseInt(input);
}

private static void playGame(List<Car> cars, int rounds) {
for (int i = 0; i < rounds; i++) {
moveAllCars(cars);
printStatus(cars);
}
}

private static void moveAllCars(List<Car> cars) {
for (Car car : cars) {
int randomValue = Randoms.pickNumberInRange(0, 9);
if (randomValue >= 4) {
car.move();
}
}
}

private static void printStatus(List<Car> cars) {
for (Car car : cars) {
System.out.println(car.getName() + " : " + car.getPosition());
}
System.out.println();
}

private static void announceWinners(List<Car> cars) {
int maxDistance = getMaxDistance(cars);
List<String> winners = getWinners(cars, maxDistance);
System.out.println("최종 우승자 : " + String.join(", ", winners));
}

private static int getMaxDistance(List<Car> cars) {
int max = 0;
for (Car car : cars) {
if (car.getDistance() > max) {
max = car.getDistance();
}
}
return max;
}

private static List<String> getWinners(List<Car> cars, int maxDistance) {
List<String> winners = new ArrayList<>();
for (Car car : cars) {
if (car.getDistance() == maxDistance) {
winners.add(car.getName());
}
}
return winners;
}
}

class Car {
private final String name;
private int distance;

public Car(String name) {
this.name = name;
this.distance = 0;
}

public void move() {
distance++;
}

public String getName() {
return name;
}

public int getDistance() {
return distance;
}

public String getPosition() {
return "-".repeat(distance);
}
}