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
29 changes: 28 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,28 @@
# java-racingcar-precourse
# 자동차 경주 게임

## 기능 구현 목록
✅ (입력) 자동차 이름 목록
- 유효성 검사: `,` 기준 구분, 5자 이하 (IllegalArgumentException)


✅ (입력) 이동 횟수
- 유효성 검사: 음수 여부(IllegalArgumentException)


✅ 자동차의 전진 여부
- 0~9 사이의 랜덤값 산정
- 4 이상의 값일 경우 1칸 전진


✅ 경주 게임 우승 여부
- 가장 많이 이동한 자동차 선정


✅ (출력) 회차별 실행 결과
- 모든 자동차에 대해 `${자동차이름} : -` format 출력


✅ (출력) 우승자
- 1명의 수증자: `최종 우승자 : ${자동차이름}` format 출력
- 2명 이상의 우승자: `,` 기준 구분 출력

10 changes: 9 additions & 1 deletion src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
Validator validator = new Validator();
RacingService racingService = new RacingService();
OutputFormatter outputFormatter = new OutputFormatter();

// 실행시 필요한 클래스 주입
RacingController controller = new RacingController(validator, racingService, outputFormatter);

// 실행
controller.run();
}
}
90 changes: 90 additions & 0 deletions src/main/java/racingcar/CarList.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package racingcar;

import camp.nextstep.edu.missionutils.Randoms;

import java.util.*;

public class CarList {
private final Map<String, Integer> carRecord;
private final int round;

// 생성자(Key: 차 이름, value: 전진 횟수)
public CarList(String[] carNames, int round){
this.carRecord = new LinkedHashMap<>();
this.round = round;

for(String car:carNames){
carRecord.put(car.trim(),0);
}
}

public Map<String, Integer> getCarRecord(){
return carRecord;
}

public int getRound(){
return round;
}

// 자동차 이동값 저장
public void saveMoves(){
Set<String> carNames = carRecord.keySet();
Iterator<String> carIter = carNames.iterator();

while(carIter.hasNext()){
String car = carIter.next();
int score = carRecord.get(car);
score += move();

carRecord.put(car, score);
}
}

// 자동차 이동
public int move(){
int randomValue = Randoms.pickNumberInRange(0,9);

if(randomValue >= 4){
return 1;
}else {
return 0;
}
}

// 우승자 선정
public List<String> selectWinners(Map<String, Integer> carRecord){
int highestScore = getHighestScore();
List<String> winners = new ArrayList<>();
Set<String> carNames = carRecord.keySet();
Iterator<String> carIter = carNames.iterator();

while(carIter.hasNext()){
String car = carIter.next();
int score = carRecord.get(car);

if(score == highestScore){
winners.add(car);
}
}

return winners;
}

// 최고 점수 산정
public int getHighestScore(){
int highestScore = 0;
Set<String> carNames = carRecord.keySet();
Iterator<String> carIter = carNames.iterator();

while(carIter.hasNext()){
String car = carIter.next();
int score = carRecord.get(car);

if(score > highestScore){
highestScore = score;
}
}

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

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class OutputFormatter {
private final StringBuilder sb = new StringBuilder("실행결과\n");

// 차수별 실행 결과
public void getRoundRecord(Map<String, Integer> carRecord){
Set<String> carNames = carRecord.keySet();
Iterator<String> carIter = carNames.iterator();

while(carIter.hasNext()){
String car = carIter.next();
String format = "-";
sb.append(car+" : "+format.repeat(carRecord.get(car))+"\n");
}
sb.append("\n");
}

// 우승자 안내 문구
public void getWinners(List<String> winners){
sb.append("최종 우승자 : "+String.join(", ",winners));
}

// 문구 전달
public StringBuilder getStringBuilder(){
return sb;
}
}
48 changes: 48 additions & 0 deletions src/main/java/racingcar/RacingController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package racingcar;

import camp.nextstep.edu.missionutils.Console;

import java.io.IOException;
import java.util.Map;

public class RacingController {
private final Validator validator;
private final RacingService racingService;
private final OutputFormatter outputFormatter;

public RacingController(Validator validator,
RacingService racingService, OutputFormatter outputFormatter){
this.validator = validator;
this.racingService = racingService;
this.outputFormatter = outputFormatter;
}

public void run() {

// 자동차 이름 입력 받기
System.out.println("경주할 자동차 이름을 입력하세요." +
"(이름은 쉼표(,) 기준으로 구분)");
String[] carNames = validator.validCarNames(Console.readLine());

// 경주 회차 입력 받기
System.out.println("시도할 횟수는 몇 회인가요?");
int round = validator.validRoundNumber(Console.readLine());

// 자동차 목록 생성
racingService.startRace(carNames, round);

// 차수별 실행 결과 작성
for(int i=0; i<round; i++){
Map<String,Integer> record = racingService.runEachRace();
outputFormatter.getRoundRecord(record);
}

// 우승자 안내 문구 작성
outputFormatter.getWinners(racingService.selectWinners());

// 최종 문구 출력
System.out.println(outputFormatter.getStringBuilder());
}


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

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

public class RacingService {
private CarList carList;

// 자동차 목록 객체 생성
public void startRace(String[] carNames, int round){
this.carList = new CarList(carNames, round);
}

// 자동차 경주 시행
public Map<String,Integer> runEachRace(){
carList.saveMoves();
return carList.getCarRecord();
}

// 우승자 선정
public List<String> selectWinners(){
return carList.selectWinners(carList.getCarRecord());
}
}
43 changes: 43 additions & 0 deletions src/main/java/racingcar/Validator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package racingcar;

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

public class Validator {
// 자동차 문자열 검증
public String[] validCarNames(String input){
String[] carArr = input.split(",");

// 차가 1대인 경우
if(carArr.length == 1) throw new IllegalArgumentException();

for(String car:carArr){
if(car.length() > 5 || car.isEmpty()){ // 차 이름이 5자 이상이거나 공백인 경우
throw new IllegalArgumentException();
}
}

// 차 이름 중복 여부 확인
Set<String> uniqueCarNames = new HashSet<>(Arrays.asList(carArr));
if(uniqueCarNames.size() != carArr.length){
throw new IllegalArgumentException();
}

return carArr;
}

// 경주 회차수 검증
public int validRoundNumber(String input){
try{
int round = Integer.parseInt(input);
if(round <= 0) {
throw new Exception();
}
return round;

}catch(Exception e){
throw new IllegalArgumentException();
}
}
}
Loading