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
38c2f2e
Create docs
LTSGOD Jan 14, 2023
70f84b7
Delete docs
LTSGOD Jan 14, 2023
c60909f
docs addfolder
LTSGOD Jan 14, 2023
24f3f1d
<docs> InputClass Implementation
LTSGOD Jan 14, 2023
3fdb8df
Delete README.md.txt
LTSGOD Jan 14, 2023
8c2a96e
Create README.md
LTSGOD Jan 14, 2023
af5b0ff
docs: modify plan feat: add Car class
LTSGOD Jan 14, 2023
613ead9
feat(Input): generate getCarNum
LTSGOD Jan 14, 2023
4d9bde8
feat(Car): generate getPosition
LTSGOD Jan 14, 2023
804ae27
feat(Game): generate setCars, Play()
LTSGOD Jan 14, 2023
c1f1839
Update README.md
LTSGOD Jan 14, 2023
bad6fcc
refactor(Input): change Data type
LTSGOD Jan 14, 2023
d3e40f5
Merge branch 'main' of https://github.com/LTSGOD/java-racingcar-preco…
LTSGOD Jan 14, 2023
3800a8c
refactor(Game): change data type
LTSGOD Jan 14, 2023
b850367
feat(Car): generate reset code in getPosition
LTSGOD Jan 14, 2023
56e3bc7
refactor(Car): remove position 0 Code
LTSGOD Jan 15, 2023
39d4dc2
feat(Game): add Scoreboard
LTSGOD Jan 15, 2023
179c335
refact(Game): delete ScoreBoard
LTSGOD Jan 15, 2023
98d5373
feat(Car): add winNum property
LTSGOD Jan 15, 2023
5c3b857
feat(Output): add printRound method
LTSGOD Jan 15, 2023
714b052
style(Car): add //
LTSGOD Jan 15, 2023
f35af3f
style(Output): modify output form
LTSGOD Jan 15, 2023
5683adc
style(Input): modify "Error" to "ERROR"
LTSGOD Jan 15, 2023
d40b8e4
feat(Game): add selecting winner method "final()"
LTSGOD Jan 15, 2023
ef8ddb2
chore(Application): modify Game Start
LTSGOD Jan 15, 2023
ac2ffb7
docs(README.md) modify docs
LTSGOD Jan 15, 2023
79398f9
style(.java): modify java Convention
LTSGOD Jan 15, 2023
76849e1
simplify(Input)
LTSGOD Jan 16, 2023
604278b
Refactor(Game)
LTSGOD Jan 16, 2023
1e45c81
simplify(Game)
LTSGOD Jan 16, 2023
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
26 changes: 26 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
InputClass 구현
입력기능: ReadCarName, ReadTryNum
예외처리기능: StringHandlingException, IntHandlingException

- 자동차이름 이름 5자 초과로 들어올때
- 횟수에 숫자가 안들어올때
getCarNum기능: 입력된 자동차의 개수반환

Car 구현

- 랜덤결과에 따라 전진, 머무르는 기능 MoveOrNot
- Race: Trynum 만큼 Race진행
- getPosition: 현재 Position
- winNum: 이긴횟수 기록

Game 구현

- 생성자구현: 차세팅, play 진행
-play: 횟수 만큼 경주게임 시작
-round: 한 라운드 게임진행
-setCars: Input으로 받아온 이름으로 Car객체배열생성
-sortCars: 매라운드 postion순으로 정렬

output 구현

- printRound: 라운드마다 게임결과 출력
6 changes: 3 additions & 3 deletions src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package racingcar;

public class Application {
public static void main(String[] args) {
// TODO 구현 진행
}
public static void main(String[] args) {
Game r1 = new Game();
}
}
43 changes: 37 additions & 6 deletions src/main/java/racingcar/Car.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,43 @@
package racingcar;

import camp.nextstep.edu.missionutils.Randoms;

public class Car {
private final String name;
private int position = 0;
private final String name;
private int position = 0;
private int positionBase = 0;
private int winNum = 0;

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

public void Race(int num) {
positionBase = position;//변하기전 위치 기억
for (int i = 0; i < num; i++) {
position += MoveOrNot();
}
}

public int MoveOrNot() {
if (Randoms.pickNumberInRange(0, 9) >= 4)
return 1;
return 0;
}

public int getPosition() {
return position - positionBase;//전체 위치가 아닌 한라운드당 위차 계산
}

public String getName() {
return name;
}

public Car(String name) {
this.name = name;
}
public void increaseWinNum() {
winNum++;
}

// 추가 기능 구현
public int getWinNum() {
return winNum;
}
}
87 changes: 87 additions & 0 deletions src/main/java/racingcar/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package racingcar;

import java.util.*;
import java.util.stream.Collectors;

