Skip to content

[자동차 경주] 윤종근 미션 제출합니다.#183

Open
hi2242 wants to merge 49 commits intowoowacourse-precourse:mainfrom
hi2242:hi2242
Open

[자동차 경주] 윤종근 미션 제출합니다.#183
hi2242 wants to merge 49 commits intowoowacourse-precourse:mainfrom
hi2242:hi2242

Conversation

@hi2242
Copy link

@hi2242 hi2242 commented Oct 27, 2025

[과제2] 자동차 경주 게임

📃 목차

과제 소개

기능 요구 사항

주어진 횟수 동안 전진 또는 정지를 하며 우승자를 구하는 자동차 경주 게임을 진행한다.

  • 시도할 횟수가 주어진다.
  • 자동차는 전진 혹은 정지를 한다.
  • 각 자동차는 이름을 부여받는다.
  • 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
  • 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
  • 사용자는 몇 번의 이동을 할 것인지 입력할 수 있다.
  • 무작위 값의 범위는 0 ~ 9이고 4 이상이면 전진한다.
  • 자동차 경주 게임을 완료한 후 우승자를 알려준다. (우승자는 한 명 이상일 수 있다.)
  • 우승자가 여러 명일 경우 쉼표와 스페이스(, )를 이용하여 구분한다.
  • 사용자가 잘못된 값을 입력할 경우 '[ERROR]'로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션을 종료시킨다.

구현할 기능 목록

  1. README.md 파일 작성
    - 기능 : 과제의 기능 요구 사항과 사용법을 설명하는 README.md 파일을 작성한다.
    - 세부 사항
    • 구현할 모든 기능 목록을 정리한다.
    • 기능 요구 사항을 분석하여 예상 가능한 결과를 정리한다.
    • 실행 방법과 예시를 포함한다.
  2. 사용자 입력 받기
    - 기능 : 자동차의 이름을 조건에 맞게 지정하고 시도할 횟수를 지정한다.
    - 세부 사항
    • 자동차 이름들은 쉼표(,)를 구분자로 지정한다.
    • 각 자동차 이름은 5자 이하의 문자로 지정한다.
    • 시도할 횟수는 숫자를 입력받아 지정한다.
  3. 랜덤 값 뽑기
    - 기능 : 0 ~ 9의 숫자를 뽑고 숫자에 맞는 행동을 취한다.
    - 세부 사항
    • 0, 1, 2, 3이 뽑힌 경우엔 자동차가 이동하지 않는다.
    • 4, 5, 6, 7, 8, 9가 뽑힌 경우엔 자동차를 한칸 전진시킨다.
  4. 회차별 결과 출력
    - 기능 : 현재 자동차가 이동한 칸의 개수만큼 -로 표현한다.
    - 세부 사항
    • 처음에는 이동한 칸이 없고 로직에 따라 이동하면 -를 하나씩 추가한다.
  5. 우승자 출력
    - 기능 : 시도할 횟수가 끝나면 우승자를 쉼표와 스페이스(, )로 구분한다.
    - 세부 사항
    • 가장 많이 움직인 자동차들의 이름을 조건에 맞게 출력한다.

요구 사항 분석

  • 자동차 이름의 입력이 특이한 경우
    • 입력한 자동차가 없는 경우 => '[ERROR] 경주할 자동차가 존재하지 않습니다.'
    • 자동차의 이름이 5자 초과인 경우 => '[ERROR] 긴 이름의 자동차는 허용되지 않습니다.'
    • 자동차 이름이 공백인 경우 => '[ERROR] 자동차의 이름을 공백으로 설정할 수 없습니다.'
    • 자동차 이름이 중복인 경우 => '[ERROR] 자동차의 이름은 중복으로 설정할 수 없습니다.'
  • 시도할 횟수의 입력이 특이한 경우
    • 사용자가 시도할 횟수로 0을 입력한 경우 => 모두 우승자로 취급
    • 사용자가 음수나 숫자가 아닌 값을 입력한 경우 => '[ERROR] 올바르지 않은 시도 횟수입니다.'

테스트 케이스

실행 방법

  npm install
  npm start
  npm test

Case 1 (성공 - 우승자 1인)

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

  실행 결과
  pobi : -
  woni : 
  jun : -

  pobi : --
  woni : -
  jun : --

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

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

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

  최종 우승자 : pobi, jun

Case 2 (성공 - 우승자 2인 이상)

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

  1

  실행 결과
  pobi :
  woni : -
  jun : -

  최종 우승자 : woni, jun

Case 3 (성공 - 0회 시도 후 모두 우승인 경우)

  경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
  pobi,woni,jun
  시도할 횟수는 몇 회인가요?
  0

  실행 결과
  최종 우승자 : pobi, woni, jun

