Skip to content
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
10 changes: 10 additions & 0 deletions src/main/java/Controller/GameManagerController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package Controller;
//Controller는 Model과 View에 의존 가능
public class GameManagerController {
/*public void play(){
InputView.inputCarNames();

Result result = car.move();
OutputView.printResult(result);
}*/
}
38 changes: 38 additions & 0 deletions src/main/java/Domain/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package Domain;
//Domain(Model)은 Controller와 View에 의존X
// ->Model 내부에 Controller와 View에 관련된 코드가 있으면 안됨.
public class Car { //자동차의 정보 저장

private static final int STATIC_NUM = 4; //전진 조건 숫자(3이하의 값->멈춤, 4이상의 값->전진)

private final Name name; //이름을 저장할 변수 선언
private final Position position; //위치를 저장할 변수 선언

private Car(final String name, final int position){ //자동차의 정보 저장(이름,위치)
this.name = new Name(name);
this.position = new Position(position);
}

public static Car InitialInform(final String name){
return new Car(name,0);
}

public static Car EditInform(final String name, final int position){
return new Car(name,position);
}

public void move(final int number){ //4이상인 경우 전진
if(number >= STATIC_NUM){
position.increase();
}
}

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

public int getPosition(){
return position.getPosition();
}

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

import utils.NumberGenerator;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class Cars { //자동차들의 정보 저장
private static final int DEFAULT_POSITION = 0; //초기 위치=0

private final List<Car> cars; //자동차들의 정보를 저장할 리스트 선언

public Cars(final List<Car> cars){
this.cars = Collections.unmodifiableList(cars);
}

public static Cars InitialInform(final List<String> carNames){ //carNames의 각 요소를 Car객체로 변환하여 리스트에 저장
List<Car> cars = carNames.stream()
.map(Car::InitialInform)
.collect(Collectors.toList());
return new Cars(cars);
}

public void moveAll(final NumberGenerator numberGenerator){
for(Car car : cars){
int number = numberGenerator.generate();
car.move(number);
}
}

public Cars findWinners(){
int maxPosition = getMaxPosition();
List<Car> winningCars = cars.stream()
.filter(car -> car.getPosition() == maxPosition)
.collect(Collectors.toList());
return new Cars(winningCars);
}

private int getMaxPosition(){
return cars.stream()
.mapToInt(Car::getPosition)
.max()
.orElse(DEFAULT_POSITION);
}

public List<Car> getCars(){
return cars;
}
}
24 changes: 24 additions & 0 deletions src/main/java/Domain/Name.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package Domain;

public class Name { //자동차의 이름 저장
private final String name;

public Name(final String name){
validate(name);
this.name = name; //조건에 부합하는 이름을 입력 받았다면 변수에 저장
}

private void validate(final String name){ //이름이 조건에 어긋나는지 판별
if (name == null || name.isEmpty()) { //이름에 null값이 들어가면 오류 출력
throw new IllegalArgumentException("[ERROR]");
}
if(name.length() > 5){ //이름은 5자 이하만 가능
throw new IllegalArgumentException("[ERROR]이름은 5글자까지 가능합니다.");
}
}

public String getName(){
return name;
}

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

public class Position { //자동차의 위치 저장
private int position;

public Position(final int position){
this.position = position;
}

public void increase(){ //자동차를 전진시키는 메서드
position++;
}
public int getPosition(){
return position;
}
}
9 changes: 6 additions & 3 deletions src/main/java/RacingMain.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
public class RacingMain {
import View.InputView;

public class RacingMain {
public static void main(String[] args) {
// TODO: MVC 패턴을 기반으로 자동차 경주 미션 구현해보기
System.out.println("Hello, World!");

final var carNames = InputView.CarNames();
final var tryCount = InputView.AttemptNum();

}
}
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 utils.StringParser;

import java.io.IOException;
import java.util.List;
import java.util.Scanner;

public class InputView { //사용자에게 입력 받는 객체

private static final String READ_CAR_NAME = "경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분.)";
private static final String READ_ATTEMP_NUM = "시도할 회수는 몇회인가요?";
private static final Scanner scanner = new Scanner(System.in);

public static List<String> CarNames() throws IOException{
System.out.println(READ_CAR_NAME);
String name = scanner.nextLine(); //문자열 입력 받고
return StringParser.splitByComma(name); //콤마 단위로 나누어 저장
}
public static int AttemptNum() throws IOException{
try{
System.out.println(READ_ATTEMP_NUM);
int input;
input = Integer.parseInt(scanner.next()); //시도 횟수 입력 받아 정수로 저장
return input;
}
catch(Exception e){
System.out.println("정수로 다시 입력해주세요");
return AttemptNum();
}
}

}
17 changes: 17 additions & 0 deletions src/main/java/View/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package View;
//View는 Model에만 의존
public class OutputView {
private static final String LINE_SEPARATOR = System.lineSeparator();
private static final String RESULT_MESSAGE = "실행 결과";
private static final String STATUS_PRINT_FORMAT = "%s : %s" + LINE_SEPARATOR;
private static final String WINNER_PRINT_FORMAT = "%s가 최종 우승했습니다." + LINE_SEPARATOR;
private static final String WORD_DELIMITER = ", ";
private static final String POSITION_SYMBOL = "-";

public static void printResult() {
System.out.println(RESULT_MESSAGE);
}



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

public interface NumberGenerator {
int generate();
}
7 changes: 7 additions & 0 deletions src/main/java/utils/RandomNumberGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package utils;

public class RandomNumberGenerator implements NumberGenerator{
public int generate(){
return (int) (Math.random() * 10);
}
}
9 changes: 9 additions & 0 deletions src/main/java/utils/StringParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package utils;

import java.util.*;
public class StringParser {
public static List<String> splitByComma(final String input){ //문자열을 ','기준으로 분리하여 저장하는 메서드
String[] split = input.split(",");
return Arrays.asList(split);
}
}