1주차 마무리 전, 임시 타이틀

별하 (vi_wolhwa)·2023년 10월 20일
0

Title : 우아한테크코스 6기 FE 프리코스 1주차 : 숫자야구
Tag : 우아한테크코스


Lv1. Requirement Analysis

Input

  • 정답입력 유효성 검사 : 서로 다른 3자리 수
  • 재시작 유효성 검사 : 1 또는 2
  • 모든 Input 예외에 대하여 예외 발생 후 프로그램 종료

Output

  • 안내메시지
    • 게임 시작 메시지 : "숫자 야구 게임을 시작합니다."
    • 추측 요청 메시지 : "숫자를 입력해주세요 : "
    • 게임 종료 메시지 : "3개의 숫자를 모두 맞히셨습니다! 게임 종료"
    • 재시작 안내 메시지 : "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."
  • 피드백 : 실제 정답과 사용자의 추측에 대한 피드백
    • 둘 다 있는 경우 : "${n}볼 ${n}스트라이크"
    • 하나만 있는 경우 : "${n}볼" 또는 "${n}스트라이크"
    • 하나도 없는 경우 : "낫싱"
  • 예외 발생 : "[ERROR] ${context}" 형식으로 출력


Game

  • 임의 정답 생성 : 게임 시작 시 3자리 난수 생성
  • 추측 입력
    • 추측 요청 메시지 출력
  • 피드백
    • 피드백 생성 : 실제 정답과 사용자의 추측을 대조
    • 피드백 출력
  • 재시작
    • 재시작 안내 메시지 출력
    • 사용자 입력 : 1(재시작), 2(종료)


Answer

  • 유효성검사
    • 사용자 추측 유효성 검사 : 중복없는 3자리의 숫자로 구성
    • 유효성 검사 실패 : 예외 발생 및 메시지 출력

  • 정답 대조 : 정답과 추측을 대조
    • Balls : Value만 일치하고 Index가 불일치하는 숫자의 수
    • Strikes : Value와 Index가 모두 일치하는 숫자의 수


Additional

  • 정답 길이 변경 : 정답의 길이를 변수에 저장하여 사용
  • 예외처리 세분화 : 길이/타입/중복 에러로 분리
  • 추측/피드백 히스토리 : 과거 사용자 추측과 피드백을 배열로 관리 및 호출 가능
  • 개발자 관점에서 모든 예외 발생 가능 상황에 대한 처리



Lv2. Design

🕹️ GameManager

프로그램의 전체적인 흐름을 처리하는 클래스


variables

  • bool isPlaying = True : 게임 시작 조건
  • Board board : 게임판

functions

  • play () : 프로그램 실행
    • while (isPlaying)
      • this.startGame() : 게임 시작
      • this.playGame() : 게임 진행
      • this.finishGame() : 게임 종료

  • startGame () : 게임 시작
    • Message.START : 게임 시작 메시지
    • this.board = new Board() : 새로운 게임판 생성

  • playGame () : 게임 진행
    • Message.REQUEST : 추측 요청 메시지
    • board.getUserGuess() : 추측 입력
    • board.checkUserGuess() : 정답 확인
    • board.printFeedback() : 피드백 출력

  • finishGame () : 게임 종료
    • Message.FINISH : 게임종료 메시지
    • isPlaying = this.willReplay() : 재경기 여부 확인

  • bool willReplay () : 재경기 선택
    • Message.REPLAY : 재경기 안내 메시지
    • return userInput : 사용자입력 [True(1) | False(2) | Except]


🎮 Board

게임의 진행을 담당하는 클래스


Members

  • Number LENGTH = 3 : 정답 길이
  • Number answer : 실제 정답
  • Number guess : 사용자 예측
  • Feedback feedback : 예측에 대한 피드백

