우아한 테크코스[5기] 프리코스 4주차

지종권(JiJongKwon)·2022년 11월 28일

🚀 기능 요구 사항

위아래 둘 중 하나의 칸만 건널 수 있는 다리를 끝까지 건너가는 게임이다.

  • 위아래 두 칸으로 이루어진 다리를 건너야 한다.
    • 다리는 왼쪽에서 오른쪽으로 건너야 한다.
    • 위아래 둘 중 하나의 칸만 건널 수 있다.
  • 다리의 길이를 숫자로 입력받고 생성한다.
    • 다리를 생성할 때 위 칸과 아래 칸 중 건널 수 있는 칸은 0과 1 중 무작위 값을 이용해서 정한다.
    • 위 칸을 건널 수 있는 경우 U, 아래 칸을 건널 수 있는 경우 D값으로 나타낸다.
    • 무작위 값이 0인 경우 아래 칸, 1인 경우 위 칸이 건널 수 있는 칸이 된다.
  • 다리가 생성되면 플레이어가 이동할 칸을 선택한다.
    • 이동할 때 위 칸은 대문자 U, 아래 칸은 대문자 D를 입력한다.
    • 이동한 칸을 건널 수 있다면 O로 표시한다. 건널 수 없다면 X로 표시한다.
  • 다리를 끝까지 건너면 게임이 종료된다.
  • 다리를 건너다 실패하면 게임을 재시작하거나 종료할 수 있다.
    • 재시작해도 처음에 만든 다리로 재사용한다.
    • 게임 결과의 총 시도한 횟수는 첫 시도를 포함해 게임을 종료할 때까지 시도한 횟수를 나타낸다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
    • Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.

실행 결과 예시

입력

  • 자동으로 생성할 다리 길이를 입력 받는다. 3 이상 20 이하의 숫자를 입력할 수 있으며 올바른 값이 아니면 예외 처리한다.
3
  • 라운드마다 플레이어가 이동할 칸을 입력 받는다. U(위 칸)와 D(아래 칸) 중 하나의 문자를 입력할 수 있으며 올바른 값이 아니면 예외 처리한다.
U
  • 게임 재시작/종료 여부를 입력 받는다. R(재시작)과 Q(종료) 중 하나의 문자를 입력할 수 있으며 올바른 값이 아니면 예외 처리한다.
R

출력

  • 게임 시작 문구
다리 건너기 게임을 시작합니다.
  • 게임 종료 문구
최종 게임 결과
[ O |   |   ]
[   | O | O ]

게임 성공 여부: 성공
총 시도한 횟수: 2
  • 사용자가 이동할 때마다 다리 건너기 결과의 출력 형식은 실행 결과 예시를 참고한다.
    • 이동할 수 있는 칸을 선택한 경우 O 표시
    • 이동할 수 없는 칸을 선택한 경우 X 표시
    • 선택하지 않은 칸은 공백 한 칸으로 표시
    • 다리의 시작은 [, 다리의 끝은 ]으로 표시
    • 다리 칸의 구분은 |(앞뒤 공백 포함) 문자열로 구분
    • 현재까지 건넌 다리를 모두 출력
  • 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.
[ERROR] 다리 길이는 3부터 20 사이의 숫자여야 합니다.

실행 결과 예시

다리 건너기 게임을 시작합니다.

다리의 길이를 입력해주세요.
3

이동할 칸을 선택해주세요. (위: U, 아래: D)
U
[ O ]
[   ]

이동할 칸을 선택해주세요. (위: U, 아래: D)
U
[ O | X ]
[   |   ]

게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)
R
이동할 칸을 선택해주세요. (위: U, 아래: D)
U
[ O ]
[   ]

이동할 칸을 선택해주세요. (위: U, 아래: D)
D
[ O |   ]
[   | O ]

이동할 칸을 선택해주세요. (위: U, 아래: D)
D
[ O |   |   ]
[   | O | O ]

최종 게임 결과
[ O |   |   ]
[   | O | O ]

게임 성공 여부: 성공
총 시도한 횟수: 2
다리 건너기 게임을 시작합니다.

다리의 길이를 입력해주세요.
3

