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

Racingcar-heehunjung #44

Open
wants to merge 7 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
36 changes: 15 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,20 @@
## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md)
자동차 클래스,
----
## 1. 자동차 이름 유효성

---
## 학습 효과를 높이기 위해 추천하는 미션 진행 방법
## 2. 자동차 1개 클래스

---
1. 피드백 강의 전까지 미션 진행
> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit
> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push
## 3. 자동차 클래스에 race 메소드 or Race 메소드
작과 데이터를 완전 분리 + 일급 컬렉션 List<car> -> Cars
후자로 해보자.
3-1. race 메소드 할 때 Race 클래스의 멤버 변수인 Car에 접근해야하는데,
해당 메소드가 public 이면 setter써서 하는게 좋나 ?

![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png)
## 4. 자동차 여러대 클래스

---
2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다.
## 5. 사용자 input 문자열 포장

---
3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다.

```
git branch -a // 모든 로컬 브랜치 확인
git checkout master // 기본 브랜치가 master인 경우
git checkout main // 기본 브랜치가 main인 경우

git checkout -b 브랜치이름
ex) git checkout -b apply-feedback
```
------------------
우승자들을 cars에 넣는게 맞을까?
그냥 racing 내부에서 우승자만 반환 해주는게 맞나 ?
고민..
46 changes: 46 additions & 0 deletions src/main/java/racingcarGame/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package racingcarGame;

import racingcarGame.domain.Car;
import racingcarGame.domain.Cars;
import racingcarGame.domain.Race;
import racingcarGame.views.InputView;
import racingcarGame.views.ResultView;

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

import static racingcarGame.utils.SplitNames.splitName;

public class Application {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = InputView.name(scanner);
int times = InputView.number(scanner);

UserInput userInput = new UserInput(input, times);

String[] carNames = splitName(input);
List<Car> carList = new ArrayList<>();

for (String carName : carNames) {
Car car = new Car(carName);
carList.add(car);
}

Cars cars = new Cars(carList);
Race race = new Race(cars);

ResultView.result();

for (int i = 0; i < userInput.getTimes(); i++) {
race.race();
ResultView.racingResult(cars);
System.out.println();
}

int farLocation = race.farLocation();
Cars winner = race.winner(farLocation);
ResultView.winner(winner);
}
}
18 changes: 18 additions & 0 deletions src/main/java/racingcarGame/UserInput.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package racingcarGame;

public class UserInput {
private final String inputName;
private final int times;

UserInput(String inputName,int times) {
this.inputName = inputName;
this.times = times;
}

public String getInput() {
return inputName;
}
public int getTimes() {
return times;
}
}
42 changes: 42 additions & 0 deletions src/main/java/racingcarGame/domain/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package racingcarGame.domain;

