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

Moonjunwoong #2391

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
35 changes: 35 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
* 사용자 입력

차량 개수, 반복할 횟수
- camp.nextstep.edu.missionutils.Console의 readLine()를 통해 입력받기
- 숫자가 아닌 다른 값을 입력할 경우 IllegalArgumentException 발생 후 종료

* 자동차 이름
- camp.nextstep.edu.missionutils.Console의 readLine()를 통해 입력받기
- 자동차 이름은 쉼표(,)를 기준으로 구분
- 잘못된 값을 입력할 경우 IllegalArgumentException 발생 후 종료


* 난수 생성

- 0~9 사이의 난수
- 난수 생성은 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange()를 통해 생성


코드 구조

* Controller
- 게임이 돌아가기 위한 Controller

* Model
- 게임을 위한 메세지를 담고 있는 Message
- 게임을 위한 차 모델 Car

* Service
- 입력 등 게임을 위한 GameManager
- 차 이름을 입력받기 위한 InputCarsNameService
- 반복 횟수를 입력받기 위한 InputTryNumberService

* Util
- 이름 예외처리를 도와주는 CheckNameException
- 숫자 예외처리를 도와주는 CheckNumberException
11 changes: 10 additions & 1 deletion src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
package racingcar;


import racingcar.Controller.RacingGame;
import racingcar.Service.GameManager;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현

GameManager gameManager = new GameManager();

RacingGame racingGame = new RacingGame(gameManager.inputCarsName(),gameManager.inputTryNumber());

racingGame.playRacingGame();
}
}
63 changes: 63 additions & 0 deletions src/main/java/racingcar/Controller/RacingGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package racingcar.Controller;

import racingcar.Model.Car;
import racingcar.Model.Message;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class RacingGame {

private List<Car> cars;
private int number;

public RacingGame(List<String> cars, int number) {
setCars(cars);
this.number = number;
}

public List<Car> getCars() {
return cars;
}

private void setCars(List<String> carsName){
this.cars = new ArrayList<Car>();
for(String name : carsName){
cars.add(new Car(name));
}
}

private void playRacingRound(){
for(Car car : cars){
car.move();
}
System.out.println();
}

public void playRacingGame(){
System.out.println(Message.GAME_RESULT);
for (int i=0; i<number; i++){
playRacingRound();
}
System.out.print(Message.OUTPUT_WINNER);
System.out.println(winnerMaxDistance());
}

public String winnerMaxDistance(){
int maxDistance = getMaxDistance();
return this.cars
.stream()
.filter(car-> car.getPosition() == maxDistance)
.map(Car::getName)
.collect(Collectors.joining(", "));
}

public int getMaxDistance(){
return this.cars.stream()
.mapToInt(car -> car.getPosition())
.max()
.orElse(0);
}

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

import camp.nextstep.edu.missionutils.Randoms;

public class Car {

private String name;
private int position;

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

public int createRandomNumber() {
return Randoms.pickNumberInRange(0, 9);
}

public void move(){
if(createRandomNumber()>=4){
position++;
}
System.out.println(toString());
}

public String getName() {
return name;
}

public int getPosition() {
return position;
}

public String toString(){
return this.name + " : " + "-".repeat(this.position)+ "\n";
}
}
10 changes: 10 additions & 0 deletions src/main/java/racingcar/Model/Message.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package racingcar.Model;

public class Message {

public static final String INPUT_CARS_NAME = "경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).";
public static final String INPUT_TRY_NUMBER = "시도할 회수는 몇회인가요?";
public static final String GAME_RESULT = "실행 결과";
public static final String OUTPUT_WINNER = "최종 우승자 : ";

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

import racingcar.Model.Message;

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

public class GameManager {

InputCarsNameService InputCarsName = new InputCarsNameService();
InputTryNumberService InputTryNumber = new InputTryNumberService();

public List<String> inputCarsName(){
ArrayList<String> carsName = new ArrayList<>();
Collections.addAll(carsName, InputCarsName.inputStringCarsName());
return carsName;
}

public int inputTryNumber(){
System.out.println(Message.INPUT_TRY_NUMBER);
return InputTryNumber.input();
}
}
23 changes: 23 additions & 0 deletions src/main/java/racingcar/Service/InputCarsNameService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package racingcar.Service;

import camp.nextstep.edu.missionutils.Console;
import racingcar.Model.Message;
import racingcar.Util.CheckNameException;

public class InputCarsNameService {

public String[] inputStringCarsName() {
System.out.println(Message.INPUT_CARS_NAME);
return InputString();
}

private String[] InputString() {
String CarsName = Console.readLine();
CheckNameException.carsNameExceptionCheck(CarsName);
return splitCarsNameByDelimiter(CarsName);
}

private String[] splitCarsNameByDelimiter(String CarsName){
return CarsName.split(",");
}
}
13 changes: 13 additions & 0 deletions src/main/java/racingcar/Service/InputTryNumberService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package racingcar.Service;

import camp.nextstep.edu.missionutils.Console;
import racingcar.Util.CheckNumberException;

public class InputTryNumberService {

public int input(){
String input = Console.readLine();
CheckNumberException.numberValidation(input);
return Integer.parseInt(input);
}
}
43 changes: 43 additions & 0 deletions src/main/java/racingcar/Util/CheckNameException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package racingcar.Util;

import java.util.HashSet;
import java.util.Set;

public class CheckNameException {

public static void carsNameExceptionCheck(String input){
carsNameLengthCheck(input);
carsNameContainBlank(input);
carsNameisEmpty(input);
carNameEqualCheck(input);
}

public static void carsNameLengthCheck(String input){
for (String name : input.split(",")) {
if (name.length() > 5) {
throw new IllegalArgumentException("자동차 이름 길이를 초과하였습니다");
}
}
}

private static void carsNameContainBlank(String input){
if(input.contains(" ")){
throw new IllegalArgumentException("공백이 포함되어 있습니다");
}
}

private static void carsNameisEmpty(String input){
if(input.isEmpty()){
throw new IllegalArgumentException("값을 입력해 주세요");
}
}

public static void carNameEqualCheck(String input){
Set<String> carName = new HashSet<>();
for(String name : input.split(",")){
if(!carName.add(name)){
throw new IllegalArgumentException("중복된 이름 입니다.");
}
}
}
}
28 changes: 28 additions & 0 deletions src/main/java/racingcar/Util/CheckNumberException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package racingcar.Util;

public class CheckNumberException {
public static void numberValidation(String TryNumber){
numberCheck(TryNumber);
underPositiveNumber(TryNumber);
tryNumberisEmpty(TryNumber);
}
public static void numberCheck(String input){
try {
Integer.parseInt(input);
}catch (NumberFormatException numberFormatException){
throw new IllegalArgumentException("숫자값을 입력해주세요");
}
}
public static void underPositiveNumber(String input){
if(Integer.parseInt(input)<= 0){
throw new IllegalArgumentException("0보다 큰 값을 입력해주세요");
}
}
private static void tryNumberisEmpty(String input){
if(input.isEmpty()){
throw new IllegalArgumentException("값을 입력해 주세요");
}
}


}