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

Step4 - 자동차 경주(우승자) #5490

Open
wants to merge 19 commits into
base: jinnie-j
Choose a base branch
from
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
15 changes: 11 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
# 자동차 경주 게임

## 진행 방법

* 자동차 경주 게임 요구사항을 파악한다.
* 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
* 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
* 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.

## 온라인 코드 리뷰 과정

* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview)

## 기능 요구사항

* 초간단 자동차 경주 게임을 구현한다.
* 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
* 사용자는 몇 대의 자동차로 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
* 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우이다.
* 자동차의 상태를 화면에 출력한다. 어느 시점에 출력할 것인지에 대한 제약은 없다.

## 기능 구현사항
- 자동차 대수와 시도 횟수를 입력받는다.
- 0-9 사이가 아닌 숫자 또는 빈값을 입력하는 경우 오류가 발생한다.
- 0-9 사이의 랜덤 값을 생성하여 4이상일 경우 전진한다.
- 시도 횟수만큼 모든 자동차의 상태를 출력한다.

- [x] 자동차 이름과 시도 횟수를 입력받는다.
- [x] 자동차 이름 길이 5 제한
- [x] 0-9 사이가 아닌 숫자 또는 빈값을 입력하는 경우 오류가 발생한다.
- [x] 0-9 사이의 랜덤 값을 생성하여 4이상일 경우 전진한다.
- [x] 시도 횟수만큼 모든 자동차의 상태를 출력한다.
- [x] 경주 종료 후 우승를 출력한다.
Comment on lines +24 to +29
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기능 목록 정리 👍

49 changes: 0 additions & 49 deletions src/main/java/calculator/Calculator.java

This file was deleted.

