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

[Step 3] 자동차 경주 #5718

Open
wants to merge 12 commits into
base: 6democratickim9
Choose a base branch
from
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
15 changes: 15 additions & 0 deletions src/main/java/carRacingGame/CarRacingGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package carRacingGame;

public class CarRacingGame {
static CarRacingGameUtils cars = new CarRacingGameUtils();

public static void main(String[] args) {
String[] nameOfCars = InputView.inputNameOfCars();
int numberOfAttempts = InputView.inputNumberOfAttempts();

cars.setupCars(nameOfCars);
cars.displayRaceProgress(numberOfAttempts);
cars.printWinnerName();
}
}

67 changes: 67 additions & 0 deletions src/main/java/carRacingGame/CarRacingGameUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package carRacingGame;

import java.util.*;

import static carRacingGame.PrintView.printWinners;

public class CarRacingGameUtils {
public Map<String, String> cars = new HashMap<>();
public List<String> finalWinners = new ArrayList<>();

public Map<String, String> setupCars(String[] inputNameOfCars) {
for (String carName : inputNameOfCars) {
cars.put(carName, "");
}
return cars;
}

public void displayRaceProgress(int numberOfAttempts) {
System.out.println("실행 결과");
for (int attempt = 0; attempt < numberOfAttempts; attempt++) {
moveCars();
PrintView.printCars(cars);
System.out.println();
}
}

public void moveCars() {
cars.forEach((carName, currentPosition) -> {
String newPosition = moveForward(currentPosition);
cars.put(carName, newPosition);
});
}


public String moveForward(String currentPosition) {
Random random = new Random();
int randomValue = random.nextInt(10);
if (randomValue >= 4) {
currentPosition += "-";
}
return currentPosition;
}


public void printWinnerName() {
racingResult();
String winnerNames = "";
winnerNames = String.join(", ", finalWinners);
printWinners(winnerNames);
}

public void racingResult(){
String furthestDistance = Collections.max(cars.values());
int furthestDistanceOfCar = furthestDistance.length();

cars.forEach((carName, finalDistance) -> {
int carNameDistance = finalDistance.length();
getCurrentWinner(carName, furthestDistanceOfCar, carNameDistance);
});

}
public void getCurrentWinner(String carName, int furthestDistanceOfCar, int carNameDistance) {
if (carNameDistance >= furthestDistanceOfCar) {
finalWinners.add(carName);
}
}
}
35 changes: 35 additions & 0 deletions src/main/java/carRacingGame/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package carRacingGame;

import java.util.Scanner;

public class InputView {
private static final Scanner scanner = new Scanner(System.in);
private static final String splitter = ",";
public static String[] inputNameOfCars() {
System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).");
String nameOfCars = scanner.next();
if (!(nameOfCars instanceof String)) {
throw new IllegalArgumentException("Name of cars should be string type");
}
String[] listedCars = nameOfCars.split(splitter);

return listedCars;
}
public static int inputNumberOfCars() {
System.out.println("자동차 대수는 몇 대 인가요?");
int numberOfCars = scanner.nextInt();
if (numberOfCars <= 0) {
throw new IllegalArgumentException("Number of cars should be positive");
}
return numberOfCars;
}

public static int inputNumberOfAttempts() {
System.out.println("시도할 회수는 몇 회 인가요?");
int numberOfAttempts = scanner.nextInt();
if (numberOfAttempts <= 0) {
throw new IllegalArgumentException("Number of attempts should be positive");
}
return numberOfAttempts;
}
}
17 changes: 17 additions & 0 deletions src/main/java/carRacingGame/PrintView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package carRacingGame;

import java.util.Map;

public class PrintView {

public static void printCars(Map<String, String> cars) {
cars.forEach((carName, position) -> {
System.out.println(carName + " : " + position);
});
}

public static void printWinners(String winnerNames) {
System.out.println(winnerNames + "가 최종 우승했습니다.");

}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package StringAddCalculator;
package stringAddCalculator;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
package StringAddCalculator;
package stringAddCalculator;

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

public class StringCalculatorUtils {

private static final String DELEMETER = ",|:";

public static String[] splitStringCalculator(String inputs) {
String DELEMETER = ",|:";
String splitedString = inputs;
String currentDelimeter = DELEMETER;

if (inputs.startsWith("//")) {
int separatorIndex = inputs.indexOf("\n");
DELEMETER = inputs.substring(2, separatorIndex);
currentDelimeter = inputs.substring(2, separatorIndex); // 사용자 정의 구분자를 currentDelimeter에 저장
splitedString = inputs.substring(separatorIndex + 1);
}

return splitedString.split(DELEMETER);
return splitedString.split(currentDelimeter);

}
public static List<Integer> convertInputs(String[] inputs) {
List<Integer> result = new ArrayList<>();
Expand All @@ -29,7 +32,7 @@ public static List<Integer> convertInputs(String[] inputs) {
private static int toPositiveInteger(String input) {
int number = Integer.parseInt(input);
if (number < 0) {
throw new RuntimeException("There is wrong value included: " + input);
throw new IllegalArgumentException("There is wrong value included: " + input);
}
return number;
}
Expand Down
63 changes: 63 additions & 0 deletions src/test/java/CarRacingUtilsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@

import carRacingGame.CarRacingGameUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.Map;

import static org.junit.jupiter.api.Assertions.*;

public class CarRacingUtilsTest {

private CarRacingGameUtils carRacingGameUtils;

@BeforeEach
public void setUp() {
carRacingGameUtils = new CarRacingGameUtils();
}

@Test
@DisplayName("Test if car names are properly saved")
public void testSetupCars() {
String[] carNames = {"Car1", "Car2", "Car3"};

Map<String, String> cars = carRacingGameUtils.setupCars(carNames);

assertEquals(3, cars.size());
assertTrue(cars.containsKey("Car1"));
assertTrue(cars.containsKey("Car2"));
assertTrue(cars.containsKey("Car3"));
}

@Test
public void testMakeDistanceOfCars() {

String initialPosition = "";
String newPosition = carRacingGameUtils.moveForward(initialPosition);
assertTrue(newPosition.equals("") || newPosition.equals("-"));
}

@Test
public void testMoveCars() {

String[] carNames = {"Car1", "Car2"};
carRacingGameUtils.setupCars(carNames);
carRacingGameUtils.moveCars();
carRacingGameUtils.cars.forEach((carName, position) -> {
assertTrue(position.equals("") || position.equals("-"));
});
}

@Test
@DisplayName("test if winners found properly")
public void testRacingResult() {

String[] carNames = {"Car1", "Car2"};
carRacingGameUtils.setupCars(carNames);
carRacingGameUtils.moveCars();
carRacingGameUtils.racingResult();

assertFalse(carRacingGameUtils.finalWinners.isEmpty());
}
}
2 changes: 1 addition & 1 deletion src/test/java/StringCalculatorTest.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import StringAddCalculator.StringCalculator;
import stringAddCalculator.StringCalculator;
import org.junit.jupiter.api.Test;


Expand Down