Skip to content

[노현욱] RacingCar Mission 구현 #6

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

Open
wants to merge 29 commits into
base: rohsik2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
86d0ac4
docs(기능목록) : 구현전 기능 목록을 간략하게 정리
rohsik2 Mar 12, 2023
ecb4486
feat(Application) : 자동차 이름을 받는 생성자 구현
rohsik2 Mar 12, 2023
476ee32
feat(Application) : 자동차 이름에 중복이 있는지 확인하는 로직 추가
rohsik2 Mar 12, 2023
6d4091e
test(Application) : 자동차 이름에 중복이 있을때 오류가 나는지 확인
rohsik2 Mar 12, 2023
3cb0d19
refactor(Application) : set자료구조를 활용해 중복 검사 로직 최적화
rohsik2 Mar 12, 2023
ec3a7d7
Merge remote-tracking branch 'origin/rohsik2' into rohsik2
rohsik2 Mar 12, 2023
517644e
refactor : indent가 tab으로 설정되어있어 4개의 space로 변경
rohsik2 Mar 12, 2023
a1979df
feat(InputManager) : 숫자와, 글자를 받아오는 역할을 수행할 static class 작성
rohsik2 Mar 15, 2023
86a9bf2
test(ApplicationTest) : 글자를 받아와서 자르는 일을 InputManager에 위임
rohsik2 Mar 15, 2023
29d7d7f
refactor(Application) : Application이 String 배열로 Init 되도록 변경
rohsik2 Mar 15, 2023
24ca6b5
feat(Application) : 게임에 몇번째 턴인지 체크하고, 입력받는 기능 추가
rohsik2 Mar 15, 2023
b48267e
test(ApplicationTest) : 최대 턴 횟수를 입력 받게 생성자 변경에 따른 변경
rohsik2 Mar 15, 2023
edd9e55
refactor(InputManager) : 턴 횟수의 validation check logic을 어플리케이션에 위임
rohsik2 Mar 15, 2023
3859fe8
feat(Car) : 랜덤으로 앞으로 가도록 만드는 기능 작성
rohsik2 Mar 15, 2023
28e1162
feat(Car) : 자동차의 정보를 출력하기 위해서 getter 구현
rohsik2 Mar 15, 2023
be0d99b
feat(PrintManager) : 콘솔에 가이드 및 자동차 위치를 출력하기 위한 함수 작성
rohsik2 Mar 15, 2023
e6c8dbe
feat(PrintManager) : 출력 포맷을 맞추기 위해 실행결과 출력 함수 작성
rohsik2 Mar 15, 2023
7454c9f
feat(Application) : 승자 확인함수 작성
rohsik2 Mar 15, 2023
5cd9fb1
feat(Application) : 게임 진행 로직 작성
rohsik2 Mar 15, 2023
cf54dff
feat(PrintManager) : 게임 종료 메세지 출력 메소드 작성
rohsik2 Mar 15, 2023
baf4aa8
feat(Appliation) : 전체 총괄 로직 작성및 main method 작성
rohsik2 Mar 15, 2023
914fcfa
refactor(OutputManager, InputManager) : static이 아닌 인스턴스화 가능한 클래스로 작성
rohsik2 Mar 17, 2023
2b8d017
fix(ApplicationTest) : application 생성자 변경에 따른 test 코드 일부 제거
rohsik2 Mar 17, 2023
8b43b23
refactor(Application->RacingGame) : 클래스명 변경 및 Start 함수하나로 시작하도록 변경
rohsik2 Mar 17, 2023
ebac380
feat(OutputManager) : 예쁘게 출력하기 위해 글자 길이 고정
rohsik2 Mar 17, 2023
3aa25fc
feat(RacingGame) : 자동차 이름 길이 설정 및 trim 통해 이름 좌우 여백 삭제
rohsik2 Mar 17, 2023
ea35570
refactor(OutputManager) : 자동차 이름 고정 폭으로 만들면서 stringbuilder사용
rohsik2 Mar 17, 2023
7b2c003
fix : 이름의 최대 길이가 5글자 임에, 그에 따라 수정
rohsik2 Mar 18, 2023
d5094a0
fix(Car): 0~9중 4이상의 숫자로 전진하도록 변경
rohsik2 Mar 18, 2023
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
7 changes: 0 additions & 7 deletions src/main/java/racingcar/Application.java

This file was deleted.

16 changes: 15 additions & 1 deletion src/main/java/racingcar/Car.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,26 @@
package racingcar;

import camp.nextstep.edu.missionutils.Randoms;

public class Car {
private static final int MOVE_RATE = 4;
private final String name;
private int position = 0;

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

// 추가 기능 구현
public void randomlyGoForward() {
if(Randoms.pickNumberInRange(0, 9) >= MOVE_RATE)
position++;
}

public String getName() {
return name;
}

public int getPosition() {
return position;
}
}
21 changes: 21 additions & 0 deletions src/main/java/racingcar/InputManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package racingcar;

import camp.nextstep.edu.missionutils.Console;