public class Car {
private final String name;
private int location;
private Position position;

public String getName() {
return name;
}

public int getLocation() {
return location;
}

Car(String name) {
if (name.length() > 5) {
throw new IllegalArgumentException();
}
this.name = name;
this.location = 0;
this.position = new Position();
}

public void move(int rand) {
if (rand >= 4 )
this.location += 1;
}


// move 전력이 바뀌는 것을 대비한 추상화
public void move(MovingStrategy movingStrategy) {
//여기만 보면 구현체 뭔지 모르는데
//애플리케이션 코드에 이 메서드 사용할 때 구현체를 넣어주지
if (movingStrategy.movable()){
this.location += 1;
position.move();

}
}

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

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

public class Cars {

private final List<Car> cars;

public List<Car> getCars() {
return cars;
}
public Cars(List<Car> carList) {
this.cars = carList;
}
public List<Integer> getLocations() {
List<Car> carList = getCars();
List<Integer> locations = new ArrayList<>();
for (Car car : carList) {
locations.add(car.getLocation());
}
return locations;
}
}
6 changes: 6 additions & 0 deletions src/main/java/racingcarGame/domain/MovingStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package racingcarGame.domain;

public interface MovingStrategy {

boolean movable();
}
22 changes: 22 additions & 0 deletions src/main/java/racingcarGame/domain/Position.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package racingcarGame.domain;

public class Position {
private int position;
public Position(int i) {
if (i < 0) {
throw new IllegalArgumentException("Position cannot be less than 0");
}
this.position = i;
}

public Position() {
this.position = 0;
}
public int getPosition() {
return this.position;
}

public void move() {
this.position += 1;
}
}
52 changes: 52 additions & 0 deletions src/main/java/racingcarGame/domain/Race.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package racingcarGame.domain;

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

import static racingcarGame.utils.GenerateNumber.generateNumber;

public class Race {

private final Cars cars;

public Race(Cars car) {
this.cars = car;
}
public void race() {
Cars cars = getCars();
for(Car car: cars.getCars()){
int rand = generateNumber();
car.move(rand);
}
}
public Cars winner(int farLocation) {
Cars cars = getCars();
List<Car> carsList = new ArrayList<>();
for(Car car: cars.getCars()){
Optional<Car> result = Optional.ofNullable(compareFarLocation(farLocation, car));
result.ifPresent(carsList::add);
}
return new Cars(carsList);
}
public int farLocation() {
int far = 0;
for(Car car: cars.getCars()){
far = compareLocation(far, car);
}
return far;
}
private static int compareLocation(int location,Car car){
return Math.max(car.getLocation(), location);
}
private static Car compareFarLocation(int farLocation,Car car){
if(car.getLocation() == farLocation){
return car;
}
return null;
}
public Cars getCars() {
return cars;
}
}

18 changes: 18 additions & 0 deletions src/main/java/racingcarGame/domain/RandomMovingImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package racingcarGame.domain;

import java.util.Random;

public class RandomMovingImpl implements MovingStrategy{
private static final int MAX_BOUND = 10;
private static final int FORWARD_NUM = 4;
@Override
public boolean movable() {
return getRandomNo() >= FORWARD_NUM;
}


private int getRandomNo() {
Random rand = new Random();
return rand.nextInt(MAX_BOUND);
}
}
10 changes: 10 additions & 0 deletions src/main/java/racingcarGame/utils/GenerateNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package racingcarGame.utils;

import java.util.Random;

public class GenerateNumber {
public static int generateNumber() {
Random rand = new Random();
return rand.nextInt(10);
}
}
7 changes: 7 additions & 0 deletions src/main/java/racingcarGame/utils/SplitNames.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package racingcarGame.utils;

public class SplitNames {
public static String[] splitName(String input) {
return input.split(",");
}
}
9 changes: 9 additions & 0 deletions src/main/java/racingcarGame/utils/Validation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package racingcarGame.utils;


// Car 객체 생성자 만들면서 필요 없어짐
public class Validation {
public static boolean carNameValidator(String carName) {
return carName.length() <= 5;
}
}
18 changes: 18 additions & 0 deletions src/main/java/racingcarGame/views/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package racingcarGame.views;

import java.util.Scanner;

public class InputView {
static String nameInput = "경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)";
static String timesInput = "시도할 회수는 몇회인가요?";

public static String name(Scanner scanner) {
System.out.println(nameInput);
return scanner.nextLine();
}

public static int number(Scanner scanner) {
System.out.println(timesInput);
return scanner.nextInt();
}
}
40 changes: 40 additions & 0 deletions src/main/java/racingcarGame/views/ResultView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package racingcarGame.views;

import racingcarGame.domain.Car;
import racingcarGame.domain.Cars;

import java.util.List;

public class ResultView {
static String resultView = "실행결과";
static String winningMention = "가 최종 우승했습니다.";

public static void result() {
System.out.println(resultView);
}

public static void racingResult(Cars cars){
for (Car car : cars.getCars()) {
System.out.print(car.getName()+" : ");
locationResult(car);
System.out.println();
}
}

private static void locationResult(Car car) {
int location = car.getLocation();
for (int i = 0 ; i < location ; i++){
System.out.print("-");
}
}

public static void winner(Cars cars) {
List<Car> carList = cars.getCars();
System.out.print(carList.get(0).getName());
int size = carList.size();
for (int i = 1; i < size; i++){
System.out.print(", "+carList.get(i).getName());
}
System.out.println(winningMention);
}
}
Loading