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
Binary file added bin/main/racingcar/Application.class
Binary file not shown.
Binary file added bin/main/racingcar/Car.class
Binary file not shown.
Binary file added bin/main/racingcar/InputView.class
Binary file not shown.
Binary file added bin/main/racingcar/OutputView.class
Binary file not shown.
Binary file added bin/main/racingcar/RacingGame.class
Binary file not shown.
Binary file added bin/main/racingcar/RacingResult.class
Binary file not shown.
Binary file added bin/test/racingcar/ApplicationTest.class
Binary file not shown.
Binary file added bin/test/study/StringTest.class
Binary file not shown.
17 changes: 15 additions & 2 deletions src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
package racingcar;

import java.util.List;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
// 1. 입출력 뷰 객체 생성
InputView inputView = new InputView();
OutputView outputView = new OutputView();

// 2. 게임 엔진에 뷰 객체 주입 및 실행 (null 파라미터 제거)
RacingGame racingGame = new RacingGame(inputView, outputView);
List<Car> carList = racingGame.start();

// 3. 우승자 판별 및 결과 출력
// (RacingResult 내부에서도 outputView를 사용하도록 수정하는 것을 권장함)
RacingResult racingResult = new RacingResult();
racingResult.result(carList);
}
}
}
21 changes: 21 additions & 0 deletions src/main/java/racingcar/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package racingcar;

public class Car {
// public에서 private으로 변경하여 외부 조작 방지
private String carName;
private int count;

public Car(String carName) {
this.carName = carName;
this.count = 0;
}

public void upCount(int number) {
if (number >= 4) {
this.count++;
}
}

public String getCarName() { return carName; }
public int getCount() { return count; }
}
60 changes: 60 additions & 0 deletions src/main/java/racingcar/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package racingcar;

import camp.nextstep.edu.missionutils.Console;

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

public class InputView {

public List<Car> createCars() {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");

String nameInput = Console.readLine();
String[] carNames = nameInput.split(",");

List<String> existNames = new ArrayList<>(); //차 이름 중복 예외처리 하려고 만든 리스트

List<Car> carList = new ArrayList<>();

for (String name : carNames) {

if (name.length() > 5) {
throw new IllegalArgumentException("차 이름 5글자보다 클 수 없음");
}

if (name.isEmpty() || name.contains(" ")) {
throw new IllegalArgumentException("빈값, 공백 오류");
}

if (existNames.contains(name)) {
throw new IllegalArgumentException("중복된 차 있음");
}
existNames.add(name);

Car car = new Car(name);
carList.add(car);
}
return carList;
}

public int getCount() {

System.out.println("시도할 회수는 몇회인가요?");
String countInput = Console.readLine();

int tryCount;

try {
tryCount = Integer.parseInt(countInput);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("시도 횟수는 숫자여야함");
}

if (tryCount <= 0) {
throw new IllegalArgumentException("0보다 작은 수 안됨");
}

return tryCount;
}
}
26 changes: 26 additions & 0 deletions src/main/java/racingcar/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package racingcar;

import java.util.List;

public class OutputView {

public void printRunResultHeader() {
System.out.println("\n실행 결과");
}

public void printCarPosition(Car car) {
System.out.print(car.getCarName() + " : ");
for (int i = 0; i < car.getCount(); i++) {
System.out.print("-");
}
System.out.println();
}

public void printEmptyLine() {
System.out.println();
}

public void printWinners(List<String> winnerNames) {
System.out.print("최종 우승자 : " + String.join(", ", winnerNames));
}
}
33 changes: 33 additions & 0 deletions src/main/java/racingcar/RacingGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package racingcar;

import camp.nextstep.edu.missionutils.Randoms;
import java.util.List;

public class RacingGame {
private final InputView inputView;
private final OutputView outputView;

// 생성자를 통한 의존성 주입
public RacingGame(InputView inputView, OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

// 불필요한 List<Car> 매개변수 제거
public List<Car> start() {
List<Car> carList = inputView.createCars();
int count = inputView.getCount();

outputView.printRunResultHeader();

for (int i = 0; i < count; i++) {
for (Car car : carList) {
int randomNumber = Randoms.pickNumberInRange(0, 9);
car.upCount(randomNumber);
outputView.printCarPosition(car); // 출력 위임
}
outputView.printEmptyLine();
}
return carList;
}
}
31 changes: 31 additions & 0 deletions src/main/java/racingcar/RacingResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package racingcar;

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

public class RacingResult {

// 문제의 원인! 이 줄을 과감하게 삭제합니다.
// RacingGame racingGame = new RacingGame();

public void result(List<Car> carList) {
ArrayList<String> winnerList = new ArrayList<>();
int maxNum = 0;

for (Car car : carList) {
if (car.getCount() >= maxNum) {
maxNum = car.getCount();
}
}

for(Car car: carList) {
if (car.getCount() == maxNum ) {
winnerList.add(car.getCarName());
}
}

String winnerNames = String.join(", ", winnerList);
System.out.print("최종 우승자 : ");
System.out.print(winnerNames);
}
}