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

docs: Racing Car Game 구현 기능 목록 #2386

Open
wants to merge 12 commits into
base: main
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
28 changes: 28 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 🚗Racing Car Game 구현 기능 목록 #

### 사용자가 경주할 자동차 이름 입력 ###
- 자동차 이름을 ","으로 구분하여 입력한다</br>
- 글자 수가 5자 이하여야한다. 아닐 시 예외처리</br>
### 사용자가 시도할 횟수를 입력 ###

### 전진 할지 멈춤 할지 구현 ###
- 0-9의 무작위 값을 구한다.</br>
- 그 값이 4이상이라면 전진</br>
- 아니라면 멈춤한다.</br>
### 1회 끝날 때마다 실행 결과를 보여줌(차 이름과 함께) ###
- 각 자동차 마다 "-" 갯수를 출력함 </br>
### 우승자(공동가능)을 출력함 ###
- 공동 우승일 경우 "," 으로 구분하여 출력해준다</br>
- 누가 가장많은 전진을 했는지 확인</br>
## TEST CODE 구현 ##
- 정상적으로 차 이름을 작성할 경우
- 차이름이 5자 초과인 경우 Test
- 차이름이 공백인 경우 Test
- 시도 횟수 정상적인 값을 입력할 경우
- 시도 횟수 정수 값이 입력되었는지 Test
- 시도 횟수 1 이상의 값이 입력되었는지 Test





7 changes: 5 additions & 2 deletions src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package racingcar;

import racingcar.Controller.RacingCarController;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
public static void main(String[] args) throws IllegalAccessException {
RacingCarController racingCarController = new RacingCarController();
racingCarController.run();
}
}
36 changes: 36 additions & 0 deletions src/main/java/racingcar/Controller/RacingCarController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package racingcar.Controller;

import racingcar.Model.Car;
import racingcar.Service.JudgeWinnerResult;
import racingcar.Service.UserInputTryNumber;
import racingcar.Util.RandomAdvanceOrStop;
import racingcar.Service.UserInputCarName;
import racingcar.View.OutputView;

public class RacingCarController {
Car cars = new Car();
UserInputCarName userInputCarName = new UserInputCarName();
UserInputTryNumber userInputTryNumber = new UserInputTryNumber();
OutputView outputView = new OutputView();
JudgeWinnerResult judgeWinnerResult = new JudgeWinnerResult();
RandomAdvanceOrStop randomAdvanceOrstop = new RandomAdvanceOrStop();

public void run() throws IllegalAccessException {
startCar(); //입력
executionResult(); //실행결과
winnerResult(); //최종 우승자 결과
}

private void startCar() throws IllegalAccessException {
userInputCarName.userInputCarName();
userInputTryNumber.userInputTryNumber();
}
private void executionResult() throws IllegalAccessException { //실행결과
randomAdvanceOrstop.judgeAdvanceOrStop();
}

public void winnerResult() throws IllegalAccessException { //최종 우승자 결과
outputView.printWinnerResult();
judgeWinnerResult.judgeWinner();
}
}
7 changes: 7 additions & 0 deletions src/main/java/racingcar/Infomation/ErrorInfomation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package racingcar.Infomation;

public class ErrorInfomation {
public static final String CAR_NAME_LIMIT_ERROR_MESSAGE = "자동차 이름은 5글자를 넘길 수 없습니다.";
public static final String CAR_NAME_DUPLICATED_ERROR_MESSAGE = "중복된 자동차 이름이 존재합니다.";
public static final String TRY_NUMBER_COUNT_ERROR_MESSAGE = "시도 횟수는 1부터 9까지입니다.";
}
9 changes: 9 additions & 0 deletions src/main/java/racingcar/Infomation/NumberConstant.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package racingcar.Infomation;