public class InputManager {
private static final String CAR_NAME_DELIMITER = ",";

public String[] getCarNames(){
String inputLine = Console.readLine();
return inputLine.split(CAR_NAME_DELIMITER);
}

public int getCount(){
String inputLine = Console.readLine();
try{
return Integer.parseInt(inputLine);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("[Error]숫자를 입력해주세요.");
}
}
}
53 changes: 53 additions & 0 deletions src/main/java/racingcar/OutputManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package racingcar;

import java.util.List;

public class OutputManager {

int maxCarNameLen = 5;

public void printCarNameInputMessage() {
System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분). 최대 5글자");
}

public void printTurnInputMessage() {
System.out.println("시도할 회수는 몇회인가요?");
}

public void printResultMessage() {
System.out.println("실행 결과");
}

public void printCarData(List<Car> cars) {
for (Car car : cars) {
System.out.println(getName(car.getName()) + " : " + getDash(car.getPosition()));
}
System.out.println();
}
private String getName(String carName){
StringBuilder carNameBuilder = new StringBuilder(carName);
while (carNameBuilder.length() < maxCarNameLen) {
carNameBuilder.append(" ");
}
return carNameBuilder.toString();

}

private String getDash(int position) {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이건 왜 PRIVATE 이죠?

StringBuilder dash = new StringBuilder();

Choose a reason for hiding this comment

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

java 8에서는 repeat 기능을 못 써서 저는 String에다 char를 하나씩 붙였는데, StringBuilder를 써서 for loop를 돌려 문자열이 반복되게 만드는 방법도 있다는 걸 알게 되어 좋습니다!

for (int i = 0; i < position; i++) {
dash.append("-");
}
return dash.toString();
}

public void printWinner(List<Car> winnerCars) {
System.out.print("최종 우승자 : ");
for(Car winner : winnerCars){
System.out.print(winner.getName());
if(winner != winnerCars.get(winnerCars.size()-1))
System.out.print(", ");
}
System.out.println();
}
Comment on lines +44 to +52
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

utf-8 인코딩은 하셨나요? 한글 잘 나오나요?

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

import static java.lang.Integer.*;

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

public class RacingGame {

private static final String CAR_NAME_DELIMITER = ",";
private InputManager inputManager;
private OutputManager outputManager;
private List<Car> cars;
private int maxTurnCount;

public static void main(String[] args) {
InputManager inputManager = new InputManager();
OutputManager outputManager = new OutputManager();
RacingGame game = new RacingGame(inputManager, outputManager);
game.start();
}

public RacingGame(InputManager inputManager, OutputManager outputManager) {
this.inputManager = inputManager;
this.outputManager = outputManager;
}

public void start() {
initGame();
race();
reward();
}

private void initGame() {
outputManager.printCarNameInputMessage();
String[] carNames = inputManager.getCarNames();
checkDuplicateName(carNames);

outputManager.printTurnInputMessage();
int turn = inputManager.getCount();
checkTurnValid(turn);


cars = new ArrayList<>();
this.maxTurnCount = turn;
for (String carName : carNames) {
String trimed = carName.trim();
if(trimed.length() > 5)
throw new IllegalArgumentException("[Error] 이름은 5글자 이하만 가능합니다.");
cars.add(new Car(trimed));
}
}

private void race() {
outputManager.printResultMessage();
for (int i = 0; i < maxTurnCount; i++) {
for (Car car : cars) {
car.randomlyGoForward();
}
outputManager.printCarData(cars);
}
}

private void reward() {
List<Car> winnerCars = getWinnerCars();
outputManager.printWinner(winnerCars);
}

private void checkDuplicateName(String[] carNamesArray) {
Set<String> carNamesSet = new HashSet<>(Arrays.asList(carNamesArray));
if (carNamesSet.size() != carNamesArray.length) {
throw new IllegalArgumentException("[Error] 중복된 이름이 있습니다.");
}
}

private void checkTurnValid(int turn) {
if (turn < 1) {
throw new IllegalArgumentException("[Error] 1 이상의 숫자를 입력해주세요.");
}
}

private List<Car> getWinnerCars() {
List<Car> winners = new ArrayList<>();
int maxPosition = 0;
for (Car car : cars) {
maxPosition = Math.max(maxPosition, car.getPosition());
}
for (Car car : cars) {
if (car.getPosition() == maxPosition) {
winners.add(car);
}
}
return winners;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package racingcar;

import camp.nextstep.edu.missionutils.test.NsTest;

import org.junit.jupiter.api.Test;

import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest;
import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.*;

class ApplicationTest extends NsTest {
class RacingGameTest extends NsTest {
private static final int MOVING_FORWARD = 4;
private static final int STOP = 3;

Expand Down Expand Up @@ -36,6 +37,6 @@ class ApplicationTest extends NsTest {

@Override
public void runMain() {
Application.main(new String[]{});
RacingGame.main(new String[] {});
}
}
9 changes: 9 additions & 0 deletions 기능목록.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
### 기능 목록
1. 사용자의 입력을 받는 입력부
1. 동일한 자동차 이름이 존재하는지 여부를 확인
2. 입력받은 자동차 이름을 분리하여 자동차 객체를 생성하는 기능
3. 입력받은 시도 횟수를 저장하는 기능
1. 숫자가 입력이 되었는지 여부를 확인
4. 자동차 객체의 움직임을 결정하는 기능
5. 자동차 객체의 움직임을 출력하는 기능
6. 우승자를 결정하는 기능