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

java-racingcar 미션 제출 #4

Open
wants to merge 52 commits into
base: chae-heechan
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 48 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
0a5d963
docs: 기능 구현 목록 및 클래스 정리
chae-heechan Mar 4, 2021
216cb6d
test: 입력 및 유효성 검사 클래스 테스트 케이스 작성
chae-heechan Mar 4, 2021
ae04e19
feat: Receiver 클래스 구현
chae-heechan Mar 4, 2021
a6e8c0f
feat: Validator 인터페이스 생성
chae-heechan Mar 4, 2021
804fe2d
docs: 클래스 분류 재정리
chae-heechan Mar 4, 2021
a02977d
feat: Message인터페이스 생성
chae-heechan Mar 4, 2021
3ac806d
test: validator클래스 구조 변경에 따른 테스트 변경
chae-heechan Mar 9, 2021
a973407
feat: 출력 메세지 인터페이스 작성
chae-heechan Mar 9, 2021
78bb06d
refactor: 메세지 호출 메서드 삭제, 입력 예외 추가
chae-heechan Mar 9, 2021
bb9c87b
feat: 프린터 클래스 구현
chae-heechan Mar 9, 2021
07f6628
feat: 게임 시작 기능 추가
chae-heechan Mar 9, 2021
cdfc826
docs: 클래스 및 메서드 분류 재정리
chae-heechan Mar 9, 2021
0ff13cc
feat: Car클래스 구현
chae-heechan Mar 9, 2021
6519379
feat: Message클래스 구현
chae-heechan Mar 9, 2021
7aaac17
feat: Validator클래스 구현
chae-heechan Mar 9, 2021
b115436
refactor: receiveLine 메서드 삭제
chae-heechan Mar 9, 2021
8d840f7
feat: 게임 실행 부분 구현
chae-heechan Mar 9, 2021
74d8054
feat: 난수 생성 기능 구현
chae-heechan Mar 9, 2021
02b5186
style: overSizeCharacters 메서드 이름 변경
chae-heechan Mar 10, 2021
6954307
test: Paramiterizedtest로 변경
chae-heechan Mar 10, 2021
305ea0d
feat: 게임 내 출력 메서드 추가
chae-heechan Mar 10, 2021
fc3b773
test: Receiver 테스트 케이스 작성
chae-heechan Mar 10, 2021
e0fe4fa
docs: Paramiterized 테스트 사용하기 위해 testCompile 부분 추가
chae-heechan Mar 10, 2021
2d34588
style: overSizeCharacters 메서드 이름 변경
chae-heechan Mar 10, 2021
e1c98f3
style: 불필요한 라인 제거
chae-heechan Mar 10, 2021
38feeaa
test: Car 테스트 케이스 작성
chae-heechan Mar 10, 2021
c47f82f
test: GamePlayer 테스트 케이스 작성
chae-heechan Mar 10, 2021
2c62d0c
test: Generator 테스트 케이스 작성
chae-heechan Mar 10, 2021
838a38b
test: Message 테스트 케이스 작성
chae-heechan Mar 10, 2021
1a10b46
test: Printer 테스트 케이스 작성
chae-heechan Mar 10, 2021
d9fbd3a
style: overSizeCharacters 메서드 이름 변경
chae-heechan Mar 10, 2021
932e5fe
feat: 게임 내 출력 메서드 추가
chae-heechan Mar 10, 2021
ed3d8ac
test: Receiver 테스트 케이스 작성
chae-heechan Mar 10, 2021
e0b9f8d
feat: 게임 내 출력 메서드 추가
chae-heechan Mar 10, 2021
0b4dd36
refactor: 출력 부분 printer 객체에서 처리하도록 변경
chae-heechan Mar 10, 2021
7bb1ace
docs: empty 파일 삭제
chae-heechan Mar 10, 2021
6a4411c
refactor: 인터페이스 내의 불필요한 코드 삭제
chae-heechan Mar 16, 2021
b1b4155
refactor: 객체 접근지정자 변경
chae-heechan Mar 16, 2021
6c66206
refactor: 불필요한 생성자 제거
chae-heechan Mar 16, 2021
4bead01
refactor: 클래스 내의 선언 순서 변경
chae-heechan Mar 16, 2021
8320e5c
refactor: 쉼표(,) 상수로 변경
chae-heechan Mar 16, 2021
ca1d01b
refactor: 생성자 삭제
chae-heechan Mar 16, 2021
87e63b3
refactor: 메소드 이름 변경
chae-heechan Mar 16, 2021
b338bea
refactor: 정규식 상수로 표현 변경
chae-heechan Mar 16, 2021
d1ce820
refactor: 반복문에 사용되는 변수 이름 변경
chae-heechan Mar 16, 2021
874421e
refactor: 상수 이름 변경
chae-heechan Mar 16, 2021
329c805
refactor: inputOtherThanCharacter 메서드 이름 변경
chae-heechan Mar 16, 2021
d947ed2
refactor: 접근지정자 명시
chae-heechan Mar 16, 2021
4f7ee17
refactor: isCorrectName 메서드 이름 변경
chae-heechan Mar 17, 2021
0d2f2fd
refactor: 객체에 final 키워드 추가
chae-heechan Mar 26, 2021
da7d13f
refactor: GamePlayer의 car객체 생성 역할을 CarManager로 분산
chae-heechan Mar 26, 2021
a7b2e8b
refactor: GamePlayer의 우승자 판독 역할을 Referee로 분산
chae-heechan Mar 26, 2021
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
47 changes: 47 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,52 @@
# 미션 - 자동차 경주 게임

