본문 바로가기

iOS 앱 개발자 프로젝트/개인 프로젝트

[Project] 숫자 야구 게임 만들기 (Lv2)

전체 프로젝트 내용 중,

레벨 2 도전 .. 


 

 

#1)  if문을 사용한 코드

struct BaseballGame {
    func start() {
        let answer = makeAnswer() // 정답을 만드는 함수 호출
        
        while true {
            print("세 자리 숫자를 입력하세요:", terminator: " ") // 유저에게 입력값을 받는 안내 메시지 출력
            
            if let input = readLine() {
                if let number = Int(input) {
                    if input.count == 3 {
                        let digits = String(number).compactMap { Int(String($0)) } // 입력값을 각 자리 숫자로 분리하여 배열로 저장
                        
                        if digits.count == 3, Set(digits).count == 3 {
                            var strike = 0
                            var ball = 0
                            
                            for (index, digit) in digits.enumerated() { // 입력값과 정답을 비교하여 스트라이크와 볼 계산
                                if digit == answer[index] {
                                    strike += 1
                                } else if answer.contains(digit) {
                                    ball += 1
                                }
                            }
                            
                            if strike == 3 { // 정답일 경우 게임 종료
                                print("정답입니다!")
                                break
                            } else {
                                print("\(strike)스트라이크 \(ball)볼") // 스트라이크와 볼 출력
                            }
                        } else {
                            print("올바르지 않은 입력값입니다.")
                        }
                    } else {
                        print("세 자리 숫자를 입력하세요.")
                    }
                } else {
                    print("유효하지 않은 입력입니다.")
                }
            }
        }
    }
    
    private func makeAnswer() -> [Int] {
        var digits = [Int]()
        
        while digits.count < 3 {
            let digit = Int.random(in: 1...9) // 1부터 9까지의 난수 생성
            if !digits.contains(digit) { // 중복된 숫자가 없을 때만 추가
                digits.append(digit)
            }
        }
        
        return digits
    }
}

let game = BaseballGame()
game.start()

 

 

#2)  guard 문을 사용한 경우 

struct BaseballGame {
    func start() {
        let answer = makeAnswer() // 정답을 만드는 함수 호출
        
        while true {
            print("세 자리 숫자를 입력하세요:", terminator: " ") // 유저에게 입력값을 받는 안내 메시지 출력
            
            guard let input = readLine() else { // 입력값이 nil인 경우 반복문 처음으로 돌아가기
                continue
            }
            
            guard let number = Int(input) else { // 정수로 변환되지 않는 경우 반복문 처음으로 돌아가기
                print("유효하지 않은 입력입니다.")
                continue
            }
            
            guard input.count == 3 else { // 세 자리가 아닌 경우 반복문 처음으로 돌아가기
                print("세 자리 숫자를 입력하세요.")
                continue
            }
            
            let digits = String(number).compactMap { Int(String($0)) } // 입력값을 각 자리 숫자로 분리하여 배열로 저장
            
            guard digits.count == 3, Set(digits).count == 3 else { // 숫자가 세 개가 아니거나, 중복된 숫자가 있는 경우 반복문 처음으로 돌아가기
                print("올바르지 않은 입력값입니다.")
                continue
            }
            
            var strike = 0
            var ball = 0
            
            for (index, digit) in digits.enumerated() { // 입력값과 정답을 비교하여 스트라이크와 볼 계산
                if digit == answer[index] {
                    strike += 1
                } else if answer.contains(digit) {
                    ball += 1
                }
            }
            
            if strike == 3 { // 정답일 경우 게임 종료
                print("정답입니다!")
                break
            } else {
                print("\(strike)스트라이크 \(ball)볼") // 스트라이크와 볼 출력
            }
        }
    }
    
    private func makeAnswer() -> [Int] {
        var digits = [Int]()
        
        while digits.count < 3 {
            let digit = Int.random(in: 1...9) // 1부터 9까지의 난수 생성
            if !digits.contains(digit) { // 중복된 숫자가 없을 때만 추가
                digits.append(digit)
            }
        }
        
        return digits
    }
}

let game = BaseballGame()
game.start()

 

guard 문은 주어진 조건이 false일 경우, 해당 블록 내에서 실행되며, 일반적으로 오류 처리 및 예외 상황을 다룰 때 사용된다.

BaseballGame struct의 start() 메서드에서 guard 문은 입력값의 유효성을 검사하고, 유효하지 않을 경우 다음 반복으로 넘어간다.

 

#1.

guard let input = readLine() else { continue }: readLine() 함수를 통해 유저의 입력을 받는다. 만약 입력값이 nil이라면, 즉 유저가 아무 입력도 하지 않았거나 입력을 받을 수 없는 상황이라면 continue를 통해 반복문의 처음으로 돌아간다.

 

#2.

guard let number = Int(input) else { print("유효하지 않은 입력입니다."); continue }: 입력값을 정수로 변환한다. 변환에 실패하면 nil이 반환되므로, 유효하지 않은 입력이라고 판단하고 오류 메시지를 출력한 뒤 continue를 통해 반복문의 처음으로 돌아간다.

 

#3.

guard input.count == 3 else { print("세 자리 숫자를 입력하세요."); continue }: 입력값의 길이가 3이 아니라면, 즉 세 자리 숫자가 아니라면 오류 메시지를 출력하고 continue를 통해 반복문의 처음으로 돌아간다.

 

#4.

guard digits.count == 3, Set(digits).count == 3 else { print("올바르지 않은 입력값입니다."); continue }: 입력값을 각 자리 숫자로 분리한 digits 배열의 길이가 3이 아니거나, 중복된 숫자가 있는 경우 오류 메시지를 출력하고 continue를 통해 반복문의 처음으로 돌아간다.