이동할 칸을 선택해주세요. (위: U, 아래: D)
U
[ O ]
[   ]

이동할 칸을 선택해주세요. (위: U, 아래: D)
U
[ O | X ]
[   |   ]

게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)
Q
최종 게임 결과
[ O | X ]
[   |   ]

게임 성공 여부: 실패
총 시도한 횟수: 1

⚾ 회고

README.md

📜 기능목록

정상기능

  • 다리의 길이를 숫자로 입력받고 생성한다.
    • 다리를 생성할 때 위 칸과 아래 칸 중 건널 수 있는 칸은 0과 1 중 무작위 값을 이용해서 정한다.
    • 위 칸을 건널 수 있는 경우 U, 아래 칸을 건널 수 있는 경우 D값으로 나타낸다.
    • 무작위 값이 0인 경우 아래 칸, 1인 경우 위 칸이 건널 수 있는 칸이 된다.
  • 다리가 생성되면 플레이어가 이동할 칸을 선택한다.
    • 이동할 때 위 칸은 대문자 U, 아래 칸은 대문자 D를 입력한다.
    • 이동한 칸을 건널 수 있다면 O로 표시한다. 건널 수 없다면 X로 표시한다.
  • 다리를 끝까지 건너면 게임이 종료된다.
  • 다리를 건너다 실패하면 게임을 재시작하거나 종료할 수 있다.
    • 재시작해도 처음에 만든 다리로 재사용한다.
    • 게임 결과의 총 시도한 횟수는 첫 시도를 포함해 게임을 종료할 때까지 시도한 횟수를 나타낸다.

예외적인 상황

  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
    • 다리 생성시 올바른 값이 아니면 예외 처리한다.
      • 다리길이 입력값은 3 이상 20 이하의 숫자를 입력할 수 있다.
      • 숫자만 입력이 가능하다.
    • 플레이어 이동시, U(위 칸)와 D(아래 칸) 중 하나의 문자를 입력할 수 있으며 올바른 값이 아니면 예외 처리한다.
    • 게임 재시작 및 종료 입력을 받을시, R(재시작)과 Q(종료) 중 하나의 문자를 입력할 수 있으며 올바른 값이 아니면 예외 처리한다.

마지막인 4주차에서는 피드백이 주어지지 않았다.


함수라인

받은 피드백은 함수라인이 10라인을 넘기면 안된다는 요구사항이 있었다.
이번 4주차 미션에서는 10라인을 넘지 않는다가 무척이나 어려웠다.
불필요한 함수를 너무 많이 생성한 것은 아닌가 라는 생각 또한 들었다.

그리고 특히 게임시작이라는 메서드에서 많은 고민을 했다.

public void startGame() {
        while (stage < Integer.parseInt(bridgeSize)) {
            runGame();
            if (checkFail(stage)) {
                if (!retryChoice()) {
                    return;
                }
                clearGame();
            }
        }
        addFinishGameResult();
    }
  1. 다리 크기만큼 게임을 진행하고
  2. 다리 건너기가 성공을 했는지 체크
  3. 선택을 확인하고 r이면 clear()
  4. 게임 결과를 저장한다.

지금 생각해보면 게임 결과는 startgame에 저장하지 않고
endGame이라는 함수에 담는게 더 좋을 거 같다.

그러면 메서드안의 더욱 줄일 수 있을 것 같다.

객체는 객체스럽게 사용한다

이번 과제는 enum type 에 메시지를 꺼낼 때를 제외하고는 getter를 일절 사용하지 않았다. getter를 사용하지 않고 클래스 내부에서 처리해서 그 결과를 알려주는 방식으로 하니, 객체보안이 좋아진 것 같다.


🐟 느낀점

우아한 테크코스 프리코스가 마무리 되었다. 정말 많이 배워가는 시간이었다. git 사용, 함수는 한가지 일만, 하드코딩 피하기, 객체스럽게, ui와 비즈니스 로직분리, 커밋 컨벤션, 변수 이름은 알아 볼 수 있게, enum 사용, test 등을 실제로 해보니 정말 좋았다. 또한 제한사항이 있는 환경에서 코딩을 하지 못하였는데, 이번에 경험하게 되어서 정말 좋았다.

0개의 댓글