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
42 changes: 41 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,41 @@
# java-baseball-precourse
# java-racingcar-precourse


## 🚀 기능 목록

### ✅ car 기능
- [x] 이동한다.
- [x] 이름을 반환한다.
- [x] 위치를 반환한다.

### ✅ car service 기능
- [x] 자동차들을 만든다.
- [x] 자동차들을 random값을 이용하여 이동시킨다.
- [x] 우승자를 찾는다.
- [x] 라운드마다 자동차들의 결과를 알려준다.

### ✅ controller 기능
- [x] 자동차 이름을 입력을 받는다.
- [x] 시도횟수를 입력받는다.
- [x] 우승자를 찾는다.
- [x] car game을 진행한다.

### ✅ view 기능
- [x] 입력을 받는다.
- [x] 입력의 기본 검증을 한다.
- [x] 출력을 보여준다.
- [x] 에러를 출력한다.


## 😕 입력 에러
### ✅ 입력 에러
- [x] 입력 문자열이 공백일 경우

### ✅ 양수 입력 에러
- [x] 정수가 아닐 경우
- [x] 양수가 아닐 경우

### ✅ car 이름 입력
- [x] 길이가 5글자 이하여야 함.
- [x] 자동차 이름이 공백인 경우
- [x] 중복된 자동차 이름이 있을 경우
8 changes: 8 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import controller.GameController;

public class Application {
public static void main(String[] args) {
GameController gameController = new GameController();
gameController.start();
}
}
59 changes: 59 additions & 0 deletions src/main/java/controller/GameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package controller;

import domain.CarService;
import domain.RandomNumberGenerator;
import java.util.Arrays;
import view.ErrorView;
import view.InputView;
import view.OutputView;

public class GameController {
private final CarService carService;
private Integer roundNum;

public GameController() {
this.carService = new CarService(new RandomNumberGenerator());
}

public void start() {
setUpCars();
setUpRoundNum();
runRound();
findWinner();
}

private void setUpCars() {
boolean success = false;
do {
try {
carService.addCars(Arrays.stream(InputView.inputCarNames().split(",")).toList());
success = true;
} catch (IllegalArgumentException e) {
ErrorView.printError(e);
}
} while (!success);
}

private void setUpRoundNum() {
boolean success = false;
do {
try {
this.roundNum = Integer.parseInt(InputView.inputRoundNum());
success = true;
} catch (IllegalArgumentException e) {
ErrorView.printError(e);
}
} while (!success);
}

private void runRound() {
OutputView.printRoundResultInit();
for (int i = 0; i < roundNum; i++) {
OutputView.printRoundResult(carService.run());
}
}

private void findWinner() {
OutputView.printWinner(carService.findWinner());
}
}
34 changes: 34 additions & 0 deletions src/main/java/domain/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package domain;

