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(readme): 구현 기능 목록 생성 #2408

Open
wants to merge 5 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
33 changes: 33 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# 💪 프로젝트 개요

- 사용자가 자동차 게임을 할 자동차의 이름을 입력함으로써 경주에 참여시킨다.
- 사용자는 자동차 게임이 전진을 시도할 횟수를 input으로 입력한다.
- 자동차는 Random숫자를 발생시켜 기준에 통과하면 전진을 한다.
- 이 과정을 통해 최종 우승자를 가린다.
# 📝 구현 기능 목록
### 사용자가 자동차 이름을 입력받는 기능
- [x] "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)" 메세지를 출력한다.
- [x] 쉼표(,)를 기준으로 이름을 나누어 받는다.
- [x] 빈 문자열이 올 수 없다
- [x] 이름은 5자 이하이다.
### 자동차 객체를 생성하는 기능
- [x] 이름을 생성자로 받아 Car객체를 만든다.
- [x] Car 객체를 관리하는 Cars객체를 만든다.
### 전진을 시도할 횟수를 입력 받는 기능
- [x] "시도할 회수는 몇회인가요?" 메세지를 출력한다
- [x] 정수 n을 받아 시도할 횟수를 얻는다.
- [x] 정수 중에서 양수여야 한다.
- [x] 정수가 아닌 다른 문자가 오면 안된다.

### 자동차를 전진시키는 기능
- [x] 랜덤 숫자 1~9를 생성해 4이상인 경우 전진

### 자동차의 현재 상황을 출력하는 기능
- [x] 자동차의 현재 위치를 출력한다.
- [x] "이름 : 위치" 형식으로 출력하고 예시는 "pobi : --"이다.
- 위치는 '-' 문자를 통해 보인다.
### 자동차 우승자 계산 기능
- [x] 위치 문자 '-'를 통해 우승자를 찾는다.
### 자동차의 우승자를 출력하는 기능
- [x] 우승자가 한 명인 경우 "최종 우승자 : 우승자이름" 출력한다.
- [x] 우승자가 두 명 이상인 경우 : "최종 우승자 : 우승자 A, 우승자 B"로 출력한다.
5 changes: 5 additions & 0 deletions src/main/java/exception/CustomException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package exception;

