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

[racingcar] #507

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
187 changes: 0 additions & 187 deletions README.md

This file was deleted.

59 changes: 59 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# 새로 알게된 것 & 부족한 것
[어려웠던 점]<br/>
문제 요구사항을 읽고 난 뒤에 기능을 구현하는 것 자체가 어렵지는 않았다.
하지만 기능 목록 정리를 위해 전체 프로그램을 기능 단위로 분리하는 것과 전체 프로그램을 잘 설계하는 것이 너무 복잡하다고 느꼈다.
반드시 필요한 함수들로만 구성하고 함수들을 가장 작은 단위로 쪼개는 것을 목표로 했는데 이 두 가지를 고려하면서 프로그램을 짜는 것이 어려웠던 것 같다.
그리고 '함수는 한 가지 일만 잘 하도록 구현한다' 조건에 맞게 각 함수가 한 가지 일만 하도록 구성하는 것도 쉽지 않았다.
예를 들어 startGame()이라는 메서드를 추가하는 과정에서 '게임 시작을 위한 기능이 아니면 모두 분리해야하나?'하는 생각이 들었다.
모든 기능이 유기적으로 연결되어 있어서 주관적인 생각으로 기능을 분리하면 되는 것인가 하는 생각이 들었다.
아직 코드에 대해 조금 더 고민해봐야 할 것 같다. 3기 크루였던 분의 블로그에서 MVC패턴에 맞게 설계한다는 내용을 봤는데, 한번 찾아봐야할 것 같다.

[문법 관련]<br>
- 이터레이터 사용법
- ArrayList 사용법
- join, split 하는 방법
- Integer.parseInt : primitive int형으로 반환, Integer.valueOf() : Integer 객체로 반환
- Vector : 동적 추가

[기타]
- 프로젝트 시작 전 gradle, File Structure 버전8로 세팅 확인하기
- git branch push 할 때 ```git push origin swonny``` (main과 혼동하지 말기)
- unindent(들여쓰기 취소) : ⇧(shift) + ⇥(tab)
- MVC패턴

# 기능 목록

## 1. 자동차 ✔️
### [속성] ✔️
- 자동차 이름<br/>
- 위치<br/>

### [기능]
- 기능 1 [자동차 이름 부여] ✔️<br/>
- 자동차 이름 입력 받기<br/>
- 자동차 이름 유효성 검사 (5글자 이하)<br/>
- 자동차 이름 부여 및 생성<br/>
<br/>
- 기능 2 [자동차 전진] ✔️<br/>
- 0 ~ 9 사이의 무작위 값이 4 이상이라면 전진한다. 전진한 값을 입력받는다.<br/>
- 전진하는 자동차를 출력한다. 전진하는 자동차 이름을 출력하고 전진 상황은 하이픈(-)으로 나타낸다.<br/>

## 2. 자동차 경주 게임 ✔️
### [기능]
- 기능 1 [게임 시작] ✔️<br/>
- 사용자에게 반복 횟수 입력받는다.<br/>
- 잘못된 값을 입력하면 exceptionError 발생시킨다.<br/>
<br/>
- 기능 2 [게임 종료] ✔️<br/>
- 경주 완료 후 누가 우승했는지 알려준다. <br/>
- (우승자는 한 명 이상일 수 있다.)<br/>
- (우승자가 여러명일 경우 쉼표로 구분한다.)<br/>

## 3. 사용자 입력
### [기능]
- 기능 1 [사용자 입력값 받기] ✔️<br/>
<br/>
- 기능 2 [예외 처리] ✔️<br/>
- '[ERROR]'를 포함한 문자열<br/>
- 자동차 이름 입력 오류 처리<br/>
- 반복 횟수 입력 오류 처리 ()<br/>
4 changes: 3 additions & 1 deletion 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.playGame();
}
}
}
11 changes: 11 additions & 0 deletions src/main/java/racingcar/Car.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,15 @@ public Car(String name) {
}

// 추가 기능 구현
public void moveForward () {
position += 1;
}

public int getPosition() {
return position;
}

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

import camp.nextstep.edu.missionutils.Randoms;

import java.util.Vector;

public class Game {
Player player;
Car[] cars;
int rounds;
int firstPosition;
Vector<String> winners;

Game() { // Game의 생성자, 게임 시작을 위한 초기 세팅
winners = new Vector();
firstPosition = 0;
player = new Player();
rounds = player.rounds;
cars = new Car[player.cars.length]; // 자동차 n개의 배열을 위한 메모리 할당
for (int i = 0; i < player.cars.length; i++) { // n개의 car 인스턴스 생성
cars[i] = new Car(player.cars[i]);
}
}

public void playGame() { // 입력 횟수만큼 반복
for (int i = 0; i < rounds; i++) {
startRound();
printProgress();
}
getWinners();
finishGame();
}

public void startRound() {
for (int i = 0; i < cars.length; i++) {
if (moveForward(Randoms.pickNumberInRange(0, 9))) { // 난수 생성 및 4보다 큰지 판단
cars[i].moveForward();
}
}
}

public boolean moveForward(int randomNumber) {
if (randomNumber >= 4) {
return true;
}

return false;
}

public void printProgress() {
for (int i = 0; i < cars.length; i++) {
String name = cars[i].getName();
int position = cars[i].getPosition();
System.out.print(name + " : ");
for (int j = 0; j < position; j++) {
System.out.print("-");
}
System.out.println();
}
System.out.println();
}

public int getFirstPosition() {
int firstPosition = 0;
for (int i = 0; i < cars.length; i++) {
int tmp = cars[i].getPosition();
if (tmp < firstPosition) {
continue;
}
firstPosition = tmp;
}

return firstPosition;
}

public void getWinners() {
int firstPosition = getFirstPosition();
for (int i = 0; i < cars.length; i++) {
int tmp = cars[i].getPosition();
if (tmp == firstPosition) {
winners.add(cars[i].getName());
}
}
}

public void finishGame() {
String result = String.join(", ", winners);
System.out.print("최종 우승자 : " + result);
}
}
Loading