24.06.17 Today I Learned

2024. 6. 17. 20:58

짝수의 합 풀이


숫자 야구 게임 만들기 Lv.6 까지!!

randomNumberGenerator.swift


import Foundation

// 임의의 세 자리 숫자를 생성하는 클래스
class RandomNumberGenerator {
    
    // 세 자리 랜덤 숫자 생성 메서드
    func generateRandomNumber() -> String {
        var randomnumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        randomnumbers.shuffle() // 숫자 배열을 무작위로 섞음
        
        var result = "" // result 문자열 초기화
        for i in 0..<3 { // 세자리 숫자를 생성하기 위해 0 ~ 2까지 반복
            result.append(String(describing: randomnumbers[i]))
            // String(describing:)으로 number[i]의 값을 문자열로 변환
            // result라는 문자열을 담고있는 배열을 만듦
        }
        
        return result // 세 자리 랜덤 숫자 문자열 반환
    }
}

 

gameProgress.swift

import Foundation

// 게임 로직을 처리하는 클래스
class gameProgress {
    
    // 스트라이크와 볼을 계산하는 메서드
    func calculateStrikeAndBall(guess: String, answer: String) -> (strike: Int, ball: Int) {
        var strike = 0 // 스트라이크 개수 초기화
        var ball = 0   // 볼 개수 초기화
        
        let guess = Array(guess)   // 추측한 숫자를 문자 배열로 변환
        let answer = Array(answer) // 정답 숫자를 문자 배열로 변환
        
        // 각 자리 숫자를 비교하여 스트라이크와 볼 개수 계산
        for i in 0..<guess.count {
            if guess[i] == answer[i] {
                strike += 1 // 위치와 값이 모두 일치하면 스트라이크 증가
            } else if answer.contains(guess[i]) {
                ball += 1   // 값은 일치하지만 위치가 다르면 볼 증가
            } 
        }
        
        return (strike, ball) // 스트라이크와 볼 개수를 튜플로 반환? return
    }
}

 

userInput.swift

import Foundation

// 사용자 입력을 관리하는 클래스
class userInput {
    
    // 사용자로부터 세 자리 숫자 입력받기
    func getUserInput() -> String? {
        print("세 자리 숫자를 입력하세요: ", terminator: "") // 사용자에게 입력 요구 메시지 출력
        return readLine() // 사용자 입력을 문자열로 반환
    }
}

 

main.swift

import Foundation

// 게임을 진행하는 함수
func playGame() -> (result: String, attempts: Int) {// playGame이라는 함수를 만듦
    let randomNumberGenerator = RandomNumberGenerator() // 랜덤숫자 생성 변수 생성
    let gameLogic = gameProgress() // 게임 로직 처리 변수 생성
    let inputManager = userInput() // 유저 입력 관리 변수 생성
    
    let answer = randomNumberGenerator.generateRandomNumber() // 정답 생성
    var attempts = 0 // 시도 횟수 초기화
    let maxAttempts = 9 // 최대 시도 횟수
    
    print("게임을 시작합니다. 세 자리 숫자를 맞춰보세요.") // 게임 시작 메시지 출력
    
    while attempts < maxAttempts { // 시도 횟수가 최대 시도 횟수보다 적을 동안 반복
            // 사용자로부터 추측 숫자를 입력받음
            if let input = inputManager.getUserInput(), input.count == 3, let _ = Int(input) {
                attempts += 1 // 유효한 입력이 들어왔을 때만 시도 횟수 증가
                let (strike, ball) = gameLogic.calculateStrikeAndBall(guess: input, answer: answer) // 스트라이크와 볼 계산
                
                // 결과 출력
                if strike == 0 && ball == 0 {
                    print("\(attempts)회차: Out") // 스트라이크와 볼이 모두 0인 경우 Out 출력
                } else {
                    print("\(attempts)회차: \(strike) 스트라이크, \(ball) 볼")
                }
                
                // 정답 여부 확인
                if strike == 3 {
                    print("성공. \(attempts)번 만에 맞추셨습니다.") // 정답 메시지 출력
                    return ("정답: \(answer)", attempts) // 게임 기록 반환
                }
            } else {
                print("잘못된 입력입니다. 세 자리 숫자를 입력하세요.") // 유효하지 않은 입력에 대한 오류 메시지 출력
            }
        }
        
        // 최대 시도 횟수를 넘기면 게임 종료 메시지 출력
        print("실패. 최대 시도 횟수를 초과하였습니다. 정답은 \(answer)입니다.")
        return ("정답: \(answer)", maxAttempts) // 게임 기록 반환
    }

    // 게임 기록을 저장하는 배열
    var gameRecords: [(result: String, attempts: Int)] = []

    // 메인 메뉴를 표시하고 선택에 따라 동작을 수행하는 함수
    func mainMenu() {
        while true {
            print("환영합니다! 원하시는 번호를 입력해주세요") // 메인 메뉴 메시지 출력
            print("1. 게임 시작하기  2. 게임 기록 보기  3. 종료하기") // 선택 옵션 표시
            
            if let choice = readLine(), let option = Int(choice) {
                switch option {
                case 1:
                    let (result, attempts) = playGame() // 게임 시작하기
                    gameRecords.append((result, attempts)) // 게임 기록 추가
                case 2:
                    print("게임 기록:") // 게임 기록 보기
                    for (index, record) in gameRecords.enumerated() {
                        print("\(index + 1)회차: \(record.result), 시도 횟수: \(record.attempts)회")
                    }
                case 3:
                    print("게임을 종료합니다.") // 종료 메시지
                    return
                default:
                    print("잘못된 선택입니다. 다시 입력해주세요.") // 잘못된 입력에 대한 오류 메시지
                }
            } else {
                print("잘못된 입력입니다. 숫자를 입력해주세요.") // 유효하지 않은 입력에 대한 오류 메시지
            }
        }
    }

    // 프로그램 시작
    mainMenu() // 메인 메뉴 실행

 

'Today I Learned > 2024' 카테고리의 다른 글

24.06.19 Today I Learned  (0) 2024.06.19
24.06.18 Today I Learned  (0) 2024.06.18
24.06.14 Today I Learned  (1) 2024.06.14
24.06.12 Today I Learned  (0) 2024.06.13
24.06.11 Today I Learned  (0) 2024.06.11

BELATED ARTICLES

more