public class CustomException extends IllegalArgumentException {

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

import racingcar.controller.RacingGameController;
import racingcar.view.InputView;
import racingcar.view.OutputView;

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

import racingcar.model.Car;
import racingcar.model.Cars;
import racingcar.view.InputView;
import racingcar.view.OutputView;

public class RacingGameController {
private final InputView inputView;
private final OutputView outputView;
public RacingGameController(InputView inputView, OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}
public void run(){
Cars cars = inputView.getCars();
moveCars(cars);
outputView.printWinner(cars.getWinner());

}


public void moveCars(Cars cars){
int num = inputView.getNumberOfMoves();
for(int i=0; i<num; i++){
cars.moveCars();
outputView.printCarPosition(cars.getCars());
}
}
}
31 changes: 31 additions & 0 deletions src/main/java/racingcar/model/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package racingcar.model;

public class Car {
private String name;
private int position;
Car(String msg){
this.name = msg;
position = 0;
}

public String getName(){
return this.name;
}

public void movePosition(){
position++;
}

public int getPositionInt(){
return position;
}
public String getPosition() {
StringBuilder positionStr = new StringBuilder(); // StringBuilder로 변경
for(int i = 0; i < position; i++) {
positionStr.append("-"); // append 메서드 사용
}
return positionStr.toString(); // 문자열로 변환하여 반환
}


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

import camp.nextstep.edu.missionutils.Randoms;

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

public class Cars {
private final List<Car> cars;


public Cars(String msg){
this.cars = new ArrayList<>();
makeCars(splitMsg(msg));
}




public List<String> splitMsg(String msg){
return Arrays.asList(msg.split(","));
}

public void makeCars(List<String> msgs){
for(String msg : msgs){
Car car = new Car(msg.trim());
cars.add(car);
}
}

public void moveCars(){
for(Car car : cars){
if(Randoms.pickNumberInRange(0,9) >=4){
car.movePosition();
}
}
}

public List<Car> getCars(){
return cars;
}

public List<Car> getWinner(){
int max = 0;
for(Car car: cars){
if(car.getPositionInt() > max){
max = car.getPositionInt();
}
}
List<Car> winnerCars = new ArrayList<>();
for(Car car: cars){
if(car.getPositionInt() ==max){
winnerCars.add(car);
}
}
return winnerCars;
}
}
78 changes: 78 additions & 0 deletions src/main/java/racingcar/util/InputUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package racingcar.util;

import racingcar.model.Car;

import java.util.Arrays;
import java.util.List;

public class InputUtil {
/*
1. 이름이 들어왔을 때
1-1 빈 문자열로 들어온 경우
1-2 이름들이 5글자 이하인지
1-3 , , , 이렇게 들어온 경우 혹은 도형, 선목, , 유진 이런식으로 들어오는 경우

2. 자동차 움직이는 횟수 들어올 때
2-1 정수가 아닌 경우
2-2 음수, 0인 경우
*/


public static String validateName(String msg){
check_blank(msg);

List<String> cars = splitMsg(msg);
moreThanFive(cars);
blankName(cars);
return msg;
}

public static int validateNumberOfMoves(String msg){
checkInteger(msg);
positiveInteger(msg);
return Integer.parseInt(msg);
}

public static void check_blank(String cars){
if(cars.isBlank()){
throw new IllegalArgumentException();
}
}


public static void moreThanFive(List<String> cars){
for(String car : cars ){
if(car.trim().length() > 5){
throw new IllegalArgumentException();
}
}
}

public static void blankName(List<String> cars){
for(String car : cars){
if(car.trim().isBlank()){
throw new IllegalArgumentException();
}
}
}


public static void checkInteger(String msg){
try{
Integer.parseInt(msg);
}
catch(NumberFormatException e){
throw new IllegalArgumentException();
}
}

public static void positiveInteger(String msg){
if(Integer.parseInt(msg) <= 0){
throw new IllegalArgumentException();
}
}

public static List<String> splitMsg(String msg){
return Arrays.asList(msg.split(","));
}
}
30 changes: 30 additions & 0 deletions src/main/java/racingcar/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package racingcar.view;


import racingcar.model.Cars;
import racingcar.util.InputUtil;
import racingcar.view.console.ConsoleReader;
import racingcar.view.console.ConsoleWriter;

import java.util.List;

/*
역할은 우리가 보는 InputView를 담당하고 있다.
그럼 이걸 메세지에 보여주는 함수가 필요한데 어떻게 보여주지?
*/
public class InputView {
private static final String GET_CAR_NAMES_STRING= "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)";
private static final String GET_NUMBER_OF_MOVE = "시도할 회수는 몇회인가요?";
ConsoleWriter consoleWriter = new ConsoleWriter();
ConsoleReader consoleReader = new ConsoleReader();

public Cars getCars(){
consoleWriter.printMessage(GET_CAR_NAMES_STRING);
return new Cars(InputUtil.validateName(consoleReader.getLine()));
}

public int getNumberOfMoves(){
consoleWriter.printMessage(GET_NUMBER_OF_MOVE);
return InputUtil.validateNumberOfMoves(consoleReader.getLine());
}
}
29 changes: 29 additions & 0 deletions src/main/java/racingcar/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package racingcar.view;

import racingcar.model.Car;
import racingcar.model.Cars;
import racingcar.view.console.ConsoleWriter;

import java.util.List;

public class OutputView {
ConsoleWriter consoleWriter = new ConsoleWriter();


public void printCarPosition(List<Car> cars){
for(Car car : cars) {
consoleWriter.printMessage(car.getName() + " : " + car.getPosition());
consoleWriter.printMessage("");

}
}

public void printWinner(List<Car> cars){
StringBuilder winner = new StringBuilder();
for(Car car : cars){
winner.append(car.getName()).append(", ");
}
winner.setLength(winner.length() - 2);
consoleWriter.printMessage("최종 우승자 : " + winner.toString());
}
}
13 changes: 13 additions & 0 deletions src/main/java/racingcar/view/console/ConsoleReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package racingcar.view.console;

import camp.nextstep.edu.missionutils.Console;

import java.util.List;
import java.util.Scanner;

public class ConsoleReader {
public String getLine(){
return Console.readLine();
}

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

public class ConsoleWriter {


public void printMessage(String message){
System.out.println(message);
}
}