[Project] 숫자 야구 게임 ③

JJOOEE__·2024년 6월 16일
0

Today I Learned....

목록 보기
9/19
post-thumbnail

💡 월요일 제출 전까지 해야 할일


  • 시도 횟수 중간 맨 앞자리 0입력시 오류로 출력되는 부분 수정하기!
  • 변수명과 함수명 변경하여 이해도 높이기
  • 간결한 표현식으로 변경하여 가독성 향상 필요
  • 함수와 클래스 활용도 개선 , 중복 코드 제거 (필요하다면 swift파일 분리)
  • 주석 정리 : 코드 목적 설명 및 함수/변수 역할 명시 필요

1️⃣ 변수명과 함수명 변경하여 이해도 높이기

👉 필요하다고 생각한 이유 :

  • 내가 설정한 변수명, 함수명 인데 딱 봤을 때, 어떤 함수인지 변수인지 알 수 없음.

👉 수정

  • numSet > userNumSet : 어떤 숫자집합인지 한눈에 알아보기가 어려웠던 것을 유저숫자 집합임을 좀 더 명확히 명시해 줌

  • clcStrikeAndBall > checkStrikeBall로 변경


2️⃣ 간결한 표현식으로 변경하여 가독성 향상 필요

👉 필요하다고 생각한 이유 :

  • 조건문 설정 시 연산자를 통해 반복을 사용하지 않고 간소화 할 수 있는 부분이 많았는데 연산자 공부가 필요하다고 생각함!!!!!!!!

👉 수정

  • isValidNumber 함수 guard문 사용하여 수정
    • if 문을 gurad문으로 수정함
  • func makeAnswerNum() 수정
    • 조금 더 간결한 표현식을 통해 가시성이 좋아짐
    1. 초기에 첫 번째 숫자를 선택할 때, 0을 제외하고 1에서 9 사이의 값을 먼저 선택하도록 변경 > 첫 번째 숫자가 비어 있거나 0이 되는 경우를 검사할 필요 없어짐
    2. 첫 번째 숫자 비어있는 경우 조건문 필요 없어 짐 > 반복문에서 numbers.isEmpty를 검사하는 부분을 제거
    3. while 루프 내에서는 단순히 새로운 랜덤 숫자를 생성, 이 숫자가 배열에 포함되어 있지 않은 경우에만 추가하도록 변경

3️⃣ 함수와 클래스 활용도 개선 , 중복 코드 제거 (필요하다면 swift파일 분리)

👉 수정

  • class GameManage
    • func gameStart(), func recordView(), func exitGame(), func mainMenu() 게임의 진행과 관리를 담당하는 부분
class GameManage {
    var records = [Int]()   // 각 게임의 시도 횟수를 저장하는 배열
    let baseballGame = BaseballGame()  // BaseballGame 인스턴스 생성

    func gameStart() { 				// 게임 시작 시 정답 숫자 생성
        baseballGame.startNewGame() 

        print("< 게임을 시작합니다 >")
        gameLoop: while true {
            print("숫자를 입력하세요 : ", terminator: "")
            if let input = readLine(), let userNum = Int(input) {
            //생략
            }
    
    func recordView() { 				// 게임 기록 보기 함수
        if records.isEmpty {
          //생략
}
    func exitGame() {
        print("< 숫자 야구 게임을 종료합니다 >")
    }

    func mainMenu() {
        while true {
            print("환영합니다, 원하는 번호를 선택하세요!")
            print("1. 게임 시작     2. 기록 보기    3. 게임 종료")
			//생략
}
}
  • class BaseballGame
    • func startNewGame(), func makeAnswerNum(), func isValidNumber, func checkStrikeBall.... 숫자 야구 게임의 핵심 로직을 담당
class BaseballGame {
    var tries = 0   // 현재 게임의 시도 횟수를 기록할 변수
    var answerNum: [Int] = []  // 정답 숫자를 저장할 배열

    // 게임 시작 시 정답 숫자를 생성하는 메서드
    func startNewGame() {
        answerNum = makeAnswerNum()
//        print("정답 숫자: \(answerNum)")  정답 디버깅
    }

    // 정답 숫자 생성 메서드
    private func makeAnswerNum() -> [Int] {
        var numbers = [Int]()
        // 첫 번째 숫자는 1에서 9 사이의 값으로 선택
        numbers.append(Int.random(in: 1...9))

        while numbers.count < 3 {
            let randomNum = Int.random(in: 0...9)

            if !numbers.contains(randomNum) {
                numbers.append(randomNum)
            }
        }

        return numbers
    }


    func isValidNumber(userNum: Int) -> Bool {
        let userNumStr = String(userNum)

        // 세 자리 숫자를 입력했는지 확인
        guard userNumStr.count == 3 else {
            print("세 자리 수를 입력해주세요.")
            tries += 1
            return false
        }

        let userNumSet = Set(userNumStr)
        guard userNumSet.count == 3 else {
            print("특정 숫자가 반복 사용되었습니다. 다시 입력해주세요.")
            tries += 1
            return false
        }
        return true
    }

    //스트라이크 볼 체크 함수
    func checkStrikeBall(userNum: Int) -> (strike: Int, ball: Int)? {
        guard isValidNumber(userNum: userNum) else {
            return nil
        }

        let userNumArray = Array(String(userNum)).compactMap { Int(String($0)) }
        var strike = 0
        var ball = 0
        //숫자 자리 일치 > strike, 숫자만 일치 > ball
        for (index, digit) in userNumArray.enumerated() {
            if answerNum[index] == digit {
                strike += 1
            } else if answerNum.contains(digit) {
                ball += 1
            }
        }
        tries += 1
        return (strike, ball)
    }
}

4️⃣ 오류횟수를 시도 횟수에 포함 하지 않음

중복숫자 또는 잘못된 입력값을 넣은 횟수는 시도 횟수에 포함하지 않는 오류

👉 수정

func isValidNumber(userNum: Int) -> Bool {
        let userNumStr = String(userNum)

        // 세 자리 숫자를 입력했는지 확인
        guard userNumStr.count == 3 else {
            print("세 자리 수를 입력해주세요.")
            tries += 1
            return false
        }

        let userNumSet = Set(userNumStr)
        guard userNumSet.count == 3 else {
            print("특정 숫자가 반복 사용되었습니다. 다시 입력해주세요.")
            tries += 1
            return false
        }
        return true
    }

잘못된 입력값 조건문에도 tries += 1를 추가하여 시도횟수에 추가되도록 수정함

profile
개발이 어려운 나를 위한... 개발노트

0개의 댓글