public class NumberConstant { //매직넘버 모아둠
public final static int MIN_RANDOM_NUMBER = 0;
public final static int MAX_RANDOM_NUMBER = 9;
public final static int CAR_ADVANCE_NUMBER = 4;
public final static int MAX_CAR_NAME_SIZE = 5;

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

public class PrintInputMessage {
public static void printInputCarName(){
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분");
}

public static void printTryNumber(){
System.out.println("시도할 회수는 몇회인가요?");
}
}
37 changes: 37 additions & 0 deletions src/main/java/racingcar/Model/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package racingcar.Model;

public class Car {
public int getTryNumber() {
return tryNumber;
}

public void setTryNumber(int tryNumber) {
this.tryNumber = tryNumber;
}

public int tryNumber;

public String getCarName() {
return carName;
}

public void setCarName(String carName) {
this.carName = carName;
}

public String carName; //carSize 크기의 문자열을 담을 수 있는 배열 선언 및 생성



public String[] getCarList() {
return carList;
}

public void setCarList(String[] carList) {
this.carList = carList;
}

public String[] carList; //사용자가 입력한 차 이름 리스트


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

import racingcar.Model.Car;

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

public class JudgeWinnerResult {
Car cars = new Car();

public String judgeWinner(){
List<String> winnerList = new ArrayList<String>();

String[] WinnerList = new String[5];
return String.join(", ",winnerList);
}

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

import racingcar.Model.Car;

import static camp.nextstep.edu.missionutils.Console.readLine;
import static racingcar.Infomation.ErrorInfomation.CAR_NAME_LIMIT_ERROR_MESSAGE;
import static racingcar.Infomation.NumberConstant.*;
import static racingcar.Infomation.PrintInputMessage.printInputCarName;

public class UserInputCarName { //사용자가 경주할 자동차 이름 입력

Car car = new Car();

public void userInputCarName() throws IllegalAccessException {
try {
printInputCarName(); //"경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분"
car.setCarName(readLine());
car.carList = car.getCarName().split(","); //","으로 구분하여 입력

if (!judgeCarNameLength()){
throw new IllegalArgumentException(CAR_NAME_LIMIT_ERROR_MESSAGE); //"자동차 이름은 5글자를 넘길 수 없습니다."
}

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

private boolean judgeCarNameLength() {
for (int i = 0; i < (car.carList).length; i++) {
if ((car.carList[i]).length() > MAX_CAR_NAME_SIZE) { //MAX_CAR_NAME_SIZE = 5;
return false;
}
}
return true;
}
/*
private boolean judgeCarNameLength() {
return List.of(car.carList).stream().allMatch(name -> name.length() <= MAX_CAR_NAME_SIZE);
}
위의 메소드를 이렇게 간결하게도 사용할 수 있음.
*/
}
28 changes: 28 additions & 0 deletions src/main/java/racingcar/Service/UserInputTryNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package racingcar.Service;

import racingcar.Model.Car;

import static camp.nextstep.edu.missionutils.Console.readLine;
import static racingcar.Infomation.ErrorInfomation.TRY_NUMBER_COUNT_ERROR_MESSAGE;
import static racingcar.Infomation.PrintInputMessage.printTryNumber;

public class UserInputTryNumber { //사용자가 시도할 횟수를 입력
Car car = new Car();
public void userInputTryNumber() throws IllegalAccessException {
try {
printTryNumber(); //"시도할 횟수는 몇 회인가요?"
car.tryNumber = Integer.parseInt(readLine());

if (!judgeTryNumberLength()){
throw new IllegalArgumentException(TRY_NUMBER_COUNT_ERROR_MESSAGE);
}
} catch (IllegalArgumentException e) {
System.out.println(car.tryNumber);
}
}

private boolean judgeTryNumberLength() {
return car.tryNumber >= 1 && car.tryNumber <= 9;
}

}
42 changes: 42 additions & 0 deletions src/main/java/racingcar/Util/RandomAdvanceOrStop.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package racingcar.Util;
import camp.nextstep.edu.missionutils.Randoms;
import racingcar.Model.Car;
import racingcar.Service.UserInputCarName;
import static racingcar.Infomation.NumberConstant.*;

public class RandomAdvanceOrStop {

public static final String HYPHEN = "-";
UserInputCarName userInput = new UserInputCarName();
Car car;

public void judgeAdvanceOrStop() { //직진인지 멈춤인지 판단
for (int i = 0; i < car.getTryNumber(); i++) {
if (judgeadvanceOrStopNumber() >= CAR_ADVANCE_NUMBER){
Move();
}
printCarList();
/*
pobi :
hol :
mol :
*/
}
}

private int judgeadvanceOrStopNumber() { //1부터 9까지 랜덤한 수 구하기
return Randoms.pickNumberInRange(MIN_RANDOM_NUMBER, MAX_RANDOM_NUMBER);
}

private void Move() {
for (int i = 0; i < car.carList.length; i++) {
car.carList[i] = car.carList[i].concat(HYPHEN);
}
}

private void printCarList() {
for (int i = 0; i < car.getCarList().length; i++) {
System.out.println(car.carList[i] + ":");
}
}
}
8 changes: 8 additions & 0 deletions src/main/java/racingcar/View/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package racingcar.View;



public class InputView {


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

import racingcar.Model.Car;
import racingcar.Service.UserInputCarName;
import racingcar.Service.UserInputTryNumber;

public class OutputView { //최종 결과 출력

UserInputTryNumber userInputTryNumber = new UserInputTryNumber();
public void printWinnerResult() throws IllegalAccessException {
for (int i = 0; i < car.tryNumber; i++) {

}
System.out.println();
}


public static void printCarPosition(int carPosition) {
for (int i = 0; i < carPosition; i++) {
System.out.print("-");
}
}




}
6 changes: 5 additions & 1 deletion src/test/java/racingcar/ApplicationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ class ApplicationTest extends NsTest {

@Override
public void runMain() {
Application.main(new String[]{});
try {
Application.main(new String[]{});
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
20 changes: 20 additions & 0 deletions src/test/java/racingcar/Service/UserInputTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package racingcar.Service;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;

class UserInputTest {
@DisplayName("사용자가 입력")
@Test
void 자동차_이름에_대한_예외_출력테스트() {
//when
UserInputCarName userInput = new UserInputCarName();
assertThatThrownBy(() -> {
userInput.userInputCarName();
})
.isInstanceOf(IllegalArgumentException.class);
}


}
17 changes: 17 additions & 0 deletions src/test/java/racingcar/Util/RandomAdvanceOrstopTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package racingcar.Util;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import racingcar.Model.Car;

class RandomAdvanceOrstopTest {
@DisplayName("랜덤숫자가 4이상일 때만 전진, 아니면 멈춤")
@Test
public void advanceOrStop() {
Car car = new Car();

assertFalse(car.);

}

}