Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
363791f
init
nahyunKoo Mar 23, 2024
0a2264b
docs(docs/README.md) : 구현할 기능 목록 문서
nahyunKoo Mar 23, 2024
44ea420
feat(getCarNames) : 경주 자동차 이름 입력 받기
nahyunKoo Mar 25, 2024
7fcedd6
feat(getTryCount) : 시도 횟수 입력받기
nahyunKoo Mar 25, 2024
94a84d2
feat(RacingGame) : 생성자
nahyunKoo Mar 25, 2024
1899ff3
feat(tryCountValidate, carNamesValidate) : 입력 받은 차 이름과 경기 횟수 예외처리
nahyunKoo Mar 26, 2024
0cccb3d
refactor(tryCountValidate, carNamesValidate) : InputView 클래스로 이동
nahyunKoo Mar 26, 2024
f0b640b
feat(printRaceStep, Start) : 단계출력하는 메소드 구현
nahyunKoo Mar 26, 2024
ddd9abe
feat(race) : 경기 진행하는 메소드 구현
nahyunKoo Mar 26, 2024
d6c6420
refactor(race)
nahyunKoo Mar 26, 2024
d969f5f
feat(printWinners) : 우승자 출력 메소드 구현
nahyunKoo Mar 26, 2024
5ff3028
refactor(generateRandomDistance) : 반복문 구조 변경
nahyunKoo Mar 27, 2024
3a0fc28
refactor(printRaceStep) : 구조 변경
nahyunKoo Mar 27, 2024
80042f8
feat(getWinners) : 우승자 구하는 메소드 구현
nahyunKoo Mar 27, 2024
5a9fab3
refactor(printRaceStep, start) : 접근제한자 변경
nahyunKoo Mar 27, 2024
a575cd3
refactor(race) : 단계 출력 하는 부분 수정
nahyunKoo Mar 28, 2024
254f5b1
refactor : 출력 개행 수정
nahyunKoo Mar 28, 2024
6a840bb
docs : 주석 추가
nahyunKoo Mar 28, 2024
cd2fb7e
test : 테스트 클래스 추가
nahyunKoo Mar 28, 2024
fe0f5e7
refactor(carNamesValidate, tryCountValidate) : 유효성 검사 도메인으로 이동
nahyunKoo Mar 28, 2024
64d31fc
refactor(generateRandomDistance) : 패키지 이동
nahyunKoo Mar 28, 2024
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
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@

자동차 경주 미션 저장소