public class Car {
private static final Integer BOUNDARY_VALUE = 4;

private final String name;
private Integer distance;

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

public void move(Integer number) {
if (number.compareTo(BOUNDARY_VALUE) >= 0) {
advance();
}
}

private void advance() {
this.distance++;
}

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

public Integer getDistance() {
return this.distance;
}
}
97 changes: 97 additions & 0 deletions src/main/java/domain/CarService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package domain;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class CarService {
private static final Integer CAR_NAME_LENGTH = 5;

private final List<Car> cars = new ArrayList<>();
private final NumberGenerator numberGenerator;

public CarService(NumberGenerator numberGenerator) {
this.numberGenerator = numberGenerator;
}

// public void addCars(String[] names) {
// for (String name : names) {
// validateCarName(name);
// cars.add(new Car(name));
// }
// }
public void addCars(List<String> names) {
validateCarNames(names);
for (String name : names) {
cars.add(new Car(name));
}
}

public Map<String, Integer> run() {
Map<String, Integer> roundResult = new HashMap<>();
for (Car car : cars) {
car.move(numberGenerator.generate());
roundResult.put(car.getName(), car.getDistance());
}
return roundResult;
}

public List<String> findWinner() {
Car winner = cars.stream()
.max(Comparator.comparingInt(Car::getDistance)).get();
return cars.stream()
.filter(car -> car.getDistance().equals(winner.getDistance()))
.map(Car::getName)
.collect(Collectors.toList());
}

/**
* validate
*/
private void validateCarNames(List<String> names) throws IllegalArgumentException {
validateCarNamesEmpty(names);
validateCarNamesLength(names);
validateCarNameDup(names);
}

private void validateCarNamesLength(List<String> names) throws IllegalArgumentException {
if (names.stream().anyMatch(name -> name.length() > CAR_NAME_LENGTH)) {
throw new IllegalArgumentException("자동차 이름이 너무 깁니다.");
}
}

private void validateCarNamesEmpty(List<String> names) throws IllegalArgumentException {
if (names.stream().anyMatch(String::isEmpty)) {
throw new IllegalArgumentException("자동차 이름이 공백입니다.");
}
}

private void validateCarNameDup(List<String> names) throws IllegalArgumentException {
if (names.stream().distinct().count() < names.size()) {
throw new IllegalArgumentException("자동차 이름이 중복 됩니다.");
}
}

// private void validateCarName(String name) throws IllegalArgumentException {
// validateCarNameLength(name);
// validateCarNameDup(name);
// }
//
// private void validateCarNameLength(String name) throws IllegalArgumentException {
// if (name.length() > CAR_NAME_LENGTH) {
// throw new IllegalArgumentException("자동차 이름이 너무 깁니다.");
// }
// if (name.isEmpty()) {
// throw new IllegalArgumentException("자동차 이름이 공백입니다.");
// }
// }
//
// private void validateCarNameDup(String name) throws IllegalArgumentException {
// if (cars.stream().anyMatch(car -> car.getName().equals(name))) {
// throw new IllegalArgumentException("자동차 이름이 중복 됩니다.");
// }
// }
}
5 changes: 5 additions & 0 deletions src/main/java/domain/NumberGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package domain;

public interface NumberGenerator {
public Integer generate();
}
20 changes: 20 additions & 0 deletions src/main/java/domain/RandomNumberGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package domain;


import java.util.Random;

public class RandomNumberGenerator implements NumberGenerator{

// @Override
// public Integer generate(){
// Random random = new Random();
// random.setSeed(System.currentTimeMillis());
// return random.nextInt(9);
// }

@Override
public Integer generate() {
double randomValue = Math.random();
return (int)(randomValue*10);
}
}
7 changes: 7 additions & 0 deletions src/main/java/view/ErrorView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package view;

public class ErrorView {
public static void printError(RuntimeException error){
System.out.println("[ERROR] "+error.getMessage());
}
}
33 changes: 33 additions & 0 deletions src/main/java/view/InputValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package view;

public class InputValidator {
public static void validateString(String input) {
isNotEmpty(input);
}

public static void validatePositiveNumber(String input) {
isNotEmpty(input);
isInteger(input);
isPositive(input);
}

private static void isNotEmpty(String input) {
if (input.isEmpty()) {
throw new IllegalArgumentException("입력 문자열이 공백입니다.");
}
}

private static void isInteger(String input) {
try {
Integer.parseInt(input);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("정수를 입력해 주세요.");
}
}

private static void isPositive(String input) {
if (Integer.parseInt(input) < 1) {
throw new IllegalArgumentException("양수를 입력해 주세요.");
}
}
}
39 changes: 39 additions & 0 deletions src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package view;

import java.util.Scanner;

public class InputView {
private static final Scanner sc = new Scanner(System.in);

public static String inputCarNames() {
boolean success = false;
String input;
do {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
input = sc.next();
try {
InputValidator.validateString(input);
success = true;
} catch (IllegalArgumentException e) {
ErrorView.printError(e);
}
} while (!success);
return input;
}

public static String inputRoundNum() {
boolean success = false;
String input;
do {
System.out.println("시도할 회수는 몇회인가요?");
input = sc.next();
try {
InputValidator.validatePositiveNumber(input);
success = true;
} catch (IllegalArgumentException e) {
ErrorView.printError(e);
}
} while (!success);
return input;
}
}
22 changes: 22 additions & 0 deletions src/main/java/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package view;

import java.util.List;
import java.util.Map;

public class OutputView {
public static void printRoundResultInit() {
System.out.println();
System.out.println("실행 결과");
}

public static void printRoundResult(Map<String, Integer> cars) {
for (Map.Entry<String, Integer> car : cars.entrySet()) {
System.out.println(car.getKey() + " : " + "-".repeat(car.getValue()));
}
System.out.println();
}

public static void printWinner(List<String> winners){
System.out.print("최종 우승자 : "+String.join(", ",winners));
}
}
Loading