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

Giantim #132

Closed
wants to merge 11 commits into from
57 changes: 57 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# 2019-12-04 프로그램 최초 설계

### 클래스 설계
* 자동차
* 필드:
1) 이름
2) 위치

* 게임
* 게임에 관한 기능을 포함한 클래스
* 필드:
1) 자동차(리스트)
2) 스캐너
3) 프린터(추가)
4) 랜덤 변수(추가)
5) 시도 횟수(추가)
* 메소드:
1) 게임 실행
2) 이름 입력 받기
- 쉼표가 포함 되었는가?
- 이름의 길이가 5자 이하인가?
- 이름이 공백 문자열로 입력되지 않았는가?(추가)
3) 시도 횟수 입력
- 숫자를 입력했는가?
4) 랜덤 수 생성
5) 자동차 전진

* 프린터
* 게임 진행에 필요한 문구를 출력
* 필드:
* 메소드:
1) 공백 라인 출력
2) 자동차 이름 입력 문구 출력
3) 시도 횟수 입력 문구 출력
4) 실행 결과 문구 출력
5) 자동차 이름 출력
6) 자동차 위치 출력
7) 우승자 출력

* 입력 예외(추가)
* 자동차 이름, 시도 횟수 등을 입력 받을 때 유효하지 않은 값을 받았을 때
발생시키는 예외

* 상수
* 프로젝트에 사용되는 모든 상수를 포함

### 기능 단위 목록
* 게임 시작
* 게임에 필요한 조건 초기화
* 자동차의 정보 입력 받기
* 게임의 시도 횟수 입력 받기
* 게임 실행
* 자동차의 위치 조정(추가적인 아이디어 생각하기)
+ 랜덤 수 생성
+ 자동차의 위치 이동 여부 판단
- 게임 진행 문구 출력
- 게임 종료
37 changes: 31 additions & 6 deletions src/main/java/domain/Car.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,37 @@
package domain;

public class Car {
private final String name;
private int position = 0;
private final String name;
private int position = 0;
/**
* 우승한 자동차인지 표시하는 변수 true면 우승한 자동차이다.
*/
private boolean isPrize = false;

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

// 추가 기능 구현
// 추가 기능 구현
public String getName() {
return name;
}

public int getPosition() {
return position;
}

public void setPrize() {
isPrize = true;
}

public boolean getPrize() {
return isPrize;
}

public void movePosition(int randomNumber) {
if (randomNumber >= Constant.CAR_MOVE_STANDARD) {
position = position + 1;
}
}
}
18 changes: 18 additions & 0 deletions src/main/java/domain/Constant.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package domain;

/**
* 프로그램에 사용되는 모든 상수를 선언한 클래스
*
* @author giantim
*/
public class Constant {
public static final int ASCII_ZERO = 48;
public static final int ASCII_NINE = 57;
public static final int CAR_NAME_LENGTH = 5;
public static final int CAR_MOVE_STANDARD = 4;
public static final String COMMA = ",";
public static final String EMPTY = "";
public static final String COLON = " : ";
public static final String BAR = "-";
public static final String COMMA_WITH_SPACE = ", ";
}
208 changes: 208 additions & 0 deletions src/main/java/domain/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
package domain;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;

