본캠프 3주차 목요일 TIL

호씨·2024년 11월 7일
0

금일은 남은 숫자야구 문제 및 만들면서 겪은 트러블 슈팅을 정리해볼려고 한다.

1. lv6.3번 종료하기의 경우 프로그램이 종료시키기

  • 이전의 게임 기록들 초기화시키기
  • 1, 2, 3 이외의 값에 오류메시지 보여주기

이렇게 기능구현을 했다.

먼저 해당 코드내용은 아래와 같다.

import Foundation

/// 게임 기록을 저장하는 구조체
struct GameRecord {
    let attempts: Int
}

/// 게임의 전체 기록을 관리하는 클래스
class GameHistory {
    private var records: [GameRecord] = []
    
    /// 새로운 게임 기록 추가
    func addRecord(attempts: Int) {
        records.append(GameRecord(attempts: attempts))
    }
    
    /// 모든 게임 기록 조회
    func showRecords() {
        if records.isEmpty {
            print("\n아직 게임 기록이 없습니다.")
            return
        }
        
        print("\n< 게임 기록 보기 >")
        for (index, record) in records.enumerated() {
            print("\(index + 1)번째 게임 : 시도 횟수 - \(record.attempts)")
        }
        print()
    }
}

/// 메뉴 옵션을 나타내는 열거형
enum MenuOption: Int {
    case startGame = 1
    case showRecords = 2
    case exit = 3
}

/// 게임 메뉴를 표시하고 사용자 입력을 받는 함수
func showMenu() -> MenuOption? {
    print("\n[ 숫자 야구 게임 ]")
    print("1. 게임 시작하기")
    print("2. 게임 기록 보기")
    print("3. 종료하기")
    print("선택해주세요: ", terminator: "")
    
    guard let input = readLine() else { return nil }
    
    // 입력값이 숫자가 아닌 경우 처리
    guard let number = Int(input) else {
        print("\n잘못된 입력입니다. 1, 2, 3 중에서 선택해주세요.")
        return nil
    }
    
    // 1, 2, 3 이외의 숫자 입력 처리
    guard let option = MenuOption(rawValue: number) else {
        print("\n잘못된 입력입니다. 1, 2, 3 중에서 선택해주세요.")
        return nil
    }
    
    return option
}

/// 숫자야구 게임을 실행하는 메인 함수
func playGame() -> Int? {
    print("\n게임을 시작합니다.")
    print("서로 다른 3자리 숫자를 맞혀보세요.")
    
    let game = BaseballGame()
    
    // 정답 확인하기 (테스트용) 추후 삭제예정
    print("정답: \(game.getTargetNumber())")
    
    while true {
        print("\n3자리 숫자를 입력하세요: ", terminator: "")
        guard let input = readLine() else { continue }
        
        let result = game.makeGuess(input)
        
        switch result {
        case .invalidInput:
            print("올바른 3자리 숫자를 입력해주세요. (중복되지 않은 숫자)")
            
        case .ongoing(let strikes, let balls):
            if strikes == 0 && balls == 0 {
                print("아웃!")
            } else {
                print("\(strikes)스트라이크 \(balls)볼")
            }
            
        case .gameWon(let attempts):
            print("축하합니다. \(attempts)번 만에 맞추셨습니다.")
            return attempts
        }
    }
}

// 메인 프로그램 실행
let gameHistory = GameHistory()

gameLoop: while true {
    // 메뉴 표시 및 사용자 입력 받기
    guard let option = showMenu() else {
        continue // 잘못된 입력이면 메뉴를 다시 표시
    }
    
    // 선택된 메뉴 실행
    switch option {
    case .startGame:
        // 게임 실행 및 결과 저장
        if let attempts = playGame() {
            gameHistory.addRecord(attempts: attempts)
        }
        
    case .showRecords:
        gameHistory.showRecords()
        
    case .exit:
        print("\n게임을 종료합니다.")
        break gameLoop // gameLoop 레이블을 사용하여 프로그램 종료
    }
}

main.Swift파일에서 showMenu 함수내에 case문 사용을 통해서 1~3 범위 이외의 값이 들어오면 제대로된 숫자를 입력하라고 명시를 시켰다.

2. 트러블 슈팅 및 개발 회고

개인적으로 이번 과제를 하면서 몇번의 위기가 있었었다.

lv1,2같은 경우는 별로 어렵지 않게 만들었었지만 lv5에서 개인적으로 되게 어렵다고 느껴졌었다.

먼저 숫자야구라는걸 처음 알게되어서 알아볼려고 시간이 좀 걸렸었는데 시간이 가장 많이 걸렸던게 시도횟수를 쌓는 방법을 생각하고 구현하는데 되게 많은 시간을 소모했었다.

잘못된 시도횟수도 같이 올라가서 당황했었지만 잘못된 시도횟수는 별개로 guard문을 통해서 포함되지 않게 막고 올바른 시도만 들어오게 할려고 개인적으로 시간을 많이 소비했다.

그리고 항상 깃이 매순간마다 나에게는 말썽인지라 또 새로운 오류로 인해서 기능이 작동을 안해서 스트레스를 많이 받았다.

hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint:   git config pull.rebase false  # merge
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.

이렇게 오류가 발생했었었는데 찾아보니까 git 2.27버전부터 새로 바뀐 깃 pull정책이라서 이렇게 뜬다고 들었었다. 이거를 해결하랴, 원리도 파악하랴 시간도 많이 걸렸지만 제대로된 해결법이나 솔루션을 마땅히 제시하는 정보는 딱히 없어서 시간이 걸렸지만 다행히도 상세하게 설명과 각 방법에 대한 특징을 정리해준 블로그가 있어서 링크를 남긴다.

출처 : https://eocoding.tistory.com/108

해당 내용을 다 만들고 정리하기에는 시간이 걸려서 출처를 남긴다.

이번에 만들어보기는 했지만 상당히 스트레스도 많이받고 몸살에 걸려서 제대로 집중도 못한것같지만 어찌저찌 제한시간안에 다 만든것 같아서 다행이기도 하지만 많이 부족하다는걸 깨달은 한주였다.

다음주 다른 수업을 나가기전에 주말에도 따로 공부를하며 준비해야할것같다.

profile
이것저것 많이 해보고싶은 사람

0개의 댓글