Case 4 (예외 - 입력한 자동차가 없는 경우)

  경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)

  [ERROR] 경주할 자동차가 존재하지 않습니다.
  file:///D:/Yoon/APP/woowacourse_8/precourse/javascript-racingcar-8/src/utils/Validator.js:6
              throw new Error(ERROR_MESSAGES.CAR_LIST_EMPTY_ERROR);
                    ^

Case 5 (예외 - 자동차의 이름이 5자 초과인 경우)

  경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
  pobi,javajigi
  [ERROR] 긴 이름의 자동차는 허용되지 않습니다.
  file:///D:/Yoon/APP/woowacourse_8/precourse/javascript-racingcar-8/src/utils/Validator.js:15
              throw new Error(ERROR_MESSAGES.CAR_NAME_LONG_LENGTH_ERROR);
                    ^

Case 6 (예외 - 자동차 이름이 공백인 경우)

  경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
  pobi, ,java
  [ERROR] 자동차의 이름을 공백으로 설정할 수 없습니다.
  file:///D:/Yoon/APP/woowacourse_8/precourse/javascript-racingcar-8/src/utils/Validator.js:11
              throw new Error(ERROR_MESSAGES.CAR_NAME_CANT_SPACE)
                    ^

Case 7 (예외 - 자동차 이름이 중복인 경우)

  경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
  pobi,java,pobi
  [ERROR] 자동차의 이름은 중복으로 설정할 수 없습니다.
  file:///D:/Yoon/APP/woowacourse_8/precourse/javascript-racingcar-8/src/utils/Validator.js:21
              throw new Error(ERROR_MESSAGES.CAR_NAME_CANT_DUPLICATE);
                    ^

Case 8 (예외 - 시도할 횟수가 음수나 숫자가 아닌 값을 입력한 경우)

  경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
  pobi,woni,jun
  시도할 횟수는 몇 회인가요?                                                                                                                               
  -5
  [ERROR] 올바르지 않은 시도 횟수입니다.
  file:///D:/Yoon/APP/woowacourse_8/precourse/javascript-racingcar-8/src/utils/Validator.js:37
              throw new Error(ERROR_MESSAGES.ROUNDS_IS_NOT_VALIDATE);
                    ^

Path Tree

javascript-racingcar-8
├─ node_modules
├─ .npmrc
├─ package-lock.json
├─ package.json
├─ README.md
├─ src
│  ├─ App.js
│  ├─ constants
│  │  └─ constants.js
│  ├─ controller
│  │  └─ GameController.js
│  ├─ index.js
│  ├─ model
│  │  ├─ Car.js
│  │  └─ Game.js
│  ├─ utils
│  │  ├─ getLogSpy.js
│  │  ├─ mockQuestions.js
│  │  ├─ mockRandoms.js
│  │  └─ Validator.js
│  └─ view
│     ├─ InputView.js
│     └─ OutputView.js
└─ __tests__
  ├─ ApplicationTest.js
  ├─ Car.test.js
  ├─ Game.test.js
  ├─ GameController.test.js
  ├─ Input.test.js
  ├─ Output.test.js
  └─ Validator.test.js

시행착오 및 배운점

[과제2]의 시행착오 및 배운점

회고

이번 주차는 1주차보다 예외 테스트를 고려할 부분이 적어서 예외 처리에 시간을 많이 투자하지 않았습니다. 하지만 Model-View-Controller 구조로 분리하여 설계를 할 때 실수가 많이 나왔고 이를 통해 배웠던 점도 많았습니다. 프로그래밍 요구 사항 2에 기능 목록이 정상적으로 작동하는지 테스트 코드로 확인할 때 설계에 이상이 있는 부분이 꽤 많았습니다. 이에 대해 찾아본 결과 TDD라는 방식으로 테스트 실패(Red) -> 테스트 통과(Green) -> 코드 정리(Refactor)라는 3단계 사이클로 했다면 더 쉽게 해결할 수 있었지 않았을까 싶습니다. 다음 주차의 과제를 시작하기 전까지 이 부분에 대해 정리해보고 추가적으로 다른 사람의 코드에서 괜찮은 부분들을 적용해보고 싶다는 생각을 했습니다.

hi2242 added 30 commits October 26, 2025 14:29

class Car {
#name;
#position;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

private 필드를 사용하여 name, position을 정의한 이유가 궁금합니다!

@202110861
Copy link

mvc 패턴 사용하셨네요!! mvc와 utils에 각각 어떤 기준으로 파일을 배치?했는지 궁금합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants