Skip to content

Latest commit

 

History

History
123 lines (95 loc) · 6.17 KB

README.md

File metadata and controls

123 lines (95 loc) · 6.17 KB

자동차 경주 게임

진행 방법

  • 자동차 경주 게임 요구사항을 파악한다.
  • 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
  • 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
  • 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.

온라인 코드 리뷰 과정

🚀 3단계 - 자동차 경주

기능 요구사항

  • 초간단 자동차 경주 게임을 구현한다.
  • 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
  • 사용자는 몇 대의 자동차로 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
  • 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우이다.
  • 자동차의 상태를 화면에 출력한다. 어느 시점에 출력할 것인지에 대한 제약은 없다.
  • 자동차의 처음 위치는 0이다.
  • 사용자가 입력한 개수만큼의 자동차가 존재한다.
  • 사용자가 0 또는 음수의 자동차 개수를 입력하면 에러를 반환한다.
  • random값이 4 이상일 경우에 자동차의 위치는 1 추가된다.
  • m 라운드가 끝나면 자동차 경주는 종료된다.

프로그래밍 요구사항

  • 모든 로직에 단위 테스트를 구현한다. 단, UI(System.out, System.in) 로직은 제외
    • 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
    • UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
  • 자바 코드 컨벤션을 지키면서 프로그래밍한다.
    • 이 과정의 Code Style은 intellij idea Code Style. Java을 따른다.
    • intellij idea Code Style. Java을 따르려면 code formatting 단축키(Windows : Ctrl + Alt + L. Mac : ⌥ (Option) + ⌘ (Command) + L.)를 사용한다.
  • else 예약어를 쓰지 않는다.
    • 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
    • else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.

개발 구조

Game : 게임의 시작과 종료를 담당 Race : 전체 라운드의 진행을 담당 GameSettings : 자동차 경주 게임의 설정값 Car : 자동차 객체 InputView : 사용자의 입력을 받음 ResultView : 결과를 출력

🚀 4단계 - 자동차 경주(우승자)

기능 요구사항

  • 각 자동차에 이름을 부여할 수 있다. 자동차 이름은 5자를 초과할 수 없다.
  • 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
  • 자동차 이름은 쉼표(,)를 기준으로 구분한다.
  • 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한명 이상일 수 있다.

구현 TODO 목록

  1. 자동차 이름 기능

    • Car 클래스에 이름 필드 추가
    • 이름 유효성 검사 (5자 초과 불가)
    • Car 생성자에 이름 파라미터 추가
    • CarTest에 이름 관련 테스트 추가
      • 이름이 5자를 초과하면 예외 발생
      • 유효한 이름으로 생성 가능
  2. 자동차 이름 출력

    • ResultView 수정
      • 자동차 이름과 위치를 함께 출력하는 형식 변경
      • presentCars 메소드 파라미터 수정 (이름 정보 추가)
    • Race 클래스 수정
      • getCarPositions 메소드를 getCarStatus로 변경
      • 자동차 이름과 위치를 함께 반환하도록 수정
  3. 자동차 이름 입력

    • InputView 수정
      • 자동차 이름 입력 메소드 추가
      • 쉼표로 구분된 이름 문자열 파싱 로직 추가
    • GameSettings 수정
      • 자동차 이름 목록 필드 추가
      • 생성자 수정
  4. 우승자 판정

    • Race 클래스에 우승자 판정 로직 추가
      • getWinners 메소드 추가
      • 가장 멀리 간 자동차들 찾기
    • ResultView에 우승자 출력 메소드 추가
    • Game 클래스 수정
      • 경주 종료 후 우승자 출력 로직 추가

개발 구조

  • Game: 게임의 전체 생명주기 관리 및 사용자 인터랙션 조정
  • Race: 경주 진행 상태 관리, 자동차 이동 처리, 우승자 판정
  • GameSettings: 게임 설정값(자동차 이름, 라운드 수) 검증 및 관리
  • Car: 자동차의 기본 속성(이름, 위치) 관리
  • InputView: 사용자 입력 처리 및 검증
  • ResultView: 게임 진행 상태 및 결과 출력
  • CarStatus: 자동차의 현재 상태를 불변 객체로 표현
  • MoveStrategy: 자동차 이동 전략 정의 (RandomMoveStrategy, FixedMoveStrategy)

프로그래밍 요구사항

  • indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
    • 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
    • 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
  • 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
    • 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.
  • 모든 로직에 단위 테스트를 구현한다. 단, UI(System.out, System.in) 로직은 제외
    • 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
    • UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
  • 자바 코드 컨벤션을 지키면서 프로그래밍한다.
  • else 예약어를 쓰지 않는다.
    • 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
    • else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.