27 changes: 25 additions & 2 deletions src/main/java/racingcar/Car.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,21 @@
public class Car {
private static final int MOVE_STANDARD = 4;
private static final int DEFAULT_DISTANCE = 1;
private int position = 0;

private final String name;
private int position;

public Car(String name, int position) {
if (name.length() > 5) {
throw new IllegalArgumentException("자동차 이름의 길이를 5 이하로 입력해주세요.");
}
this.name = name;
this.position = position;
}

public String getName() {
return this.name;
}

public void move(int number) {
if (number >= MOVE_STANDARD) {
Expand All @@ -14,4 +28,13 @@ public void move(int number) {
public int getPosition() {
return this.position;
}
}

public int getMax(int max) {
return Math.max(max, this.position);
}

public boolean isMaxPosition(int max) {
return this.position == max;
}

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

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

public class Cars {

private static final String COMMA = ",";
private final List<Car> carList;

public Cars(List<Car> carList) {
this.carList = carList;
}

public static List<Car> makeCarList(String names) {
List<Car> carList = new ArrayList<>();
for (String name : splitNames(names)) {
checkCarName(name);
carList.add(new Car(name, 0));
}
return carList;
}
Comment on lines +16 to +23
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 메서드외에 Cars의 활용도가 없네요 😢
Cars를 어떤 용도로 만드셨는지 궁금합니다 🤔
Cars 클래스가 경주에 참가자한 자동차들의 목록이라면 자동차들에게 이동하라고 메시지를 보내거나
우승자를 구하는 책임을 수행하면 어떨까요?


private static void checkCarName(String name) {
if (isNullOrBlank(name)) {
throw new IllegalArgumentException();
}
}

private static boolean isNullOrBlank(String name) {
return name == null || name.isBlank();
}

public static List<String> splitNames(String names) {
return new ArrayList<>(Arrays.asList(names.split(COMMA)));
}

public int size() {
return carList.size();
}

}
16 changes: 9 additions & 7 deletions src/main/java/racingcar/InputValue.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
package racingcar;

public class InputValue {
private final int numberOfCars;
private final String names;
private final int tryCount;

public InputValue(int numberOfCars, int tryCount){
this.numberOfCars = numberOfCars;
public InputValue(String names, int tryCount) {
this.names = names;
this.tryCount = tryCount;
}

public int getNumberOfCars(){
return numberOfCars;
public String getNameOfCars() {
return names;
}

public int getTryCount(){
public int getTryCount() {
return tryCount;
}
}


}
15 changes: 8 additions & 7 deletions src/main/java/racingcar/InputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@
import java.util.Scanner;

public class InputView {
private final static Scanner scanner = new Scanner(System.in);
static Validator validator = new Validator();
private static final Scanner SCANNER = new Scanner(System.in);
private static final NumberValidator validator = new NumberValidator();

public static String numberOfCar() {
System.out.println("자동차 대수는 몇 대 인가요?");
return scanner.nextLine();
public static String nameOfCars() {
System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).");
return SCANNER.nextLine();
}

public static String tryCntInput() {
System.out.println("시도할 횟 수는 몇 회 인가요?");
return scanner.nextLine();
return SCANNER.nextLine();
}


public static int inputNumber(String value) {
return numberCheck(value);
}
Expand All @@ -25,4 +26,4 @@ public static Integer numberCheck(String value) {
validator.nullCheck(value);
return Integer.parseInt(value);
}
}
}
31 changes: 31 additions & 0 deletions src/main/java/racingcar/NumberValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package racingcar;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumberValidator {
private static final Pattern NUMERIC_PATTERN = Pattern.compile("\\d");
public static final int MIN_DISTANCE = 0;

public void nullCheck(String input) {
if (input == null || input.isBlank()) {
throw new RuntimeException("빈 값이 입력되었습니다.");
}
}

public void numericCheck(String input) {
Matcher matcher = NUMERIC_PATTERN.matcher(input);
if (!matcher.find()) {
throw new RuntimeException("숫자만 입력해주세요.");
}
numberCheck(input);
}

private void numberCheck(String input) {
Integer number = Integer.parseInt(input);
if (number < MIN_DISTANCE) {
throw new RuntimeException("0-9 사이의 숫자를 입력해주세요.");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메시지를 보면 9 를 초과하는 숫자는 입력할 수 없을 것 같지만
실제로는 9 보다 큰 숫자를 입력할 수 있는데요
기능이 변경되었다면 예외 메시지도 함께 변경해 주시면 좋을 것 같아요

}
}

}
6 changes: 4 additions & 2 deletions src/main/java/racingcar/RacingApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ public class RacingApplication {

public static void main(String[] args) {
RacingGame game = new RacingGame();
game.start(new InputValue(InputView.inputNumber(InputView.numberOfCar()), InputView.inputNumber(InputView.tryCntInput())));
String namesOfCar = (InputView.nameOfCars());
int tryCntInput = InputView.inputNumber(InputView.tryCntInput());
game.start(new InputValue(namesOfCar, tryCntInput));
}
}
}
12 changes: 6 additions & 6 deletions src/main/java/racingcar/RacingGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@
import java.util.List;

public class RacingGame {
private RandomUtil randomUtil = new RandomUtil();
private List<Car> cars = new ArrayList<>();

public void start(InputValue input) {
for (int i = 0; i < input.getNumberOfCars(); i++) {
cars.add(new Car());
}
cars = Cars.makeCarList(input.getNameOfCars());

ResultView.printResultMessage();
for (int i = 0; i < input.getTryCount(); i++) {
forward();
System.out.println();
}
ResultView.printWinners(Record.getRecord(cars));

}

public void forward() {
for (Car car : cars) {
car.move(this.randomUtil.randomCount(10));
car.move(RandomUtil.randomCount(10));
}
ResultView.printResult(cars);
}
}
}
3 changes: 3 additions & 0 deletions src/main/java/racingcar/RandomUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
public class RandomUtil {
private final static Random random = new Random();

private RandomUtil() {
}

public static int randomCount(int number) {
return random.nextInt(number);
}
Expand Down
34 changes: 34 additions & 0 deletions src/main/java/racingcar/Record.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package racingcar;

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

public class Record {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

클래스명은 기록인데, 우승자를 구하는 로직만 포함되어 있네요
기록이라는 클래스명에 맞게 자동차 경주 결과를 상태로 관리하면 어떨까요?
자동차의 목록을 외부에서 받기 보다 내부의 상태 값으로 우승자를 구할 수 있다면 어떨까요?

public static List<String> getRecord(List<Car> carList) {
return getWinnerList(carList, findMaxPosition(carList));
}

public static int findMaxPosition(List<Car> carList) {
int max = 0;
for (Car car : carList) {
max = car.getMax(max);
}
return max;
}

private static List<String> getWinnerList(List<Car> carList, int max) {
List<String> winnerList = new ArrayList<>();

for (Car car : carList) {
makeWinnerList(winnerList, max, car);
}
return winnerList;
}

private static List<String> makeWinnerList(List<String> winnerList, int max, Car car) {
if (car.isMaxPosition(max)) {
winnerList.add(car.getName());
}
return winnerList;
}
}
6 changes: 6 additions & 0 deletions src/main/java/racingcar/ResultView.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ public static void printResult(List<Car> cars) {
}

public static void printCarResult(Car car) {

System.out.print(car.getName() + " : ");
for (int i = 0; i < car.getPosition(); i++) {
System.out.print("-");
}
Expand All @@ -20,4 +22,8 @@ public static void printCarResult(Car car) {
public static void printResultMessage() {
System.out.println("실행 결과");
}

public static void printWinners(List<String> winnerList) {
System.out.println(String.join(",", winnerList) + "가 최종 우승했습니다.");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

join 👍

}
}
Loading