//경주할 자동차 이름 입력받기
//시도할 횟수 입력 받기
//경주 진행하기
//우승자 출력하기
8 changes: 5 additions & 3 deletions src/main/java/RacingMain.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
public class RacingMain {
import controller.RacingController;
import domain.RacingGame;

public class RacingMain {
public static void main(String[] args) {
// TODO: MVC 패턴을 기반으로 자동차 경주 미션 구현해보기
System.out.println("Hello, World!");
final RacingController racingController = new RacingController();
racingController.run();
}
}
53 changes: 53 additions & 0 deletions src/main/java/controller/RacingController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package controller;

import domain.RacingGame;
import util.GenerateRandomDistance;
import view.InputView;
import view.ResultView;

import java.util.*;


public class RacingController {
public void run(){
try{
final var cars = InputView.readCarNames(); //차이름 입력받기
final var tryCount = InputView.readTryCount(); //시도 횟수 입력받기

final var racingGame = new RacingGame(cars, tryCount);
race(racingGame); //경주 실행

ResultView.printWinners(getWinners(racingGame.getCars())); //우승자 출력

}catch(IllegalArgumentException e){
System.out.println(e.getMessage());
}
}


//경주 실행
private void race(RacingGame racingGame){
ResultView resultView = new ResultView();
resultView.start(racingGame.getCars());

for(int i = 0; i < racingGame.getTryCount(); i++){
GenerateRandomDistance.generateRandomDistance(racingGame.getCars());
resultView.printRaceStep(racingGame.getCars());
System.out.println();
}
}


//우승자 구하는 메소드
private List<String> getWinners(Map<String, Integer> cars){
List<String> winners = new ArrayList<>();
int maxValue = Collections.max(cars.values());

for(Map.Entry<String, Integer> entry : cars.entrySet()){ //이거 메소드로 분리하는게 가독성이 더 떨어질듯?
if(entry.getValue() == maxValue){
winners.add(entry.getKey());
}
}
return winners;
}
}
56 changes: 56 additions & 0 deletions src/main/java/domain/RacingGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package domain;

import java.util.*;

public class RacingGame {
private static Map<String, Integer> cars;
private int tryCount;

public RacingGame(){

Choose a reason for hiding this comment

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

여긴 무슨공간인가요?

Copy link
Author

@nahyunKoo nahyunKoo Mar 28, 2024

Choose a reason for hiding this comment

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

여백의 미랄까 ...
수정하겠습니다 !

}
public RacingGame(Map<String, Integer> cars, int tryCount){
carNamesValidate(cars);
tryCountValidate(tryCount);
this.cars = cars;
this.tryCount = tryCount;
}

//자동차 distance 업데이트 메소드
public static void updateDistance(String carName, int random){
if(random >= 4) {
int distance = cars.get(carName) + 1;
cars.replace(carName, distance);
}
}

public Map<String, Integer> getCars() {
return cars;
}

public int getTryCount() {
return tryCount;
}

public static void tryCountValidate(int count){
if(count <= 0)
throw new IllegalArgumentException("[ERROR]시도 횟수는 양수입니다.");
}

//차이름 유효성 검사 메소드
public static void carNamesValidate(Map<String, Integer> cars){
Iterator<String> keys = cars.keySet().iterator();
while(keys.hasNext()){
String key = keys.next();
lengthValidate(key);
}

}

//차 길이 유효성 검사 메소드
private static void lengthValidate(String name){
if(name.length() > 5)
throw new IllegalArgumentException("[ERROR]차 이름은 5자 이하여야합 니다.");
}

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

import domain.RacingGame;

import java.util.Map;
import java.util.Random;

public class GenerateRandomDistance {

public static void generateRandomDistance(Map<String, Integer> cars){
for(Map.Entry<String, Integer> entry : cars.entrySet()){
Random random = new Random();
int randomNum = random.nextInt(10);
RacingGame.updateDistance(entry.getKey(), randomNum);
}
}
}
33 changes: 33 additions & 0 deletions src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package view;

import java.util.*;

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

//차이름 입력 메소드
public static Map<String, Integer> readCarNames(){
try{
Map<String, Integer> cars = new HashMap<>();
System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).");
String line = scanner.nextLine();
String[] str = line.split(",");
for(int i = 0; i<str.length; i++){
cars.put(str[i], 1);
}
return cars;
}catch(IllegalArgumentException e){
System.out.println(e.getMessage());
return null;
}
}

//시도횟수 입력 메소드
public static int readTryCount(){
System.out.println("시도할 횟수는 몇회인가요?");
int count = scanner.nextInt();
scanner.nextLine();
return count;
}

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

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

public class ResultView {

//우승자 출력 메소드
public static void printWinners(List<String> winners){
int i;
for(i = 0; i < winners.size() - 1; i++){
System.out.print(winners.get(i)+ ", ");
}
System.out.print(winners.get(i) + "가 최종 우승했습니다.");
}

//경주 단계 출력 메소드
public void printRaceStep(Map<String, Integer> cars){
for(Map.Entry<String, Integer> entry : cars.entrySet()){
String name = entry.getKey();
String distance = "-".repeat(cars.get(name));
System.out.println(name + " : " + distance);
}
}

//경주 시작 출력 메소드
public void start(Map<String, Integer> cars){
System.out.println("실행 결과");
printRaceStep(cars);
System.out.println();
}
}


4 changes: 4 additions & 0 deletions src/test/java/controller/RacingControllerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package controller;

public class RacingControllerTest {
}
4 changes: 4 additions & 0 deletions src/test/java/domain/RacingGameTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package domain;

public class RacingGameTest {
}
4 changes: 4 additions & 0 deletions src/test/java/view/InputViewTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package view;

public class InputViewTest {
}
18 changes: 18 additions & 0 deletions src/test/java/view/ResultViewTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package view;

import org.junit.jupiter.api.Test;
import org.assertj.*;

public class ResultViewTest {

@Test
void 기능_테스트(){
//given

//when

//then


}
}