Functions

  • constructor () : 생성자
    • setAnswer() : 임의 정답 생성

  • setAnswer () : 임의 정답 생성
    • this.answer = new Number(LENGTH)

  • getUserGuess () : 추측 입력
    • this.guess = new Number(LENGTH, value)

  • checkUserGuess () : 피드백 생성
    • [balls, strikes] = answer.compare(guess)
    • this.feedback = new Feedback(balls, strikes)

  • printFeedback () : 피드백 출력
    • feedback.print()


🎱 Number

숫자의 조합을 저장하고 유효성 검사를 수행하는 클래스


Members

  • DATA_TYPE_REGEX = /^[1-9]+$/ : 정규식 (타입)
  • NO_DUPLICATES_REGEX = /^([a-zA-Z0-9])\1*$/ : 정규식 (중복)
  • Number length : 정답 길이
  • String value : 현재 객체의 값

Functions

  • constructor (Number length, String value = null) : 생성자
    • this.length = length : 정답 길이 초기화
    • value === null : 임의 정답 객체 생성
      • this.value = getRandomValue()
    • value !== null : 사용자 추측 객체 생성
      • this.validate(value) : 유효성 검사
      • this.value = value

  • String getRandomValue () : 입의 정답 객체 생성

  • validate (String value) : 유효성 검사
    • this.checkLength(value) : 길이 검사
    • this.checkDataType(value) : 타입 검사
    • this.checkDuplicate(value) : 중복 검사

  • checkLength (String value) : 길이 검사
    • if(!LENGTH_REGEX.test(value)) : 예외 처리
      • Message.ERROR_INPUT_LENGTH : 길이 에러메시지

  • checkDataType (String value) : 타입 검사
    • if(!DATA_TYPE_REGEX.test(value)) : 예외 처리
      • Message.ERROR_INPUT_DATA_TYPE : 타입 에러메시지

  • checkDuplicate (String value) : 중복 검사
    • if(!NO_DUPLICATES_REGEX.test(value)) : 예외 처리
      • Message.ERROR_INPUT_DUPLICATE : 중복 에러메시지

  • Array compare (Number target) : value와 target을 비교하여 [balls, strikes] 반환
    • balls = countBalls(target)
    • strikes = countStrikes(target)
    • return [balls, strikes]

  • Number countBalls (Number target) : 볼 카운팅

  • Number countBalls (Number target) : 스트라이크 카운팅


📋 Feedback

하나의 회차에 대한 피드백을 처리하는 클래스


Members

  • Number balls
  • Number strikes

Functions

  • constructor (Number balls, Number Strikes) : 생성자
    • this.balls = balls
    • this.strikes = strikes

  • print () : 피드백 출력
    • ${this.balls}${Message.BALL} ${this.strikes}${Message.STRIKE}


💬 Message

프로그램에서 사용되는 문자열을 포장, 관리하는 클래스


Members

  • EMPTY : ""
  • START : "숫자 야구 게임을 시작합니다."
  • FINISH : "3개의 숫자를 모두 맞히셨습니다! 게임 종료"
  • REPLAY : "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."
  • REQUEST : "숫자를 입력해주세요 : "
  • BALL : "볼"
  • STRIKE : "스트라이크"
  • NOTHING : "낫싱"
  • ERROR_INPUT_LENGTH : "[ERROR] 문자열 길이 불일치"
  • ERROR_INPUT_DATA_TYPE : "[ERROR] 문자열 타입 불일치"
  • ERROR_INPUT_DUPLICATE : "[ERROR] 문자열 중복 발생"



Lv3. Development

  • 게임 종료 메시지와 재경기 메시지 분리
  • Replay 방법 : 재귀호출 대신 isPlaying 변수
  • 유효성검사 생성자에서 수행

  • let 자료형
  • var, let, const의 차이점
  • bool 변수명 규칙
  • input 방법
  • 함수 선언 방법 일반 vs 화살표
  • 예외처리방법
  • 문자열 연결 방법 차이

0개의 댓글