Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
e1ec75b
docs(readme) : README.md에 기능 목록 작성
Shsin9797 Jun 8, 2024
10ed28b
style(readme) : README.md에 기능 목록 [ ] 수정
Shsin9797 Jun 8, 2024
ba6ac38
feat(Car) : Car class 에서 자동차 객체의 이름 변수 및 getter, setter 구현
Shsin9797 Jun 8, 2024
841d9f4
feat(Car) : Car class 에서 자동차 객체의 현재 위치를 저장하는 int state 변수 선언 및 getter…
Shsin9797 Jun 8, 2024
42a2dc4
style(Car) : Car class 의 엔터키 처리
Shsin9797 Jun 8, 2024
724de0d
docs(Readme) : Readme 수정
Shsin9797 Jun 8, 2024
f845f79
feat(Game) : 자동차 이름을 사용자로부터 입력받는 메서드 구현
Shsin9797 Jun 8, 2024
e1c2dd1
docs(Readme) : Readme 수정
Shsin9797 Jun 8, 2024
adb3131
feat(Game) : 사용자로부터 시도 회수 입력받고 이상치 체크하는 기능 구현
Shsin9797 Jun 8, 2024
b84a61a
feat(CheckInput) : 자동차 이름을 모아둔 리스트의 값이 유효한 값인지 확인하는 기능 구현 (자동차 이름은 5…
Shsin9797 Jun 8, 2024
d102e19
feat(CheckInput) : 사용자가 잘못된 값을 입력했을 때 에러를 발생하고, 에러 메세지를 출력하는 기능 구현
Shsin9797 Jun 8, 2024
57891c6
fix(CheckInput) : 자동차 이름 길이 범위 수정
Shsin9797 Jun 8, 2024
fdc4063
refactor(CheckInput) : 자동차들 이름의 유효성을 검사하는 함수명 수정
Shsin9797 Jun 8, 2024
9b8d07c
refactor(Game) : 자동차들 이름을 가져오는 함수 명을 복수형으로 변경
Shsin9797 Jun 8, 2024
c2827b3
fix(Car) : 자동차 객체 생성자 추가
Shsin9797 Jun 8, 2024
521ac23
feat(Game) : 자동차 이름 리스트를 바탕으로 자동차 객체들을 생성하여 반환하는 기능 구현
Shsin9797 Jun 8, 2024
4931f83
feat(Car) : 자동차 객체의 현재 상황을 화면에 출력하는 메서드 구현
Shsin9797 Jun 8, 2024
bf2dbfa
feat(Game) : 자동차경주의 승리차들을 찾는 기능 구현
Shsin9797 Jun 8, 2024
53f0f25
feat(Game) : 자동차경주의 승리차들을 출력하는 기능 구현
Shsin9797 Jun 8, 2024
feb69a7
feat(Application) : 자동차경주 게임 진행 기능 구현
Shsin9797 Jun 8, 2024
b68779c
docs(Readme) : Readme.md 수정
Shsin9797 Jun 8, 2024
bc82d11
docs(Readme) : Readme.md 수정
Shsin9797 Jun 9, 2024
4ed6468
fix(CheckInput) : String 값을 받아서 int 인지 확인하는 구문 주석처리
Shsin9797 Jun 9, 2024
ba79931
fix(Game) : Scanner 부분 오류 수정 -> close 하지 않고, 클래스 멤버변수로 선언, 생성자 초기화 하는 방식
Shsin9797 Jun 9, 2024
73b26ff
fix(CheckInput) : 에러처리 수정 -> 에러처리가 되었을때 프로그램이 멈추지 않고 ERROR 메시지가 출력되고 …
Shsin9797 Jun 9, 2024
7a3cafe
fix(Game) : 사용자로부터 입력값을 받을떄 에러처리 기능 수정
Shsin9797 Jun 9, 2024
9ad5a3a
feat(CheckInput) : 자동차 입력값이 없을때 예외처리 추가
Shsin9797 Jun 9, 2024
7226059
feat(Game) : 입력 받은 자동차 개수 체크하는 기능 추가
Shsin9797 Jun 9, 2024
a8ca64f
feat(Car) : 테스트코드 작성 실패
Shsin9797 Jun 9, 2024
a2d558f
테스트케이스 작성 참고용 파일
Shsin9797 Jun 9, 2024
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
80 changes: 79 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,79 @@
# java-racingcar-precourse
# java-racingcar-precourse

# 객체별 기능 목록

## 자동차 객체 Car class
- [x] String name 자동차 이름 저장하는 변수
- [x] int state 현재까지 얼만큼 움직였는지 저장하는 변수
- [x] move() 움직일지 말지 결정하고 반영하는 메서드
* 0~9사이 무작위 값 구한후, 무작위 값이 4 이상일 경우 1칸 움직임
* 실행 결과를 자동차 객체 상태 state 변수에 반영
- [x] 자동차 객체의 이동 현황 출력

## 게임 진행 프로그램 Game class
- [x] getCarName() 자동차 이름 입력받기 기능
- [x] 경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
[x] 이상치 체크 후 이상한 값인 경우 입력을 다시 받도록함

[x] getTryNum() 시도 회수 입력받기 기능
[x] 시도할 회수는 몇회인가요?
[x] 이상치 체크 후 이상한 값인 경우 입력을 다시 받도록함

[x] 자동차 객체를 생성 하는 기능

[x] findWinner() 경주 종료 후, 최종 우승자를 판별하는 기능 (여러명 일 수 있음)
[x] printWinner() 최종 우승자를 출력하는 기능
[x] 최종 우승자 :


## 이상치 판별 클래스 CheckInput class
[x] checkCarName(List<String> carNames)자동차 이름 이상 판별
자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.

[x] isWrongValue() 잘못된 값 입력시 에러발생 및 출력
[x] IllegalArgumentException 를 발생시키고,
[x] "[ERROR]"로 시작하는 에러 메시지를 출력

## 게임 진행 클래스 Application class
[x] 사용자로부터 자동차 이름 입력받기
[x] 자동차 객체 생성하기
[x] 사용자로부터 게임 회수 입력받기

[x] 회수만큼 게임 진행
[x] 자동차 객체별로 이동거리 관리
[x] 실행결과 출력
[x] 최종 우승자 계산
[x] 최종 우승자 출력

## 참고
[ ] 메서드 명은 동사로 시작
[ ] 메서드명 , 클래스 명이 모호하지 않도록 하기


## 실행결과 예시
경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
시도할 회수는 몇회인가요?
5
실행 결과
pobi :
woni :
jun :

pobi : -
woni :
jun : -

pobi : --
woni : -
jun : --

pobi : ---
woni : --
jun : ---

pobi : ----
woni : ---
jun : ----

최종 우승자 : pobi, jun
23 changes: 23 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import java.util.List;

public class Application {
public static void main(String[] args) {
Game g = new Game();
List<String> carNames = g.getCarNames();
List<Car> cars = g.makeCars(carNames);

int tryNum= g.getTryNum();
System.out.println("실행 결과");
for (int i=0; i<tryNum ; i++) {
for(Car car: cars) {
car.move();
car.printState();
}
System.out.println();
}

List<Car> winners= g.findWinners(cars);
g.printWinners(winners);

}
}
42 changes: 42 additions & 0 deletions src/main/java/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import java.util.Random;

public class Car {
private String name;
private int state;

public Car(String carName) {
this.name= carName;
this.state = 0;
}

public void move() {

Random r = new Random();
int randNum= r.nextInt(0,9);

if (randNum >= 4) {
setState(getState() + 1);
}
}

public void printState() {
System.out.printf("%s : ",this.getName());
for (int i=0; i<state; i++) {
System.out.print("-");
}
System.out.println();
}

public String getName() {
return name;
}
public void setName(String name) {
this.name= name;
}
public int getState() {
return state;
}
public void setState(int newState) {
this.state = newState;
}
}
39 changes: 39 additions & 0 deletions src/main/java/CheckInput.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import java.util.HashSet;
import java.util.IllegalFormatException;
import java.util.List;

public class CheckInput {

public static void checkCarCount(List<String> carNames) {
if (carNames.size() < 2) {
throw new IllegalArgumentException("[ERROR] 자동차를 2대 이상 적어야 경주가 시작됩니다.");
}
}

public static void checkCarNames(List<String> carNames) {
checkCarNameDiffer(carNames);
for (String carName : carNames) {
int carLength = carName.length();
checkCarNameLength(carName);
}
}

public static void checkCarNameDiffer(List<String> carNames) {
HashSet<String> setNames = new HashSet<>(carNames);
if (setNames.size() != carNames.size()) {
throw new IllegalStateException("[ERROR] 자동차의 이름은 모두 다르게 입력해주세요.");
}
}

public static void checkCarNameLength(String name) {
if ((name.isEmpty()) || (name.length() > 5)) {
throw new IllegalArgumentException("[ERROR] 차 이름의 길이는 1글자~5글자 사이로 입력해주세요.");
}
}

public static void isWrongIntValue(int tryNum) {
if (tryNum < 1) {
throw new IllegalArgumentException("[ERROR] 잘못된 값을 입력했습니다. 1이상의 정수를 다시 입력하세요.");
}
}
}
81 changes: 81 additions & 0 deletions src/main/java/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import java.util.*;

public class Game {
Scanner sc;

public Game(){
sc = new Scanner(System.in);
}
public List<String> getCarNames() {
List<String> carNames;


while (true) {
try {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
carNames = List.of(sc.next().split(","));
CheckInput.checkCarCount(carNames);
CheckInput.checkCarNames(carNames);
return carNames;
} catch (IllegalArgumentException | IllegalStateException e) {
System.out.println(e.getMessage());
}
}
}

public int getTryNum() {
int tryNum;
System.out.println("시도할 회수는 몇회인가요?");
while (true) {
try {
tryNum = sc.nextInt();
CheckInput.isWrongIntValue(tryNum);
break;
} catch (InputMismatchException e){
System.out.println("[ERROR] 잘못된 값을 입력했습니다. 1 이상의 정수를 다시 입력하세요.");
sc.next();
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
return tryNum;
}

public List<Car> makeCars(List<String> carNames) {
List<Car> Cars = new ArrayList<>();
for (String carName : carNames) {
Cars.add(new Car(carName));
}
return Cars;
}

public List<Car> findWinners(List<Car> cars) {

int winnerState= cars.get(0).getState();

for (Car car : cars) {
int carState = car.getState();
if (carState > winnerState) {
winnerState = carState;
}
}

List<Car> winnerList= new ArrayList<>();

for (Car car : cars) {
int carState = car.getState();
if (carState == winnerState) {
winnerList.add(car);
}
}
return winnerList;
}

public void printWinners(List<Car> cars) {
System.out.print("최종 우승자 : ");
for (int i = 0; i < (cars.size() - 1); i++) {
System.out.print(cars.get(i).getName() + ", ");
}
System.out.println(cars.get(cars.size() - 1).getName());
}
}
20 changes: 20 additions & 0 deletions src/test/java/CarTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

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

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;


public class CarTest {
@Test
public void carNameShouldNotExceedFiveCharacters() {
assertThatThrownBy(() -> new Car("sixletters"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("[ERROR] 자동차 이름은 5자를 초과할 수 없습니다.");
}

@Test

}
}
54 changes: 54 additions & 0 deletions src/test/java/CarTest2.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@

/*참고용 파일*/

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import org.junit.jupiter.api.Test;

public class CarTest2 {

@Test
void 자동차_이름이_유효한_경우() {
Car car = new Car("민성");
assertThat(car.getName()).isEqualTo("민성");
}

@Test
void 자동차_이름이_null인_경우_예외처리() {
assertThatThrownBy(() -> new Car(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("[ERROR]");
}

@Test
void 자동차_이름이_5자를_초과하는_경우_예외처리() {
assertThatThrownBy(() -> new Car("pobi123"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("[ERROR]");
}

@Test
void 자동차_이름이_1자_미만인_경우_예외처리() {
assertThatThrownBy(() -> new Car(""))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("[ERROR]");
}

/*@Test
void 자동차가_전진하는_경우() {
Car car = new Car("민성");
car.run(4);
assertThat(car.getDistance()).isEqualTo(1);
}

@Test
void 자동차가_멈추는_경우() {
Car car = new Car("민성");
car.run(3);
assertThat(car.getDistance()).isEqualTo(0);
}
*/

}

30 changes: 30 additions & 0 deletions src/test/java/CarsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

public class CarsTest {
Car car;
CheckInput checkInput;
Game game;

@BeforeEach
void setUp() {
checkInput=new CheckInput();
game= new Game();
}

@ParameterizedTest
@ValueSource(strings = "aaa,bbb,abdcdddd")
@DisplayName("입력받은 자동차 이름 길이 유효성 검사,길이가 5이상 일 경우(예외 발생)")
void checkInputCarNameLengthValidException(final String name) {
assertThatThrownBy(() -> game.getCarNames())
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("[ERROR] 차 이름의 길이는 1글자~5글자 사이로 입력해주세요.");
}
}
Loading