public class Game {
private final ArrayList<Car> cars = new ArrayList<>();
private List<Car> SortedCars;
private final int TryNum;
private final int carNum;

public Game() {
ArrayList<String> StringInput = Input.ReadCarName();
TryNum = Input.ReadTryNum();
setCars(StringInput);
carNum = cars.size();

System.out.println("실행 결과");
Play();
finalWin();
}

private void Play() {
for (int i = 0; i < TryNum; i++) {
Round();
SortCars();
Score();
}
}

private void SortCars() {
SortedCars = cars.stream()
.sorted(Comparator.comparing(Car::getPosition).reversed())
.collect(Collectors.toList());
}

private void Score() {
Car maxCar = SortedCars.get(0);
maxCar.increaseWinNum();
int max = maxCar.getPosition();

handleRoundCoWinner(max);
}

private void handleRoundCoWinner(int max) {
for (int i = 1; i < carNum; i++) {
Car c1 = SortedCars.get(i);
if (c1.getPosition() != max) {
break;
}
c1.increaseWinNum();
}
}

private void Round() {
for (Car c1 : cars) {
c1.Race(TryNum);
Output.printRound(c1);
}
System.out.println();
}

private void setCars(ArrayList<String> input) {
for (String s : input) {
cars.add(new Car(s));
}
}

private void finalWin() {
Collections.sort(cars, (c1, c2) -> c2.getWinNum() - c1.getWinNum());
Car maxCar = cars.get(0);
int max = maxCar.getWinNum();
System.out.print("최종 우승자 : " + maxCar.getName());
handleFinalCoWinner(max);
System.out.println();
}

private void handleFinalCoWinner(int max) {
for (int i = 1; i < carNum; i++) {
Car c1 = cars.get(i);
if (c1.getWinNum() != max) {
break;
}
System.out.print(", " + c1.getName());
}
}
}
59 changes: 59 additions & 0 deletions src/main/java/racingcar/Input.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package racingcar;

import camp.nextstep.edu.missionutils.Console;

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

public class Input {
static ArrayList<String> carNames = new ArrayList<String>();

public static ArrayList<String> ReadCarName() {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
while (true) {
String[] input = Console.readLine().split(",");
try {
StringHandlingExecption(input);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage() + " 5이하의 문자열을 입력하세요.");
continue;
}
break;
}
return carNames;
}

private static void StringHandlingExecption(String[] input) {

for (String s : input) {
if (s.length() > 5) {
throw new IllegalArgumentException("[ERROR]");
}
carNames.add(s);
}
}

public static int ReadTryNum() {
System.out.println("시도할 회수는 몇회인가요?");
while (true) {
int num;
try {
num = IntHandlingException(Console.readLine());
} catch (Exception e) {
System.out.println("[Error] 시도횟수는 숫자여야 한다.");
continue;
}
return num;
}
}

private static int IntHandlingException(String n) {
int num;
try {
num = Integer.parseInt(n);
} catch (Exception e) {
throw new IllegalArgumentException("[Error]");
}
return num;
}
}
15 changes: 15 additions & 0 deletions src/main/java/racingcar/Output.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package racingcar;

public class Output {
public static void printRound(Car c1) {
System.out.print(c1.getName() + " : ");
printBar(c1);
}

public static void printBar(Car c1) {
for (int i = 0; i < c1.getPosition(); i++) {
System.out.print("-");
}
System.out.println();
}
}
61 changes: 31 additions & 30 deletions src/test/java/racingcar/ApplicationTest.java
Original file line number Diff line number Diff line change
@@ -1,41 +1,42 @@
package racingcar;

import camp.nextstep.edu.missionutils.test.NsTest;

import org.junit.jupiter.api.Test;

import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest;
import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest;
import static org.assertj.core.api.Assertions.assertThat;

class ApplicationTest extends NsTest {
private static final int MOVING_FORWARD = 4;
private static final int STOP = 3;

private static final String ERROR_MESSAGE = "[ERROR]";

@Test
void 전진_정지() {
assertRandomNumberInRangeTest(
() -> {
run("pobi,woni", "1");
assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi");
},
MOVING_FORWARD, STOP
);
}

@Test
void 이름에_대한_예외_처리() {
assertSimpleTest(
() -> {
runException("pobi,javaji");
assertThat(output()).contains(ERROR_MESSAGE);
}
);
}

@Override
public void runMain() {
Application.main(new String[]{});
}
private static final int MOVING_FORWARD = 4;
private static final int STOP = 3;

private static final String ERROR_MESSAGE = "[ERROR]";

@Test
void 전진_정지() {
assertRandomNumberInRangeTest(
() -> {
run("pobi,woni", "1");
assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi");
},
MOVING_FORWARD, STOP
);
}

@Test
void 이름에_대한_예외_처리() {
assertSimpleTest(
() -> {
runException("pobi,javaji");
assertThat(output()).contains(ERROR_MESSAGE);
}
);
}

@Override
public void runMain() {
Application.main(new String[] {});
}
}