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 |