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
23 changes: 23 additions & 0 deletions README-HS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
## 요구사항
1. depth 는 3이 넘지 않도록 구현
2. else 사용 불가
3. 3항 연산자 불가
4. 메소드는 한가지 일만 하도록 구현
5. 모든 원시 값과 문자열을 포장
6. 일급 컬렉션 사용

**Scanner 를 사용한 입력은 구현하지 않고 도메인만 구현**

---

## 구현 내용
1. 자동차 이름 입력
- 5자 초과 불가
- 쉼표로 구분
2. 시도 횟수 입력
- 숫자 입력만 가능
3. 시도 횟수 만큼 실행
1. 랜덤 값 생성
2. 랜덤 값 4 이상일 경우 전진
3. 실행 결과 출력
4. 최종 레이싱 결과와 우승자 출력
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
13 changes: 13 additions & 0 deletions src/main/java/RacingCarApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import racingcar.domain.Race;
import racingcar.domain.Cars;
import racingcar.view.RaceResult;

public class RacingCarApplication {
public static void main(String[] args) {
Cars cars = new Cars("red,blue,pink");
Race race = new Race(cars, 3);

RaceResult raceResult = race.raceStart();
raceResult.printWinner();
}
}
40 changes: 40 additions & 0 deletions src/main/java/racingcar/domain/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package racingcar.domain;

public class Car {
private static final int FORWARD_NUM = 4;

private Name name;
private Location location;

public Car(String name) {
this.name = new Name(name);
this.location = new Location();
}

public void move(int randomNum) {
if (randomNum >= FORWARD_NUM){
location.forward();
}
}

public boolean isWinner(Location maxLocation){
return location.equals(maxLocation);
}

public Location getMaxLocation(Location maxLocation) {
return location.lessThan(maxLocation);
}

public Name getName(){
return name;
}

public Location getLocation() {
return location;
}

@Override
public String toString() {
return name.toString() + " : " + location.toString();
}
}
57 changes: 57 additions & 0 deletions src/main/java/racingcar/domain/Cars.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package racingcar.domain;

import racingcar.exception.CarException;
import racingcar.exception.messages.ErrorMessages;
import racingcar.util.RacingCarUtil;

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

public class Cars {
private final List<Car> cars;

public Cars(String carNameStr) {
this.cars = new ArrayList<>();
createCar(carNameStr);
}

public void createCar(String carNameStr) {
String[] carNames = RacingCarUtil.splitName(carNameStr);

for (String carName : carNames){
if(!Name.isNameLengthLessThanFive(carName)){
throw new CarException(ErrorMessages.CAR_NAME_OVER_FIVE);
}
cars.add(new Car(carName));
}
}

public String getWinnerName(){
Location maxLocation = getMaxLocation();

return cars.stream()
.filter(car -> car.isWinner(maxLocation))
.map(car -> car.getName().toString())
.collect(Collectors.joining(", "));

}

public Location getMaxLocation(){
Location maxLocation = new Location();

for(Car car : cars){
maxLocation = car.getMaxLocation(maxLocation);
}

return maxLocation;

}

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



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

import java.util.Objects;

public class Location {
private int location;

public Location(){
this.location = 0;
}

public Location(int location){
this.location = location;
}

public void forward(){
location++;
}

public Location lessThan(Location maxLocation) {
if (location > maxLocation.location){
return this;
}
return maxLocation;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Location location1 = (Location) o;
return location == location1.location;
}

@Override
public int hashCode() {
return Objects.hashCode(location);
}

@Override
public String toString() {
return "-".repeat(location);
}
}
35 changes: 35 additions & 0 deletions src/main/java/racingcar/domain/Name.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package racingcar.domain;

import java.util.Objects;

public class Name {
private static final int CAR_NAME_MAX = 5;

private String name;

public Name(String name){
this.name = name;
}

public static boolean isNameLengthLessThanFive(String name) {
return name.length() < CAR_NAME_MAX;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Name name1 = (Name) o;
return Objects.equals(name, name1.name);
}

@Override
public int hashCode() {
return Objects.hashCode(name);
}

@Override
public String toString() {
return name;
}
}
32 changes: 32 additions & 0 deletions src/main/java/racingcar/domain/Race.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package racingcar.domain;

import racingcar.util.RacingCarUtil;
import racingcar.view.RaceResult;

public class Race {
private final Cars cars;
private final int repeatNum;
private final RaceResult raceResult;

public Race(Cars cars, int repeatNum){
this.cars = cars;
this.repeatNum = repeatNum;
this.raceResult = new RaceResult(cars);
}

public RaceResult raceStart(){
for(int i=0; i<repeatNum; i++){
race();
}
return raceResult;
}

public void race() {
for(Car car : cars.getCars()){
car.move(RacingCarUtil.createRandomNumber());
raceResult.printRace(car);
}
System.out.println();
}

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

public class CarException extends RuntimeException {
public CarException(String message) {
super(message);
}
}
5 changes: 5 additions & 0 deletions src/main/java/racingcar/exception/messages/ErrorMessages.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package racingcar.exception.messages;

public class ErrorMessages {
public static final String CAR_NAME_OVER_FIVE = "자동차 이름은 5자를 초과할 수 없습니다.";
}
18 changes: 18 additions & 0 deletions src/main/java/racingcar/util/RacingCarUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package racingcar.util;

import java.util.Random;

public class RacingCarUtil {
private static final int RANDOM_BOUND = 9;

private static final Random random = new Random();

public static int createRandomNumber() {
return random.nextInt(RANDOM_BOUND) + 1;
}

public static String[] splitName(String carNameStr) {
return carNameStr.replaceAll(" ", "").split(",");
}

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

import racingcar.domain.Car;
import racingcar.domain.Cars;

public class RaceResult {
private final Cars cars;

public RaceResult(Cars cars) {
this.cars = cars;
}

public void printWinner(){
String winnerName = cars.getWinnerName();

for(Car car : cars.getCars()){
printRace(car);
}

System.out.println("\n" + winnerName + " 가 최종 우승했습니다.");
}

public void printRace(Car car){
System.out.println(car.toString());
}

}
Loading