기존의 숫자 야구 게임에 기록 관리 기능을 추가했다. 게임이 끝날 때마다 시도 횟수를 저장하고, 사용자가 요청할 경우 게임 기록을 볼 수 있는 기능을 구현했다. 이를 위해 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 클래스를 따로 분리하여 게임 로직과 기록 관리를 독립적으로 유지할 수 있었다. 이로 인해 코드의 가독성과 유지보수성이 높아졌다.
어려웠던 점
입력 검증 로직: 사용자의 입력이 올바른 세 자리 숫자인지 확인하는 부분에서 검증 조건을 완벽하게 처리하는 것이 어려웠다.
메뉴 시스템 구현: 게임 시작, 기록 보기, 종료 등 다양한 기능을 하나의 루프에서 처리하는 로직을 구성하는 데 고민이 필요했다.