## 📋 기능 구현 목록
- 사용자 입력 요구문 출력
- 사용자 입력
- 예외 처리
- 플레이어 생성

- 경주 게임 실행
- 무작위 수 생성
- 4이상 인지 비교
- 1초 간격두고 라운드 결과 출력

- 우승자 판별
- 우승자 출력

chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
## 🚬 클래스와 메서드?
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
- Application
- Receiver
- receiveName
- receiveNumber
- Printer
- printMessage
- GamePlayer
- run
- judgeToMove
- makeArrayAfterGettingName
- makeCountAfterGettingNumber
- launchAllRound
- checkWhoIsWinner
- Generator
- generateRandomNumber
- Car
- getPosition
- getName
- moveForward
- Validate
- validateName(s)
- inputNothing(s)
- inputCommaInARow(s)
- inputCharactersOtherThanName(s)
- startWithComma(s)
- endWithComma(s)
- over5Characters(s)
- inputSameName(s))
- validateNumber(s)
- Message


## 🚀 기능 요구사항

- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ repositories {

dependencies {
testCompile("org.assertj:assertj-core:3.14.0")
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testCompile('org.junit.jupiter:junit-jupiter:5.6.0')
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

Expand Down
8 changes: 8 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import domain.GamePlayer;

public class Application {
public static void main(String[] args){
GamePlayer gamePlayer = new GamePlayer();
gamePlayer.run();
}
}
12 changes: 11 additions & 1 deletion src/main/java/domain/Car.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,15 @@ public Car(String name) {
this.name = name;
}

// 추가 기능 구현
public int getPosition() {
return this.position;
}

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

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

import io.Printer;
import io.Receiver;

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

public class GamePlayer {
private final int WINNER_CONDITION = 4;
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
private Printer printer = new Printer();
private Receiver receiver = new Receiver();
private Generator generator= new Generator();
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved

public void judgeToMove(Car car, int randomNumber) {
if (randomNumber >= WINNER_CONDITION)
car.moveForward();
}

public Car[] makeArray() {
printer.printGeneralMessage("INPUT_NAMEOFCAR");
String[] listOfName = receiver.receiveName();

Car[] cars = new Car[listOfName.length];
for (int i = 0; i < listOfName.length; i++)
cars[i] = new Car(listOfName[i]);

return cars;
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
}

public int makeCount() {
printer.printGeneralMessage("INPUT_COUNT");
return receiver.receiveNumber();
}

public void launchAllRound(Car[] cars, int countRound) {
for (int i = 0; i < countRound; i++) {
for (Car car : cars) {
judgeToMove(car, generator.generateRandomNumber());
printer.printProgressWithSymbol(car.getName(), car.getPosition());
}
printer.printGeneralMessage("DEFAULT_SPACE");

try {
Thread.sleep(500);
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public List<Car> checkWhoIsWinner(Car[] cars) {
List<Car> result = new ArrayList<>();
int maxNumber = 0;

for (Car car : cars) {
if(car.getPosition() == maxNumber){
result.add(car);
continue;
}
if (car.getPosition() > maxNumber) {
maxNumber = car.getPosition();
result.clear();
result.add(car);
}
}

return result;
}

chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
public void run() {
Car[] cars = makeArray();
int countRound = makeCount();

printer.printGeneralMessage("OPERATION_RESULT");
launchAllRound(cars, countRound);

List<Car> winner = checkWhoIsWinner(cars);
printer.printWinner(printer.makeWinnerToString(winner));
}
}
9 changes: 9 additions & 0 deletions src/main/java/domain/Generator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package domain;

public class Generator {
private static final int MAX_LIMIT_NUMBER = 10;

public int generateRandomNumber() {
return (int) ((Math.random() * 10000) % MAX_LIMIT_NUMBER);
}
}
103 changes: 103 additions & 0 deletions src/main/java/domain/Validator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package domain;

import io.Printer;

import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

public class Validator implements ValidatorInterface {
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
private static final int MAX_NAME_SIZE = 5;
private static final String ONLY_NUMBER = "^[0-9]+$";
private static final String COMMA_IN_A_ROW = "^(,,)+$";
private static final String OTHER_THAN_CHARACTER = "^[a-zA-Z,]+$";

Printer printer = new Printer();

@Override
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
public boolean validateName(String s) {
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
return inputNothing(s)
&& inputCommaInARow(s)
&& inputOtherThanCharacter(s)
&& startWithComma(s)
&& endWithComma(s)
&& overSizeCharacters(s)
&& inputSameName(s);
}

@Override
public boolean validateNumber(String s) {
return s.matches(ONLY_NUMBER);
}

@Override
public boolean inputNothing(String s) {
if (s.equals("")) {
printer.printExceptionMessage("INPUT_NOTHING");
return false;
}
return true;
}

@Override
public boolean inputCommaInARow(String s) {
if (Pattern.matches(COMMA_IN_A_ROW, s)) {
printer.printExceptionMessage("INPUT_COMMA_IN_A_ROW");
return false;
}
return true;
}

@Override
public boolean startWithComma(String s) {
if (s.charAt(0) == ',') {
printer.printExceptionMessage("START_WITH_COMMA");
return false;
}
return true;
}

@Override
public boolean endWithComma(String s) {
if (s.charAt(s.length() - 1) == ',') {
printer.printExceptionMessage("END_WITH_COMMA");
return false;
}
return true;
}

@Override
public boolean inputOtherThanCharacter(String s) {
if (!Pattern.matches(OTHER_THAN_CHARACTER, s)) {
printer.printExceptionMessage("INPUT_OTHER_THAN_CHARACTERS");
return false;
}
return true;
}

@Override
public boolean inputSameName(String s) {
List<String> CAR_NAME_LIST = Arrays.asList(s.split(","));
int sizeOfNameList = CAR_NAME_LIST.size();

for (int i = 0; i < sizeOfNameList; i++) {
if (CAR_NAME_LIST.subList(i + 1, sizeOfNameList).contains(CAR_NAME_LIST.get(i))) {
printer.printExceptionMessage("INPUT_SAME_NAME");
return false;
}
}
return true;
}

@Override
public boolean overSizeCharacters(String s) {
String[] splitName = s.split(",");
for (String i : splitName)
if (i.length() > MAX_NAME_SIZE) {
printer.printExceptionMessage("OVER_SIZE_CHARACTERS");
return false;
}
return true;
}

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

public interface ValidatorInterface {
boolean validateName(String s);

boolean validateNumber(String s);

boolean inputNothing(String s);

boolean inputCommaInARow(String s);

boolean startWithComma(String s);

boolean endWithComma(String s);

boolean inputOtherThanCharacter(String s);

boolean inputSameName(String s);

boolean overSizeCharacters(String s);
}
Empty file removed src/main/java/empty.txt
Empty file.
42 changes: 42 additions & 0 deletions src/main/java/io/Message.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io;

import java.util.HashMap;
import java.util.Map;

public class Message implements MessageInterface {
Map<String, String> generalMessageList = new HashMap<String, String>();
Map<String, String> exceptionMessageList = new HashMap<String, String>();

public Message() {
this.exceptionMessageList();
this.generalMessageList();
}
private void generalMessageList() {
generalMessageList.put("INPUT_NAMEOFCAR", "경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)");
generalMessageList.put("INPUT_COUNT", "시도할 회수는 몇회인가요?");
generalMessageList.put("OPERATION_RESULT", "실행 결과");
generalMessageList.put("FIANL_WINNER", "가 최종 우승했습니다.");
generalMessageList.put("DEFAULT_SPACE", "");
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved
}

private void exceptionMessageList() {
exceptionMessageList.put("INPUT_NOTHING", "아무 문자도 입력되지 않았습니다.");
exceptionMessageList.put("INPUT_COMMA_IN_A_ROW", "쉼표(,)가 연속으로 입력되었습니다.");
exceptionMessageList.put("INPUT_OTHER_THAN_CHARACTERS", "영어와 쉼표(,) 이외의 다른 문자가 입력되었습니다.");
exceptionMessageList.put("START_WITH_COMMA", "쉼표(,)로 시작합니다.");
exceptionMessageList.put("END_WITH_COMMA", "쉼표(,)로 끝납니다.");
exceptionMessageList.put("INPUT_SAME_NAME", "같은 이름이 입력되었습니다.");
exceptionMessageList.put("OVER_SIZE_CHARACTERS", "이름이 5자 이상입니다.");
exceptionMessageList.put("INPUT_CHARACTERS_OTHER_THAN_DIGIT", "숫자 이외의 다른 문자가 입력되었습니다.");
}

@Override
public String selectMessageFromGeneral(String Keyword) {
return generalMessageList.get(Keyword);
}

@Override
public String selectMessageFromException(String Keyword) {
return exceptionMessageList.get(Keyword);
}
}
14 changes: 14 additions & 0 deletions src/main/java/io/MessageInterface.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io;

public interface MessageInterface {
chae-heechan marked this conversation as resolved.
Show resolved Hide resolved

private void generalMessageList() {
}

private void exceptionMessageList() {
}

String selectMessageFromGeneral(String Keyword);

String selectMessageFromException(String Keyword);
}
Loading