Swift로 야구 게임 만들기 (2)

버질·2024년 11월 4일

기존의 숫자 야구 게임에 기록 관리 기능을 추가했다. 게임이 끝날 때마다 시도 횟수를 저장하고, 사용자가 요청할 경우 게임 기록을 볼 수 있는 기능을 구현했다. 이를 위해 RecordManager 클래스를 생성해 게임 기록을 관리하고 BaseballGame 클래스와 연동시켰다.

코드 설명

BaseballGame 클래스

이 클래스는 게임의 전반적인 로직을 관리한다.
recordManager: RecordManager 클래스의 인스턴스를 생성해 게임 기록을 저장하고 보여주는 기능을 수행한다.
start() 메서드: 게임 시작 메뉴를 제공하며, 사용자의 입력에 따라 게임을 시작하거나 기록을 확인할 수 있다.

class BaseballGame {
    private var recordManager = RecordManager() // 게임 기록을 관리하는 인스턴스
    
    func start() {
        var isRunning = true
        
        while isRunning {
            print("""
            환영합니다! 원하시는 번호를 입력해주세요
            1. 게임 시작하기  2. 게임 기록 보기  3. 종료하기
            """)
            
            guard let input = readLine(), let choice = Int(input) else {
                print("올바른 숫자를 입력해주세요!")
                continue
            }
            
            switch choice {
            case 1:
                playGame()
            case 2:
                recordManager.showRecords()
            case 3:
                print("< 숫자 야구 게임을 종료합니다 >")
                isRunning = false
            default:
                print("올바른 숫자를 입력해주세요!")
            }
        }
    }

게임 플레이 로직 (playGame())

makeAnswer()를 호출해 중복 없는 세 자리 정답을 생성한다.
사용자의 입력값을 받아 유효성을 검사하고, 조건에 맞는 경우 정답과 비교해 스트라이크와 볼의 수를 반환한다.
정답을 맞췄을 때 시도 횟수를 recordManager에 저장하고 게임을 종료한다.

private func playGame() {
    let answer = makeAnswer() // 정답을 생성
    var attempts = 0
    
    print("< 게임을 시작합니다! >")
    
    while true {
        print("세 자리 숫자를 입력하세요:")
        
        if let input = readLine() {
            let guess = Array(input).compactMap { $0.wholeNumberValue }
            
            if guess.count != 3 || Set(guess).count != 3 || guess.contains(0) {
                print("올바르지 않은 입력값입니다")
                continue
            }
            
            attempts += 1
            let (strikes, balls) = compareGuess(answer, guess)
            
            if strikes == 3 {
                print("정답입니다!")
                print("시도 횟수: \(attempts)")
                recordManager.add(trialCount: attempts)
                break
            } else {
                print("\(strikes)스트라이크 \(balls)볼")
            }
        } else {
            print("올바르지 않은 입력값입니다")
        }
    }
}

RecordManager 클래스

records 배열에 각 게임의 시도 횟수를 저장한다.
add(trialCount:) 메서드: 게임의 시도 횟수를 records에 추가한다.
showRecords() 메서드: 기록을 출력하며, 기록이 없을 경우 안내 메시지를 보여준다.

class RecordManager {
    private var records: [Int] = []
    
    func add(trialCount: Int) {
        records.append(trialCount)
    }
    
    func showRecords() {
        print("< 게임 기록 보기 >")
        if records.isEmpty {
            print("아직 기록이 없습니다.")
        } else {
            for (index, record) in records.enumerated() {
                print("\(index + 1)번째 게임: 시도 횟수 - \(record)")
            }
        }
    }
}

기록 관리의 중요성: 게임에 기록 관리 기능을 추가함으로써 게임의 지속성과 사용자 경험을 높일 수 있다는 것을 배웠다. 특히, 사용자가 자신의 기록을 확인하고 성취감을 느낄 수 있게 했다.

클래스 분리의 장점: RecordManager 클래스를 따로 분리하여 게임 로직과 기록 관리를 독립적으로 유지할 수 있었다. 이로 인해 코드의 가독성과 유지보수성이 높아졌다.
어려웠던 점

입력 검증 로직: 사용자의 입력이 올바른 세 자리 숫자인지 확인하는 부분에서 검증 조건을 완벽하게 처리하는 것이 어려웠다.
메뉴 시스템 구현: 게임 시작, 기록 보기, 종료 등 다양한 기능을 하나의 루프에서 처리하는 로직을 구성하는 데 고민이 필요했다.

profile
iOS Developer · SwiftUI & UIKit '가끔 되고 가끔 안 되는' 문제를 뿌리부터 잡습니다.

0개의 댓글