Skip to content
Open
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,25 @@
# java-racingcar-precourse
---

## 기능 요구 사항
### 자동차
- [ ] 자동차 이름(플레이어 이름)
- [ ] 전진
- 랜덤값 4 이상시
- [ ] 정지
### 플레이어
- [ ] 플레이어 이름
- [ ] 승리 횟수
### 우승자
- [ ] 우승자 이름

### 예외처리

- 자동차 입력
- [ ] 공백이 들어올경우
- [ ] 이름에 정규표현식?
- 횟수 입력
- [ ] 문자입력시
- [ ] 공백 입력시
- [ ] 0이나 0보다 작은수 입력
- [ ] 인트범위를 넘는 수
2 changes: 2 additions & 0 deletions src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,7 @@
public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
Game game = new Game();
game.start();
}
}
29 changes: 29 additions & 0 deletions src/main/java/racingcar/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package racingcar;
import camp.nextstep.edu.missionutils.Randoms;
//

public class Car {
private final String name;
private int position;
Car(String name){
this.name = name;
position = 0;
}
Car(String name,int position){
this.name = name;
this.position = position;
}
public void move(){
// TODO: 랜덤으로 전진 position +1
if (Randoms.pickNumberInRange(0,9)>3){
position++;
}
}
public int getPosition(){
return position;
}

public String getName(){
return name;
}
}
74 changes: 74 additions & 0 deletions src/main/java/racingcar/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package racingcar;

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

public class Game {
List<Car> cars = new ArrayList<>();

public void start() {
View view = new View();

List<String> carNames;
String input;
int count;


input = view.inputCars();
carNames = view.inputCarNames(input); //이름 리스트 생성
count = view.inputCount();
cars = addCars(carNames);
playResult(count, cars);
printWinners(winners(cars));
}

public List<Car> addCars(List<String> carNames) {
for (String carName : carNames) {
Car car = new Car(carName);
cars.add(car);
}
return cars;
}

public void playResult(int count, List<Car> cars) {
System.out.println("실행 결과");
for (int i = 0; i < count; i++) {

for (Car car : cars) {
printGame(car);
}
System.out.println();

}
}

public List<String> winners(List<Car> cars) {
int max = 0;
List<String> winners = new ArrayList<>();

for (Car car : cars) {
if (car.getPosition() > max)
max = car.getPosition();
}
for (Car car : cars) {
if (car.getPosition() == max) {
winners.add(car.getName());
}
}
return winners;
}

public void printWinners(List<String> winners) {
System.out.println("최종 우승자 : " + String.join(", ", winners));
}

private void printGame(Car car) { //start
car.move();
car.getPosition();
System.out.print(car.getName() + " : ");
for (int i = 0; i < car.getPosition(); i++) {
System.out.print("-");
}
System.out.println();
}
}
129 changes: 129 additions & 0 deletions src/main/java/racingcar/View.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package racingcar;

import camp.nextstep.edu.missionutils.Console;

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

public class View {
/*
클래스 변수, 상수

인스턴스 변수

생성자
*/
static final int MAX_NAME = 5;
List<String> carNames = new ArrayList<String>();
List<Car> cars = new ArrayList<Car>();

Game game = new Game();


public void game(){
int count;
String input;

input = inputCars();
carNames =inputCarNames(input); //이름 리스트 생성
count = inputCount();
cars = addCars(carNames);
play(count,cars);
System.out.println( game.winners(cars));
}
/*
실행 결과
wo: -
po:
메소드 구분
*/
public void play(int count,List<Car> cars){
System.out.println("실행결과");
for(int i =0; i<count ; i++){
//여기부터
for(Car car : cars) {
printGame(car);
}
System.out.println();
//여기 구분
if(i == count){
game.winners(cars);
}
}
}
private void printGame(Car car){
car.move();
car.getPosition();
System.out.print(car.getName() + " : ");
for(int i = 0; i< car.getPosition(); i++){
System.out.print("-");
}
System.out.println();


}
public int inputCount(){
System.out.println("시도할 횟수는 몇 회 인가요");
String input = Console.readLine();
return isVaildNum(input);
}

public String inputCars() {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
return Console.readLine().trim();
}

public List<String> inputCarNames(String input) {
String[] names = input.split(",");

for (int i = 0; i < names.length; i++) {
names[i] = names[i].trim();
isVaildName(names[i]);
}
return Arrays.asList(names);
}
public List<Car> addCars(List<String> carNames){
for(String carName : carNames){
Car car = new Car(carName);
cars.add(car);
}
return cars;
}
private void isVaildNameMax(String name) {
if (name.length() > MAX_NAME || name.isEmpty()) {
throw new IllegalArgumentException("이름은 1글자 이상 5글자 이하로 입력해주세요.");
}
}

private void isVaildInputEmpty(String input) {
if (input.isEmpty()) {
throw new IllegalArgumentException("입력이 비었습니다.");
}
}
public void isVaildName(String name) {
if (name.length() > MAX_NAME || name.isEmpty()) {
throw new IllegalArgumentException("이름은 1글자 이상 5글자 이하로 입력해주세요.");
}
if (!name.matches("[0-9|a-z|A-Z|ㄱ-ㅎ|ㅏ-ㅣ|가-힝]*")) {
throw new IllegalArgumentException("이름에 특수문자가 있습니다.");
}
}
public int isVaildNum(String input) {
try {
isVaildInputEmpty(input);
int count = Integer.parseInt(input);
isVaildPositive(count);
return count;
} catch (NumberFormatException e) {
throw new IllegalArgumentException("숫자가 아닙니다.");
}
}

private void isVaildPositive(int count) {
if (count < 0) {
throw new IllegalArgumentException("0보다 큰 수를 입력해야합니다.");
}
}

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


import org.junit.jupiter.api.*;

import camp.nextstep.edu.missionutils.test.Assertions;
import static org.junit.jupiter.api.Assertions.assertEquals;


public class CarTest {

@DisplayName("차 전진 랜덤 테스트")
@Test
void move() {
Car car = new Car("전진");
Assertions.assertRandomNumberInRangeTest(
() -> {
car.move();
assertEquals(1,car.getPosition());
},
4
);

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


import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;


public class GameTest {
@DisplayName("Car 객체 리스트 생성 테스트")
@Test
void addCars() {
Game game = new Game();
List<String> carNames = Arrays.asList("pobi", "woni", "crong");

List<Car> result = game.addCars(carNames);

assertEquals("pobi", result.get(0).getName());
assertEquals("woni", result.get(1).getName());
assertEquals("crong", result.get(2).getName());
}
@DisplayName("우승자 테스트")
@Test
void winnersTest(){
Game game = new Game();

List<Car> cars = new ArrayList<>();
List<String> expected = new ArrayList<>();
List<String> result = new ArrayList<>();

cars.add(new Car("win1", 4));
cars.add(new Car("win2", 4));
cars.add(new Car("lose", 2));

expected = List.of("win1", "win2");
result = game.winners(cars);

assertEquals(expected,result);

}
@DisplayName("우승자 출력 테스트")
@Test
void printWinners() {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(outputStream);
System.setOut(printStream);

Game game = new Game();

List<String> winners = new ArrayList<>();

winners = List.of("win1", "win2");

game.printWinners(winners);

assertEquals("최종 우승자 : win1, win2\n", outputStream.toString());
}
}
Loading