/**
* 자동차 경주 게임을 수행하는 클래스.
*
* @author giantim
*/
public class Game {
private ArrayList<Car> myCar;
private Printer myPrinter;
private Scanner in;
private String[] carName;
private int gameCount;
private Random random;
/*
* 게임이 계속 진행될지 판단하는 변수
*/
private boolean isEnd;

public Game() {
myCar = new ArrayList<Car>();
myPrinter = new Printer();
in = new Scanner(System.in);
isEnd = false;
}

private void run() {
getGameInformation();
myPrinter.printPlayResult();
do {
moveCar();
myPrinter.printCarInfomation(myCar);
checkGameEnd();
} while (!isEnd);
myPrinter.printWinner(myCar);
}

/**
* 사용자에게 자동차 이름, 게임 시도 횟수 등을 입력받고 자동차 객체를 초기화한다.
*/
private void getGameInformation() {
getCarName();
getGameCount();
initializeCar();
}

/**
* 자동차 이름의 입력받고 유효성을 검사한다.
*/
private void getCarName() {
String inputName;

try {
myPrinter.printInputCarName();
inputName = in.next();
checkNameValidation(inputName);
} catch (InputException e) {
getCarName();
}
}

/**
* 입력받은 자동차 이름의 유효성을 검사한다, 검사 항목으로는 쉼표가 포함되어 있는지, 공백 이름을 입력했는지, 이름이 5글자 이하인지 등을
* 검사한다.
*
* @param name 입력받은 자동차 이름 문자열. 파싱되어있지 않다.
*/
private void checkNameValidation(String name) {
isContainComma(name);
isStartComma(name);
isEndComma(name);
parseName(name);
isEmptyCarName();
checkCarNameLength();
}

/**
* 파싱되지 않은 사용자 입력 문자열에 ,가 포함되어있는지 검사한다.
*
* @param name 입력받은 자동차 이름 문자열. 파싱되어있지 않다.
*/
private void isContainComma(String name) {
if (!name.contains(Constant.COMMA)) {
myPrinter.printContainComma();
throw new InputException();
}
}

/**
* ,로 시작하는 문자열 입력시 빈 이름이 포함되므로 예외이다.
*
* @param name 입력받은 자동차 이름 문자열. 파싱되어있지 않다.
*/
private void isStartComma(String name) {
if (name.startsWith(Constant.COMMA)) {
myPrinter.printEmptyCarName();
throw new InputException();
}
}

/**
* ,로 끝나는 문자열 입력시 빈 이름이 포함되므로 예외이다.
*
* @param name 입력받은 자동차 이름 문자열. 파싱되어있지 않다.
*/
private void isEndComma(String name) {
if (name.endsWith(Constant.COMMA)) {
myPrinter.printEmptyCarName();
throw new InputException();
}
}

private void parseName(String name) {
carName = name.split(Constant.COMMA);
}

/**
* 빈 문자열이 이름인 상황은 예외이다.
*/
private void isEmptyCarName() {
for (String s : carName) {
if (s.equals(Constant.EMPTY)) {
myPrinter.printEmptyCarName();
throw new InputException();
}
}
}

private void checkCarNameLength() {
for (String s : carName) {
if (s.length() > Constant.CAR_NAME_LENGTH) {
myPrinter.printCarNameLength();
throw new InputException();
}
}
}

private void getGameCount() {
String inputCount;

try {
myPrinter.printGameCount();
inputCount = in.next();
checkCountValidation(inputCount);
} catch (InputException e) {
getGameCount();
}
}

/**
* 시도 횟수의 유효성을 검사한다. 유효성 검사 항목은 입력이 0~9의 숫자로만 이루어져있는지 검사한다.
*
* @param number 사용자가 숫자로 입력한 문자열
*/
private void checkCountValidation(String number) {
isNumber(number);
convertNumber(number);
}

private void isNumber(String number) {
for (char c : number.toCharArray()) {
if (!(c >= Constant.ASCII_ZERO && c <= Constant.ASCII_NINE)) {
myPrinter.printInputNumber();
throw new InputException();
}
}
}

private void convertNumber(String number) {
gameCount = Integer.parseInt(number);
}

private void initializeCar() {
for (String s : carName) {
myCar.add(new Car(s));
}
}

private void moveCar() {
random = new Random();

for (Car c : myCar) {
c.movePosition(random.nextInt(10));
}
}

/**
* 자동차들 중에서 게임 시도 횟수와 위치가 같은 자동차가 있는지 찾는다. 만약 위치가 같은 자동차가 있다면 isPrize 변수를 true로
* 변경한다. 그리고 게임 실행의 반복문을 제어하는 isEnd를 true로 변경한다.
*/
private void checkGameEnd() {
for (Car c : myCar) {
if (c.getPosition() == gameCount) {
isEnd = true;
c.setPrize();
}
}
}

public static void main(String[] args) {
Game game = new Game();
game.run();
}
}
10 changes: 10 additions & 0 deletions src/main/java/domain/InputException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package domain;

/**
* 자동차 이름, 게임 시도 횟수 등의 입력이 잘못 되었을 때 발생하는 예외.
*
* @author giantim
*/
public class InputException extends RuntimeException {

}
Loading